From nobody Sun Jun 14 17:34:12 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0884B3D8138; Fri, 3 Apr 2026 20:59:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.17 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249977; cv=none; b=E6TUxGf/3bsRGfxD75LyA05unD+ld973TaNx4/e4V4nQxEFjHUlWf7t+91Hx6kqGL3S45E2Ps326l2HZJQ8B18Wxln5vBmeSeJ1fNy818rdcu+MsqRNBo2xG2Y4ktADvYSxnEcwCvI2pAOQyhF15EocEccmSr+dCv0vhgE/WGtw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249977; c=relaxed/simple; bh=cbAYPgREboJ2uyzmWxIdJ9NfLngERxBdJQ87WFdMGw8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LGPLrbB/d2Y5yVSYEnhuSFfvQPtPrKHz224fnOyT45Bj+ND7XpEOBPNofZTATwYuqjbpxpnYjGVJ3WIr8j/UxO1sP9pDO81T5AkhfOiRg9j6YLXmPXOwg2Whlu9YJ3dmEfYT8lIt801vU6UDRGRryJz4QF9Yejt0CkXkUxNsaSU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=a0C8Ty0Y; arc=none smtp.client-ip=198.175.65.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="a0C8Ty0Y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1775249976; x=1806785976; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cbAYPgREboJ2uyzmWxIdJ9NfLngERxBdJQ87WFdMGw8=; b=a0C8Ty0YDYjMUxMGzd6zv8z2GWPcdjWYKLgT/qciDYf6b4d/cmGMeVbb 3kuPmO7qj7fgazDRuRw1DQ7/VaQwxr1+Svb0J0Ymyf1wPBFEFJHgyW4N7 CbfIA9U2rF7ltX0zkiWYT52UZsphPfAZxpNqroseog8ydbTzcYfstDy87 8bCfq4cUQBB5HNOHxU6/vqAofmfM1QSU97BW2AHcrt8SuOPYUrQvL8qse aYae5gMbAwZrV1JUtLFH7RzsHWUjyCVXVboruLJQsasI9gs8mveYCw/Xt O/aW/3GsMB1bocC1naTSbq5+x8Ic89lCX5HUjpDzxGFhMLGsY+jQktY8l g==; X-CSE-ConnectionGUID: T+3TJF/4SrKpSy4Fxg4DMQ== X-CSE-MsgGUID: v9eYNGoaS2K+++9q1VLh4g== X-IronPort-AV: E=McAfee;i="6800,10657,11748"; a="76281468" X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="76281468" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2026 13:59:34 -0700 X-CSE-ConnectionGUID: Nn7HNYV3RY2pdI3/GYw01A== X-CSE-MsgGUID: IQ1kWgTsQv+pex2NhXnP5A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="265280477" Received: from dwillia2-desk.jf.intel.com ([10.88.27.145]) by orviesa001.jf.intel.com with ESMTP; 03 Apr 2026 13:59:33 -0700 From: Dan Williams To: dave.jiang@intel.com Cc: linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org, alejandro.lucero-palau@amd.com Subject: [RFC PATCH 1/4] cxl/mem: Add support to cleanly continue after attach Date: Fri, 3 Apr 2026 14:00:47 -0700 Message-ID: <20260403210050.1058650-2-dan.j.williams@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403210050.1058650-1-dan.j.williams@intel.com> References: <20260403210050.1058650-1-dan.j.williams@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For drivers that want to fallback to PCI-only operation, immediately cleanup on attach failure. Otherwise vestigial topology objects are left until driver unload. Signed-off-by: Dan Williams --- drivers/cxl/mem.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c index ff858318091f..5e7fa378dd66 100644 --- a/drivers/cxl/mem.c +++ b/drivers/cxl/mem.c @@ -201,7 +201,19 @@ static int cxl_mem_probe(struct device *dev) struct cxl_memdev *devm_cxl_add_memdev(struct cxl_dev_state *cxlds, const struct cxl_memdev_attach *attach) { - return __devm_cxl_add_memdev(cxlds, attach); + struct cxl_memdev *cxlmd; + void *group; + + group =3D devres_open_group(cxlds->dev, NULL, GFP_KERNEL); + if (!group) + return ERR_PTR(-ENOMEM); + + cxlmd =3D __devm_cxl_add_memdev(cxlds, attach); + if (IS_ERR(cxlmd)) + devres_release_group(cxlds->dev, group); + else + devres_remove_group(cxlds->dev, group); + return cxlmd; } EXPORT_SYMBOL_NS_GPL(devm_cxl_add_memdev, "CXL"); =20 --=20 2.53.0 From nobody Sun Jun 14 17:34:12 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47A843D8916; Fri, 3 Apr 2026 20:59:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.17 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249977; cv=none; b=m3FDBEOmwvfoxcJmXEvRPpxV70n6dY1Opq1oUlACJz2WTtAvyYxdrvphK0rBNfWV15sxJi2BppqPIhb+1MZC+1ShTrLPIKSgSuw89Lj/LsKIteDWmD2pVFn0KxMxqZf2lxfYZut/KGOY9FVT867lJrLkMIxoSn3DWRornFzk2Nc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249977; c=relaxed/simple; bh=hyQKvQwp0GaqCbyQ4ZH4jFd7NtavtNNrGg227z+weo4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T54jZasWe9DC5XsQJQ/Yt+KI3zkaxfbCaAYvWqG72o6o8hxRNxCafE01uYGBPLzLh9At278vdu77W7OiKahouruzLV8GurjRBOrPVrE3FW4LWnsYGXZUqde6S9g1cKPar/OptT9kOvbtlpUEO6N+HGD0TtBO0TdgRbMdjUp82A4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=CKBjnZVq; arc=none smtp.client-ip=198.175.65.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="CKBjnZVq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1775249976; x=1806785976; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=hyQKvQwp0GaqCbyQ4ZH4jFd7NtavtNNrGg227z+weo4=; b=CKBjnZVqazPNvvAs3r9jKCqTdB+FzZxxoYB2efwiWGGlbJup5Iv6lKgd AzFrBymBXbgH/JatKn7+Bl64uY5XjBsgIuURWm5lbWT9f+7GNkLoi47xr X/BxFgeTdye+6pG2sIe5qVP5qWw3ieQsBxc2DGyFCqwJOkN+JsWvhhT1+ yGUb4llKX4+dkitYEPxnv+c7Ab7Kix93TCnVSE272o+UmC2svmKH1W3iS haFLZMRS0T69QRpsntFw0ECSFvMFXMN9+Dm640fqVz42GBGt9zEp9Kqs6 r0ykJKCQib9YMK8EIZsOZ+9gcv1hV2wbQ0YO3d31a9GmhWnFI/2hCk+Bj Q==; X-CSE-ConnectionGUID: GsyDkNBpSNy8MDbmupGQfg== X-CSE-MsgGUID: vXAyKcxTQ4ez0sTMVHOAlw== X-IronPort-AV: E=McAfee;i="6800,10657,11748"; a="76281470" X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="76281470" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2026 13:59:34 -0700 X-CSE-ConnectionGUID: y8g+Ce2jTiKDL7XeavsahA== X-CSE-MsgGUID: lIDsgZwKTOOiqzznUMDMtA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="265280480" Received: from dwillia2-desk.jf.intel.com ([10.88.27.145]) by orviesa001.jf.intel.com with ESMTP; 03 Apr 2026 13:59:33 -0700 From: Dan Williams To: dave.jiang@intel.com Cc: linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org, alejandro.lucero-palau@amd.com Subject: [RFC PATCH 2/4] cxl/region: Move region lock error code to -EBUSY Date: Fri, 3 Apr 2026 14:00:48 -0700 Message-ID: <20260403210050.1058650-3-dan.j.williams@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403210050.1058650-1-dan.j.williams@intel.com> References: <20260403210050.1058650-1-dan.j.williams@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" -EPERM is permission check. Root is permitted to manage a region, but at any given point in time the region may be busy. In preparation for adding another region operation failure due to region lock, move the existing error indication to -EBUSY. Signed-off-by: Dan Williams --- drivers/cxl/core/region.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 3edb5703d6de..600c96be0888 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -426,7 +426,7 @@ static ssize_t commit_store(struct device *dev, struct = device_attribute *attr, } =20 if (test_bit(CXL_REGION_F_LOCK, &cxlr->flags)) - return -EPERM; + return -EBUSY; =20 rc =3D queue_reset(cxlr); if (rc) --=20 2.53.0 From nobody Sun Jun 14 17:34:12 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 300353D9048; Fri, 3 Apr 2026 20:59:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.17 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249978; cv=none; b=ARbLuUGiDWXpNUBDX97XBGZC1wwByZ/AzJlRKtwjM6stmT2JAr6C1p5V/Vu8njrS/7xIEr0RncjnfjnCsTJF7DMN9fLkORTXpmdYK+lF32pUiiy7v2Fb69RYIx/5FaFD4wJN4hlC0uBDYLI9mlBa07MIYbL90dP846rMjUCb5hU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249978; c=relaxed/simple; bh=PitfgQo4DHj0Y96d92T8kxsOJx3DCq6tKvhXLvqAKdY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hj7lURoFlAi8Dsc5GpZIGW3uqe/L416K6dO662Ro8T1mKCRtCF+VS7gem0QTgO9B7l9HC4piX3LItUtt9qpyYV4jQqm5Te37ZxyrmqDrOAQEhcVSwaPgzJC8HAQq/hN+JpdORTG5DVMTJPbvGuXpqvqAwcYlYs/C7Eqv0lBVTyg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=SoGVo38o; arc=none smtp.client-ip=198.175.65.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="SoGVo38o" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1775249977; x=1806785977; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PitfgQo4DHj0Y96d92T8kxsOJx3DCq6tKvhXLvqAKdY=; b=SoGVo38ov8NCtztx4eRWbAqDPISHPO/WDFs0KPUZu3G0tt6PyoktgEfh caP+kV2r0PJqLCaAQTLeb2WU6iw+VpprHc6a7getnk6rN2u15xqC6jmbj PdVKHQuTA3+2r8xJeqmr2z8kTIZE4LZk4JaCMnAJg0EulCNO/V/ZeZx47 iQN2TH4O5VuaB3TxUdq1RnNNCozSLYDVvczdzgwxu2jIJy3kGpyUxzhTK dqr9VIla4EqXAxpTZ9Dh6vqNKEOnhYZRZaj2nfXLvwgCSQNbpNcd8obqN ruTWhS2HEQQNnZYAGpm++oEmJ7mOfIK51QmgLdjGX6YX18mnN+FyE/F8i Q==; X-CSE-ConnectionGUID: vKWsVicVS0+1+VaaA4ix2w== X-CSE-MsgGUID: PUyjPd0CQFK6zyYoHxzutQ== X-IronPort-AV: E=McAfee;i="6800,10657,11748"; a="76281472" X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="76281472" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2026 13:59:34 -0700 X-CSE-ConnectionGUID: V/QEnClgQ42FhPPcKzdEZA== X-CSE-MsgGUID: DTjH9IRYT+C3x5wB7brC9Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="265280483" Received: from dwillia2-desk.jf.intel.com ([10.88.27.145]) by orviesa001.jf.intel.com with ESMTP; 03 Apr 2026 13:59:33 -0700 From: Dan Williams To: dave.jiang@intel.com Cc: linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org, alejandro.lucero-palau@amd.com Subject: [RFC PATCH 3/4] cxl/region: Block region delete for locked regions Date: Fri, 3 Apr 2026 14:00:49 -0700 Message-ID: <20260403210050.1058650-4-dan.j.williams@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403210050.1058650-1-dan.j.williams@intel.com> References: <20260403210050.1058650-1-dan.j.williams@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In support of reducing the number of failure conditions an accelerator driver needs to consider, block user initiated delete of locked regions. This might turn out to be too heavy and some region unlock mechanism needs to be considered, but in the interest of doing something simple to get accelerators enabled, take this coarse step. Switch to scope-based cleanup now that there is an early exit case. Signed-off-by: Dan Williams --- drivers/cxl/core/region.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 600c96be0888..11bc0b88b05f 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2768,17 +2768,20 @@ static ssize_t delete_region_store(struct device *d= ev, { struct cxl_root_decoder *cxlrd =3D to_cxl_root_decoder(dev); struct cxl_port *port =3D to_cxl_port(dev->parent); - struct cxl_region *cxlr; =20 - cxlr =3D cxl_find_region_by_name(cxlrd, buf); + struct cxl_region *cxlr __free(put_cxl_region) =3D + cxl_find_region_by_name(cxlrd, buf); if (IS_ERR(cxlr)) return PTR_ERR(cxlr); =20 + if (test_bit(CXL_REGION_F_LOCK, &cxlr->flags)) + return -EBUSY; + devm_release_action(port->uport_dev, unregister_region, cxlr); - put_device(&cxlr->dev); =20 return len; } + DEVICE_ATTR_WO(delete_region); =20 static void cxl_pmem_region_release(struct device *dev) --=20 2.53.0 From nobody Sun Jun 14 17:34:12 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E1B83D8907; Fri, 3 Apr 2026 20:59:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.17 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249979; cv=none; b=DK/Gpjw9UvugdhhLJyCX/1V78iZxzDjNRRzebRjBz2/FrTP7Xd4KJtxFnrhPx6wxpc/fZAir/eHGbMXoVMyOTpLTcwfxHMXo1pK/daklP55cXhvIO8Gpvvrwx0lmA7pm9KJWVw6CqFx2dRN2rbQDDXL6/PLond1r1unu5aOzwFE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775249979; c=relaxed/simple; bh=CcCc5uicR+vsgmQJUW7EMBRPLNFUY6LBQPzlah2HaEA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mniE2knngGlxDUGQJkaQEgpB6VH8heS4bNIoTfAm8AmnjJsSE1iOEGPjN0JIanS2ymN501+nsTNZ5cjKVSRdZP/BIszMDITOvxsdQ+dpC34ko8RQ3pmCcS8Dkm6+3hPxQIY7/7zZV22a3YZKv46mFY0HukGO7j4FTEkvJCutQDE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=h0HDr07i; arc=none smtp.client-ip=198.175.65.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="h0HDr07i" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1775249978; x=1806785978; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CcCc5uicR+vsgmQJUW7EMBRPLNFUY6LBQPzlah2HaEA=; b=h0HDr07iviWhlm5Fl4ssu9p7rOX/BIzmo/wFZf+pO9WyD4fOdM37kfYN smHvxynQHPjMXRCaNY5Zupah9tUtQC7FAT/zuHUctjy8qU2z3b25oLxQ7 kSo9EecMWq5QltNvKCpn5yAsr+DXfx9lrLFPa81oXkJQiP5xVemMFQ641 TQMjgJD67iyk1DQc6QqA4sz6jecVbk3fwKIiiQuyyzMnkTp0wvCv47Uce ymscNBESkaOnkEpWVpfR9dPF/9UHhOVPKev7ZPXj9F5ShMW7N64yRkExL +nVdJQwPjWAhJ40coVBZvGxak+jRwKlRXu6u0K4Ri5ZKEZjIJ+I2YS0TP g==; X-CSE-ConnectionGUID: 53Ssf/LGT9SqSv55rivw7A== X-CSE-MsgGUID: SpBeQbm0QZeuHgbVob50ig== X-IronPort-AV: E=McAfee;i="6800,10657,11748"; a="76281474" X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="76281474" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2026 13:59:34 -0700 X-CSE-ConnectionGUID: VL7BKUqLSt6QCypm8peHSQ== X-CSE-MsgGUID: YH6HzLqARFiNaEVxx9A0SQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,158,1770624000"; d="scan'208";a="265280486" Received: from dwillia2-desk.jf.intel.com ([10.88.27.145]) by orviesa001.jf.intel.com with ESMTP; 03 Apr 2026 13:59:34 -0700 From: Dan Williams To: dave.jiang@intel.com Cc: linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org, alejandro.lucero-palau@amd.com Subject: [RFC PATCH 4/4] cxl/region: Introduce cxl_memdev_attach_region Date: Fri, 3 Apr 2026 14:00:50 -0700 Message-ID: <20260403210050.1058650-5-dan.j.williams@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403210050.1058650-1-dan.j.williams@intel.com> References: <20260403210050.1058650-1-dan.j.williams@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To date, platform firmware maps accelerator memory and accelerator drivers simply want an address range that they can map themselves. This typically results in a single region being auto-assembled upon registration of a memory device. Use the @attach mechanism of devm_cxl_add_memdev() parameter to retrieve that region while also adhering to CXL subsystem locking and lifetime rules. As part of adhering to current object lifetime rules, if the region or the CXL port topology is invalidated, the CXL core arranges for the accelertor driver to be detached as well. The locking and lifetime rules were validated by this local change to cxl_mock_mem. This tests all the lock acquisition and cleanup at modprobe -r cxl_test time. More work needed to also test the full positive case. struct cxl_attach_region attach =3D { .attach =3D { .probe =3D cxl_memdev_attach_region, } }; cxlmd =3D devm_cxl_add_memdev(cxlds, &attach.attach); Signed-off-by: Dan Williams --- include/cxl/cxl.h | 16 +++++ drivers/cxl/core/region.c | 125 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h index 10a9b8fa2f6b..1698d15ec1ca 100644 --- a/include/cxl/cxl.h +++ b/include/cxl/cxl.h @@ -153,6 +153,22 @@ struct cxl_memdev_attach { int (*probe)(struct cxl_memdev *cxlmd); }; =20 +/** + * struct cxl_attach_region - coordinate mapping a region at memdev regist= ration + * @attach: common core attachment descriptor + * @region: physical address range of the region + * + * For the common simple case of a CXL device with private (non-general pu= rpose + * / "accelerator") memory, enumerate firmware instantiated region, or + * instantiate a region for the device's capacity. Destroy the region on d= etach. + */ +struct cxl_attach_region { + struct cxl_memdev_attach attach; + struct range region; +}; + +int cxl_memdev_attach_region(struct cxl_memdev *cxlmd); + /** * struct cxl_dev_state - The driver device state * diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 11bc0b88b05f..090f52392b20 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1123,6 +1123,19 @@ static int cxl_rr_assign_decoder(struct cxl_port *po= rt, struct cxl_region *cxlr, static void cxl_region_setup_flags(struct cxl_region *cxlr, struct cxl_decoder *cxld) { + if (is_endpoint_decoder(&cxld->dev)) { + struct cxl_endpoint_decoder *cxled =3D to_cxl_endpoint_decoder(&cxld->de= v); + struct cxl_memdev *cxlmd =3D cxled_to_memdev(cxled); + + /* + * When a region's memdevs specify an @attach method the attach + * provider is responsible for dispositioning the region for + * both probe and userspace management + */ + if (cxlmd->attach) + set_bit(CXL_REGION_F_LOCK, &cxlr->flags); + } + if (cxld->flags & CXL_DECODER_F_LOCK) { set_bit(CXL_REGION_F_LOCK, &cxlr->flags); clear_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags); @@ -4226,6 +4239,115 @@ static int cxl_region_can_probe(struct cxl_region *= cxlr) return 0; } =20 +static int first_mapped_decoder(struct device *dev, const void *data) +{ + struct cxl_endpoint_decoder *cxled; + + if (!is_endpoint_decoder(dev)) + return 0; + + cxled =3D to_cxl_endpoint_decoder(dev); + if (cxled->cxld.region) + return 1; + + return 0; +} + +/* + * As this is running in endpoint port remove context it does not race cxl= _root + * destruction since port topologies are always removed depth first. + */ +static void cxl_endpoint_region_autoremove(void *_cxlr) +{ + struct cxl_region *cxlr =3D _cxlr; + struct cxl_root_decoder *cxlrd =3D cxlr->cxlrd; + struct cxl_port *port =3D cxlrd_to_port(cxlrd); + + devm_release_action(port->uport_dev, unregister_region, cxlr); +} + +/* + * Runs in cxl_mem_probe context after successful endpoint probe, assumes = the + * simple case of single mapped decoder per memdev. + */ +int cxl_memdev_attach_region(struct cxl_memdev *cxlmd) +{ + struct cxl_attach_region *attach =3D + container_of(cxlmd->attach, typeof(*attach), attach); + struct cxl_port *endpoint =3D cxlmd->endpoint; + struct cxl_endpoint_decoder *cxled; + struct cxl_region *cxlr; + int rc; + + /* hold endpoint lock to setup autoremove of the region */ + guard(device)(&endpoint->dev); + if (!endpoint->dev.driver) + return -ENXIO; + guard(rwsem_read)(&cxl_rwsem.region); + guard(rwsem_read)(&cxl_rwsem.dpa); + + /* + * TODO auto-instantiate a region, for now assume this will find an + * auto-region + */ + struct device *dev __free(put_device) =3D + device_find_child(&endpoint->dev, NULL, first_mapped_decoder); + + if (!dev) { + dev_dbg(cxlmd->cxlds->dev, "no region found for memdev %s\n", + dev_name(&cxlmd->dev)); + return -ENXIO; + } + + cxled =3D to_cxl_endpoint_decoder(dev); + cxlr =3D cxled->cxld.region; + + if (cxlr->params.state < CXL_CONFIG_COMMIT) { + dev_dbg(cxlmd->cxlds->dev, + "region %s not committed for memdev %s\n", + dev_name(&cxlr->dev), dev_name(&cxlmd->dev)); + return -ENXIO; + } + + if (cxlr->params.nr_targets > 1) { + dev_dbg(cxlmd->cxlds->dev, + "Only attach to local non-interleaved region\n"); + return -ENXIO; + } + + /* Only teardown regions that pass validation, ignore the rest */ + rc =3D devm_add_action_or_reset(&endpoint->dev, + cxl_endpoint_region_autoremove, cxlr); + if (rc) + return rc; + + attach->region =3D (struct range) { + .start =3D cxlr->params.res->start, + .end =3D cxlr->params.res->end, + }; + return 0; +} +EXPORT_SYMBOL_NS_GPL(cxl_memdev_attach_region, "CXL"); + +/* + * The presence of an attach method indicates that the region is designate= d for + * a purpose outside of CXL core memory expansion defaults. + */ +static bool cxl_region_has_memdev_attach(struct cxl_region *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + + for (int i =3D 0; i < p->nr_targets; i++) { + struct cxl_endpoint_decoder *cxled =3D p->targets[i]; + struct cxl_memdev *cxlmd =3D cxled_to_memdev(cxled); + + if (cxlmd->attach) + return true; + } + + return false; +} + static int cxl_region_probe(struct device *dev) { struct cxl_region *cxlr =3D to_cxl_region(dev); @@ -4257,6 +4379,9 @@ static int cxl_region_probe(struct device *dev) if (rc) return rc; =20 + if (cxl_region_has_memdev_attach(cxlr)) + return 0; + switch (cxlr->mode) { case CXL_PARTMODE_PMEM: rc =3D devm_cxl_region_edac_register(cxlr); --=20 2.53.0