From nobody Thu Apr 2 17:44:45 2026 Received: from mail-qt1-f172.google.com (mail-qt1-f172.google.com [209.85.160.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE044359FA9 for ; Wed, 11 Feb 2026 20:42:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770842536; cv=none; b=gjoZlUswSf4Cc0S3aTuopz62QJAlwkyPuul7hdi9dXG8Kyd4V7ctdZ3u/3Ars/mYlAaWsCFzfn4rreQAnIo9N8xi1nQsMtp02lb6cPopQehif53Od5LzfvbAOIvL7l3bWB3kUgOYuE99Ksqon1IstBFl6T2qZnjtrR6F7Ay9XFQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770842536; c=relaxed/simple; bh=h/5nqdNcLOOA04VQfaZZ93e72IrGx2Ckyrh9xihZY28=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ARP05J/R2O+rZI0N9kE0xYodl405l6EJoPi6XxOa1gGjs8l/kcQmXCgie3VreIm7odfUQ3IJow8m71pn1URPpEEiNUHrgYcxOElsBjojf5TiU4I8OwJCwRcvkrICn6ezZyLbZ6gdlJrALujGBDTMZVj2+YELj1tu5G+RIcejp/E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=sFp+0jpg; arc=none smtp.client-ip=209.85.160.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="sFp+0jpg" Received: by mail-qt1-f172.google.com with SMTP id d75a77b69052e-5013d163e2fso62846301cf.0 for ; Wed, 11 Feb 2026 12:42:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1770842534; x=1771447334; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lKc/nfWQRSsiLdusPosVOipLAAdv0p6spOXTbPKQUcs=; b=sFp+0jpg1fzDCp3qo3G3CZZ43DZwumnnqvnew+m6dCGR+IizgsSxEiwLQ7eLWw6q1Z 0425HCKDDLOwTBd9kEJYeca00YgaKqEN+K9rdK8RG27mhiIrW2Dl8gNIfXi2nmJFBqkZ iK2sT+oFS/MEwU8msaeMaITyNEJji/J3mnmh/SU3zHAK8cMNPRwNKITfO+pS1TepFRG/ w+KMWYIvBOAePfDhCPGJAoj/DHW3OsIurpaD+RDcmMgPibu7js5v4II02Ql2wrUUcXqJ V6IwUOCeZMy6LqKfgOOLVBbWlN+fH9bX+38Juvu2hMrgzg4JvenV4YQ0ozimujxzhDHF vfWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770842534; x=1771447334; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lKc/nfWQRSsiLdusPosVOipLAAdv0p6spOXTbPKQUcs=; b=LjFWOvC59nKZLTW2/7NgDAJqyHsp0jJBPKCrEAggRIYU795nVFQHIqhweilbjG+24w PsyNu2mlf5+yfzQ6Il96EtQ9B8SUPwTCY/roihoiFDNTHu/3fRAkp5QeJIv5VO+s6jJr HXM9fgq8y3EJsMzOKHw6WnpF+m615kg8PnyBarLGJdktHkSZalaQPb+IPUH1GNs/7wnG FWbUhk2L728lUXOGDCT4r+9S63CHqTvG/Pd2Bj5aEiOjXKXcyp+iPU1LabGPvzA2if/5 9Tz3VESjieqQY0dujcLi2d+62MYGU6/bu8IFtMFRjZC/p1JTZlguaKOuB01IL+mz483e ok2Q== X-Gm-Message-State: AOJu0YxywYZz2AL0ege8ZOz0Tw33nWcXSYwgDRNyrbtglNNyzuUp5RVh u2W73tHJ1B23MDExBL8lMXJ4IXXdFegs7h7Oj+gJAMF4EDtAcRmaU2IIWgH/s/p97Co5Hx19sqA O+pg6 X-Gm-Gg: AZuq6aLseonNH1UHl0oeKMoq3In19ArsuHTLaZS5BD8DXoF7aloC46kNXlOJ1R/M+Vf NRcb7oR0z1tMBUg23c/j3wGkqf40M3lsKlP7mLMth8SEQchZFIMCHi14MRRgAe0e103sPIwENuV VoG3M2yX+p1vZcPwFz1qIQ41aO+TNlsQbb3Lc+6B2E8CDUiEGbzWllbKbETG4xh1GMJx11lhzR/ sFSklnRfcZ0JTjcwpMFUzXHR7gtGURe+6ffHuY3A36CFi/UAdchMVPOqJNOzcApehAvx50H01O9 /Cst9ETqYLVuIb4ztM4HzLA06hu7tg+y5kKB1Omme6r8tOHoPVvQJbpuHoo/wJHecwVwjVk1c1P EMEoDNf3EwXCFjcN+SYrMR/BZIzVwDQ9R+HjsgGWGcSpivYCcUR3sxVyg0Dn1p17bMwHzhozgaK 2LHpJqNll74mP+HQ0jSRZgiANgCQFoBhXWUP8O2KkYHaFm+Ni0tke8RW9MS6+eA1iTpKUFa3edc W93NKdebA9VY1c= X-Received: by 2002:a05:622a:4d2:b0:4eb:9eaf:ab4d with SMTP id d75a77b69052e-50691f0b959mr10956741cf.62.1770842533639; Wed, 11 Feb 2026 12:42:13 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-506847d77cesm20173591cf.3.2026.02.11.12.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Feb 2026 12:42:13 -0800 (PST) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, "Fabio M. De Francesco" Subject: [PATCH v3 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c Date: Wed, 11 Feb 2026 15:42:04 -0500 Message-ID: <20260211204206.2171525-2-gourry@gourry.net> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260211204206.2171525-1-gourry@gourry.net> References: <20260211204206.2171525-1-gourry@gourry.net> 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" core/region.c is overloaded with per-region control logic (pmem, dax). Move pmem region logic from region.c into region_pmem.c to make it clear that this code only applies to pmem regions. No functional changes. Reviewed-by: Dave Jiang Reviewed-by: Fabio M. De Francesco Signed-off-by: Gregory Price --- drivers/cxl/core/Makefile | 1 + drivers/cxl/core/core.h | 1 + drivers/cxl/core/region.c | 184 -------------------------------- drivers/cxl/core/region_pmem.c | 189 +++++++++++++++++++++++++++++++++ 4 files changed, 191 insertions(+), 184 deletions(-) create mode 100644 drivers/cxl/core/region_pmem.c diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile index a639a9499972..d1484a0e5eb4 100644 --- a/drivers/cxl/core/Makefile +++ b/drivers/cxl/core/Makefile @@ -16,6 +16,7 @@ cxl_core-y +=3D pmu.o cxl_core-y +=3D cdat.o cxl_core-$(CONFIG_TRACING) +=3D trace.o cxl_core-$(CONFIG_CXL_REGION) +=3D region.o +cxl_core-$(CONFIG_CXL_REGION) +=3D region_pmem.o cxl_core-$(CONFIG_CXL_MCE) +=3D mce.o cxl_core-$(CONFIG_CXL_FEATURES) +=3D features.o cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) +=3D edac.o diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 007b8aff0238..ced65a779a09 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -50,6 +50,7 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 d= pa); u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); +int devm_cxl_add_pmem_region(struct cxl_region *cxlr); =20 #else static inline u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index bd4c4a4a27da..1c322318d70e 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2757,46 +2757,6 @@ static ssize_t delete_region_store(struct device *de= v, } DEVICE_ATTR_WO(delete_region); =20 -static void cxl_pmem_region_release(struct device *dev) -{ - struct cxl_pmem_region *cxlr_pmem =3D to_cxl_pmem_region(dev); - int i; - - for (i =3D 0; i < cxlr_pmem->nr_mappings; i++) { - struct cxl_memdev *cxlmd =3D cxlr_pmem->mapping[i].cxlmd; - - put_device(&cxlmd->dev); - } - - kfree(cxlr_pmem); -} - -static const struct attribute_group *cxl_pmem_region_attribute_groups[] = =3D { - &cxl_base_attribute_group, - NULL, -}; - -const struct device_type cxl_pmem_region_type =3D { - .name =3D "cxl_pmem_region", - .release =3D cxl_pmem_region_release, - .groups =3D cxl_pmem_region_attribute_groups, -}; - -bool is_cxl_pmem_region(struct device *dev) -{ - return dev->type =3D=3D &cxl_pmem_region_type; -} -EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, "CXL"); - -struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev) -{ - if (dev_WARN_ONCE(dev, !is_cxl_pmem_region(dev), - "not a cxl_pmem_region device\n")) - return NULL; - return container_of(dev, struct cxl_pmem_region, dev); -} -EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, "CXL"); - struct cxl_poison_context { struct cxl_port *port; int part; @@ -3432,64 +3392,6 @@ static int region_offset_to_dpa_result(struct cxl_re= gion *cxlr, u64 offset, return -ENXIO; } =20 -static struct lock_class_key cxl_pmem_region_key; - -static int cxl_pmem_region_alloc(struct cxl_region *cxlr) -{ - struct cxl_region_params *p =3D &cxlr->params; - struct cxl_nvdimm_bridge *cxl_nvb; - struct device *dev; - int i; - - guard(rwsem_read)(&cxl_rwsem.region); - if (p->state !=3D CXL_CONFIG_COMMIT) - return -ENXIO; - - struct cxl_pmem_region *cxlr_pmem __free(kfree) =3D - kzalloc(struct_size(cxlr_pmem, mapping, p->nr_targets), GFP_KERNEL); - if (!cxlr_pmem) - return -ENOMEM; - - cxlr_pmem->hpa_range.start =3D p->res->start; - cxlr_pmem->hpa_range.end =3D p->res->end; - - /* Snapshot the region configuration underneath the cxl_rwsem.region */ - cxlr_pmem->nr_mappings =3D p->nr_targets; - for (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); - struct cxl_pmem_region_mapping *m =3D &cxlr_pmem->mapping[i]; - - /* - * Regions never span CXL root devices, so by definition the - * bridge for one device is the same for all. - */ - if (i =3D=3D 0) { - cxl_nvb =3D cxl_find_nvdimm_bridge(cxlmd->endpoint); - if (!cxl_nvb) - return -ENODEV; - cxlr->cxl_nvb =3D cxl_nvb; - } - m->cxlmd =3D cxlmd; - get_device(&cxlmd->dev); - m->start =3D cxled->dpa_res->start; - m->size =3D resource_size(cxled->dpa_res); - m->position =3D i; - } - - dev =3D &cxlr_pmem->dev; - device_initialize(dev); - lockdep_set_class(&dev->mutex, &cxl_pmem_region_key); - device_set_pm_not_required(dev); - dev->parent =3D &cxlr->dev; - dev->bus =3D &cxl_bus_type; - dev->type =3D &cxl_pmem_region_type; - cxlr_pmem->cxlr =3D cxlr; - cxlr->cxlr_pmem =3D no_free_ptr(cxlr_pmem); - - return 0; -} - static void cxl_dax_region_release(struct device *dev) { struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); @@ -3553,92 +3455,6 @@ static struct cxl_dax_region *cxl_dax_region_alloc(s= truct cxl_region *cxlr) return cxlr_dax; } =20 -static void cxlr_pmem_unregister(void *_cxlr_pmem) -{ - struct cxl_pmem_region *cxlr_pmem =3D _cxlr_pmem; - struct cxl_region *cxlr =3D cxlr_pmem->cxlr; - struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; - - /* - * Either the bridge is in ->remove() context under the device_lock(), - * or cxlr_release_nvdimm() is cancelling the bridge's release action - * for @cxlr_pmem and doing it itself (while manually holding the bridge - * lock). - */ - device_lock_assert(&cxl_nvb->dev); - cxlr->cxlr_pmem =3D NULL; - cxlr_pmem->cxlr =3D NULL; - device_unregister(&cxlr_pmem->dev); -} - -static void cxlr_release_nvdimm(void *_cxlr) -{ - struct cxl_region *cxlr =3D _cxlr; - struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; - - scoped_guard(device, &cxl_nvb->dev) { - if (cxlr->cxlr_pmem) - devm_release_action(&cxl_nvb->dev, cxlr_pmem_unregister, - cxlr->cxlr_pmem); - } - cxlr->cxl_nvb =3D NULL; - put_device(&cxl_nvb->dev); -} - -/** - * devm_cxl_add_pmem_region() - add a cxl_region-to-nd_region bridge - * @cxlr: parent CXL region for this pmem region bridge device - * - * Return: 0 on success negative error code on failure. - */ -static int devm_cxl_add_pmem_region(struct cxl_region *cxlr) -{ - struct cxl_pmem_region *cxlr_pmem; - struct cxl_nvdimm_bridge *cxl_nvb; - struct device *dev; - int rc; - - rc =3D cxl_pmem_region_alloc(cxlr); - if (rc) - return rc; - cxlr_pmem =3D cxlr->cxlr_pmem; - cxl_nvb =3D cxlr->cxl_nvb; - - dev =3D &cxlr_pmem->dev; - rc =3D dev_set_name(dev, "pmem_region%d", cxlr->id); - if (rc) - goto err; - - rc =3D device_add(dev); - if (rc) - goto err; - - dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), - dev_name(dev)); - - scoped_guard(device, &cxl_nvb->dev) { - if (cxl_nvb->dev.driver) - rc =3D devm_add_action_or_reset(&cxl_nvb->dev, - cxlr_pmem_unregister, - cxlr_pmem); - else - rc =3D -ENXIO; - } - - if (rc) - goto err_bridge; - - /* @cxlr carries a reference on @cxl_nvb until cxlr_release_nvdimm */ - return devm_add_action_or_reset(&cxlr->dev, cxlr_release_nvdimm, cxlr); - -err: - put_device(dev); -err_bridge: - put_device(&cxl_nvb->dev); - cxlr->cxl_nvb =3D NULL; - return rc; -} - static void cxlr_dax_unregister(void *_cxlr_dax) { struct cxl_dax_region *cxlr_dax =3D _cxlr_dax; diff --git a/drivers/cxl/core/region_pmem.c b/drivers/cxl/core/region_pmem.c new file mode 100644 index 000000000000..f800407566d3 --- /dev/null +++ b/drivers/cxl/core/region_pmem.c @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright(c) 2022 Intel Corporation. All rights reserved. */ +#include +#include +#include +#include +#include "core.h" + +static void cxl_pmem_region_release(struct device *dev) +{ + struct cxl_pmem_region *cxlr_pmem =3D to_cxl_pmem_region(dev); + int i; + + for (i =3D 0; i < cxlr_pmem->nr_mappings; i++) { + struct cxl_memdev *cxlmd =3D cxlr_pmem->mapping[i].cxlmd; + + put_device(&cxlmd->dev); + } + + kfree(cxlr_pmem); +} + +static const struct attribute_group *cxl_pmem_region_attribute_groups[] = =3D { + &cxl_base_attribute_group, + NULL +}; + +const struct device_type cxl_pmem_region_type =3D { + .name =3D "cxl_pmem_region", + .release =3D cxl_pmem_region_release, + .groups =3D cxl_pmem_region_attribute_groups, +}; +bool is_cxl_pmem_region(struct device *dev) +{ + return dev->type =3D=3D &cxl_pmem_region_type; +} +EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, "CXL"); + +struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev) +{ + if (dev_WARN_ONCE(dev, !is_cxl_pmem_region(dev), + "not a cxl_pmem_region device\n")) + return NULL; + return container_of(dev, struct cxl_pmem_region, dev); +} +EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, "CXL"); +static struct lock_class_key cxl_pmem_region_key; + +static int cxl_pmem_region_alloc(struct cxl_region *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + struct cxl_nvdimm_bridge *cxl_nvb; + struct device *dev; + int i; + + guard(rwsem_read)(&cxl_rwsem.region); + if (p->state !=3D CXL_CONFIG_COMMIT) + return -ENXIO; + + struct cxl_pmem_region *cxlr_pmem __free(kfree) =3D + kzalloc(struct_size(cxlr_pmem, mapping, p->nr_targets), GFP_KERNEL); + if (!cxlr_pmem) + return -ENOMEM; + + cxlr_pmem->hpa_range.start =3D p->res->start; + cxlr_pmem->hpa_range.end =3D p->res->end; + + /* Snapshot the region configuration underneath the cxl_rwsem.region */ + cxlr_pmem->nr_mappings =3D p->nr_targets; + for (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); + struct cxl_pmem_region_mapping *m =3D &cxlr_pmem->mapping[i]; + + /* + * Regions never span CXL root devices, so by definition the + * bridge for one device is the same for all. + */ + if (i =3D=3D 0) { + cxl_nvb =3D cxl_find_nvdimm_bridge(cxlmd->endpoint); + if (!cxl_nvb) + return -ENODEV; + cxlr->cxl_nvb =3D cxl_nvb; + } + m->cxlmd =3D cxlmd; + get_device(&cxlmd->dev); + m->start =3D cxled->dpa_res->start; + m->size =3D resource_size(cxled->dpa_res); + m->position =3D i; + } + + dev =3D &cxlr_pmem->dev; + device_initialize(dev); + lockdep_set_class(&dev->mutex, &cxl_pmem_region_key); + device_set_pm_not_required(dev); + dev->parent =3D &cxlr->dev; + dev->bus =3D &cxl_bus_type; + dev->type =3D &cxl_pmem_region_type; + cxlr_pmem->cxlr =3D cxlr; + cxlr->cxlr_pmem =3D no_free_ptr(cxlr_pmem); + + return 0; +} + +static void cxlr_pmem_unregister(void *_cxlr_pmem) +{ + struct cxl_pmem_region *cxlr_pmem =3D _cxlr_pmem; + struct cxl_region *cxlr =3D cxlr_pmem->cxlr; + struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; + + /* + * Either the bridge is in ->remove() context under the device_lock(), + * or cxlr_release_nvdimm() is cancelling the bridge's release action + * for @cxlr_pmem and doing it itself (while manually holding the bridge + * lock). + */ + device_lock_assert(&cxl_nvb->dev); + cxlr->cxlr_pmem =3D NULL; + cxlr_pmem->cxlr =3D NULL; + device_unregister(&cxlr_pmem->dev); +} + +static void cxlr_release_nvdimm(void *_cxlr) +{ + struct cxl_region *cxlr =3D _cxlr; + struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; + + scoped_guard(device, &cxl_nvb->dev) { + if (cxlr->cxlr_pmem) + devm_release_action(&cxl_nvb->dev, cxlr_pmem_unregister, + cxlr->cxlr_pmem); + } + cxlr->cxl_nvb =3D NULL; + put_device(&cxl_nvb->dev); +} + +/** + * devm_cxl_add_pmem_region() - add a cxl_region-to-nd_region bridge + * @cxlr: parent CXL region for this pmem region bridge device + * + * Return: 0 on success negative error code on failure. + */ +int devm_cxl_add_pmem_region(struct cxl_region *cxlr) +{ + struct cxl_pmem_region *cxlr_pmem; + struct cxl_nvdimm_bridge *cxl_nvb; + struct device *dev; + int rc; + + rc =3D cxl_pmem_region_alloc(cxlr); + if (rc) + return rc; + cxlr_pmem =3D cxlr->cxlr_pmem; + cxl_nvb =3D cxlr->cxl_nvb; + + dev =3D &cxlr_pmem->dev; + rc =3D dev_set_name(dev, "pmem_region%d", cxlr->id); + if (rc) + goto err; + + rc =3D device_add(dev); + if (rc) + goto err; + + dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), + dev_name(dev)); + + scoped_guard(device, &cxl_nvb->dev) { + if (cxl_nvb->dev.driver) + rc =3D devm_add_action_or_reset(&cxl_nvb->dev, + cxlr_pmem_unregister, + cxlr_pmem); + else + rc =3D -ENXIO; + } + + if (rc) + goto err_bridge; + + /* @cxlr carries a reference on @cxl_nvb until cxlr_release_nvdimm */ + return devm_add_action_or_reset(&cxlr->dev, cxlr_release_nvdimm, cxlr); + +err: + put_device(dev); +err_bridge: + put_device(&cxl_nvb->dev); + cxlr->cxl_nvb =3D NULL; + return rc; +} --=20 2.47.3 From nobody Thu Apr 2 17:44:45 2026 Received: from mail-qt1-f169.google.com (mail-qt1-f169.google.com [209.85.160.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A9F634F487 for ; Wed, 11 Feb 2026 20:42:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770842538; cv=none; b=u8qnE9qX5yRMqp2xbhpF0pvmWtBx2rMwGEO9lbvbS81G3bFoONplU+CB6NpI90K/DkCq0/deZ69RKQ9x//gV4upq3CrYQ2OSbB2zcfYf++Q9aAdV7rKQBEuLILK4GGubhU8UQh8MXJQPHqDOwOiwKk2YkAMWNLYBPgFb/z7k73I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770842538; c=relaxed/simple; bh=dc0/f+72fO066qR70nZo/P4imNLuNHmky2aGyXv5bYg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QE8qqeISQfkD6Qm10qkcvKUUZ4MAFQm8ew3tU2GY0enBWjwXRrbiQ8FbWDz247owZQhN5x/1LEg2dggOCYOI63FNgmjCQDyNY5NWDor8JN8rrz+JWD7V08lDccRgxBKhsprhJy3KLMjFSiJGCqxDGZI0T6lux5bxd10ZwXZH2aY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=k7frlLQx; arc=none smtp.client-ip=209.85.160.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="k7frlLQx" Received: by mail-qt1-f169.google.com with SMTP id d75a77b69052e-5032e15525aso68405621cf.3 for ; Wed, 11 Feb 2026 12:42:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1770842535; x=1771447335; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hPnkt2HqQSF9t7HcwfsUe1t/3CrGC8q8jLWUL6hw2HQ=; b=k7frlLQxTORDD9+3nRBpf9XuS8Q5kSBu2nJwh4dH4zB2xbP9/8uh+phLuvbr9MtCJ4 mTvpqW4FJaq1JyIKWUrhuqv/mirOSvYGUesV0jcFElJHOjtphHxcEbXid11qLi4j5/Qq DBl27y7j/uLFxsezcXojVScwEwemXrzzUuSaNGeMqSk1uk5aq2mrbI3dBEEeSXV8B6iZ ud3IinDhBw9PjyjObtOr9WHdkgxm8vNlvZq5JP3qbjCCfHT5uP0dD9aJL6mHp0FRFEck 67p0aRzyHGgPVgf/qQrSoM0sNdxi2LGaysVQvOnwA5jczQCRvK1N7nCsT3Gpfbtp9YZn /TOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770842535; x=1771447335; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=hPnkt2HqQSF9t7HcwfsUe1t/3CrGC8q8jLWUL6hw2HQ=; b=G1roBEQ3rTGQ1s9KD8bSb6/0DzLfsbf792uYXReuLd0w8PAzSLCWtAnwx+qUIJEZcw BTp4Q5aqzgLuWZysuBKuHK/J3FTyL9HCc0GOivBYKC5gZtf58EqUj9NigbrXoeXKOh1z /GaFBvEc/vpway4URmOcZC2JoHGY+VC+GwqSL79aqD/JzD2GmpSBgkyaqLeH+EEW9V3i tcyn8+NdYxeIL6uGuL9zNPPpgd3Xjj12hJ0zViwDIbs9JxxbbnYwBghpWg+DpyxvFby7 6YjcdXB+SMvA6/stWqWBxvX1iMwbtP63z0Q9nRX/kUPvDKxzzQpmv1q7udzVWgmacuR9 AyEQ== X-Gm-Message-State: AOJu0YyhmXmR87YwGaUbNP5taqUUjRuFg0gQzUYzrgyTIGZHoNDEkomc AObBtU6cYxYhTazdDynLxhB7F26ap8qvKfONPdmKqLrMwJCq0nBQmzY1OiYq54in/xQ= X-Gm-Gg: AZuq6aLdqyvsplcgyBHfywglnroR8T1alkFy39i+XYwiF06RD+3qMaDZFagLbx2DEa7 85tO0wsf+f6d/s6o/MqMwSBwpodvOv0YlxEvW5cgC6N4tgMS0rFeRJg5JOZeabFR+RLPeOgCNc1 LQ7JqMssdzQsa9TvnOPxOQEDJ9lkkejm7pTzneeqIJmUIcVX60Bebrrnr3BIZ0Q85CRbPJgzJkh jU+9EcoeEwN3QR9U5J2cJhDLi8lFYofopFLRNfAX3JiMz/b69ZHvjZrTZJKvXTKbraLPdev0d6C YdgAzXcFFQsua863hqDusiqkVIpOrkvff6TqaWCfk+WlTHMTegVD/JhjKIyK+9dkhUXbynY8hLJ mbRai16f0OBs/rBOO7MVcfYsoaQ9O35jKAiCcr1Kb7PgEQaqEZpp16nhnkHg2B5fwxWoSU32+j4 GRny2EUw7i/E5DEshxW6cSIoFhS9/twCq5sCsQtggmWEXMRoe+N5HYldMKFHI+i39BgpXyctY7i PNad0mrIfspEXI= X-Received: by 2002:a05:622a:1a89:b0:501:3c88:131 with SMTP id d75a77b69052e-50691a3643fmr11189491cf.22.1770842535613; Wed, 11 Feb 2026 12:42:15 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-506847d77cesm20173591cf.3.2026.02.11.12.42.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Feb 2026 12:42:15 -0800 (PST) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, "Fabio M. De Francesco" Subject: [PATCH v3 2/3] cxl/core/region: move dax region device logic into region_dax.c Date: Wed, 11 Feb 2026 15:42:05 -0500 Message-ID: <20260211204206.2171525-3-gourry@gourry.net> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260211204206.2171525-1-gourry@gourry.net> References: <20260211204206.2171525-1-gourry@gourry.net> 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" core/region.c is overloaded with per-region control logic (pmem, dax). Move CXL DAX region device logic from region.c into region_dax.c. No functional changes. Reviewed-by: Dave Jiang Reviewed-by: Fabio M. De Francesco Acked-by: Davidlohr Bueso Signed-off-by: Gregory Price --- drivers/cxl/core/Makefile | 1 + drivers/cxl/core/core.h | 1 + drivers/cxl/core/region.c | 99 ------------------------------ drivers/cxl/core/region_dax.c | 109 ++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 99 deletions(-) create mode 100644 drivers/cxl/core/region_dax.c diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile index d1484a0e5eb4..d3ec8aea64c5 100644 --- a/drivers/cxl/core/Makefile +++ b/drivers/cxl/core/Makefile @@ -16,6 +16,7 @@ cxl_core-y +=3D pmu.o cxl_core-y +=3D cdat.o cxl_core-$(CONFIG_TRACING) +=3D trace.o cxl_core-$(CONFIG_CXL_REGION) +=3D region.o +cxl_core-$(CONFIG_CXL_REGION) +=3D region_dax.o cxl_core-$(CONFIG_CXL_REGION) +=3D region_pmem.o cxl_core-$(CONFIG_CXL_MCE) +=3D mce.o cxl_core-$(CONFIG_CXL_FEATURES) +=3D features.o diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index ced65a779a09..a89e0d6d9e7b 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -50,6 +50,7 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 d= pa); u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); +int devm_cxl_add_dax_region(struct cxl_region *cxlr); int devm_cxl_add_pmem_region(struct cxl_region *cxlr); =20 #else diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 1c322318d70e..0c37caa60f2a 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3392,105 +3392,6 @@ static int region_offset_to_dpa_result(struct cxl_r= egion *cxlr, u64 offset, return -ENXIO; } =20 -static void cxl_dax_region_release(struct device *dev) -{ - struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); - - kfree(cxlr_dax); -} - -static const struct attribute_group *cxl_dax_region_attribute_groups[] =3D= { - &cxl_base_attribute_group, - NULL, -}; - -const struct device_type cxl_dax_region_type =3D { - .name =3D "cxl_dax_region", - .release =3D cxl_dax_region_release, - .groups =3D cxl_dax_region_attribute_groups, -}; - -static bool is_cxl_dax_region(struct device *dev) -{ - return dev->type =3D=3D &cxl_dax_region_type; -} - -struct cxl_dax_region *to_cxl_dax_region(struct device *dev) -{ - if (dev_WARN_ONCE(dev, !is_cxl_dax_region(dev), - "not a cxl_dax_region device\n")) - return NULL; - return container_of(dev, struct cxl_dax_region, dev); -} -EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL"); - -static struct lock_class_key cxl_dax_region_key; - -static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr) -{ - struct cxl_region_params *p =3D &cxlr->params; - struct cxl_dax_region *cxlr_dax; - struct device *dev; - - guard(rwsem_read)(&cxl_rwsem.region); - if (p->state !=3D CXL_CONFIG_COMMIT) - return ERR_PTR(-ENXIO); - - cxlr_dax =3D kzalloc(sizeof(*cxlr_dax), GFP_KERNEL); - if (!cxlr_dax) - return ERR_PTR(-ENOMEM); - - cxlr_dax->hpa_range.start =3D p->res->start; - cxlr_dax->hpa_range.end =3D p->res->end; - - dev =3D &cxlr_dax->dev; - cxlr_dax->cxlr =3D cxlr; - device_initialize(dev); - lockdep_set_class(&dev->mutex, &cxl_dax_region_key); - device_set_pm_not_required(dev); - dev->parent =3D &cxlr->dev; - dev->bus =3D &cxl_bus_type; - dev->type =3D &cxl_dax_region_type; - - return cxlr_dax; -} - -static void cxlr_dax_unregister(void *_cxlr_dax) -{ - struct cxl_dax_region *cxlr_dax =3D _cxlr_dax; - - device_unregister(&cxlr_dax->dev); -} - -static int devm_cxl_add_dax_region(struct cxl_region *cxlr) -{ - struct cxl_dax_region *cxlr_dax; - struct device *dev; - int rc; - - cxlr_dax =3D cxl_dax_region_alloc(cxlr); - if (IS_ERR(cxlr_dax)) - return PTR_ERR(cxlr_dax); - - dev =3D &cxlr_dax->dev; - rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); - if (rc) - goto err; - - rc =3D device_add(dev); - if (rc) - goto err; - - dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), - dev_name(dev)); - - return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister, - cxlr_dax); -err: - put_device(dev); - return rc; -} - static int match_root_decoder(struct device *dev, const void *data) { const struct range *r1, *r2 =3D data; diff --git a/drivers/cxl/core/region_dax.c b/drivers/cxl/core/region_dax.c new file mode 100644 index 000000000000..c8dd2bd1d9b9 --- /dev/null +++ b/drivers/cxl/core/region_dax.c @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright(c) 2022 Intel Corporation. All rights reserved. + * Copyright(c) 2026 Meta Technologies Inc. All rights reserved. + */ +#include +#include +#include +#include +#include "core.h" + +static void cxl_dax_region_release(struct device *dev) +{ + struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); + + kfree(cxlr_dax); +} + +static const struct attribute_group *cxl_dax_region_attribute_groups[] =3D= { + &cxl_base_attribute_group, + NULL +}; + +const struct device_type cxl_dax_region_type =3D { + .name =3D "cxl_dax_region", + .release =3D cxl_dax_region_release, + .groups =3D cxl_dax_region_attribute_groups, +}; + +static bool is_cxl_dax_region(struct device *dev) +{ + return dev->type =3D=3D &cxl_dax_region_type; +} + +struct cxl_dax_region *to_cxl_dax_region(struct device *dev) +{ + if (dev_WARN_ONCE(dev, !is_cxl_dax_region(dev), + "not a cxl_dax_region device\n")) + return NULL; + return container_of(dev, struct cxl_dax_region, dev); +} +EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL"); + +static struct lock_class_key cxl_dax_region_key; + +static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + struct cxl_dax_region *cxlr_dax; + struct device *dev; + + guard(rwsem_read)(&cxl_rwsem.region); + if (p->state !=3D CXL_CONFIG_COMMIT) + return ERR_PTR(-ENXIO); + + cxlr_dax =3D kzalloc(sizeof(*cxlr_dax), GFP_KERNEL); + if (!cxlr_dax) + return ERR_PTR(-ENOMEM); + + cxlr_dax->hpa_range.start =3D p->res->start; + cxlr_dax->hpa_range.end =3D p->res->end; + + dev =3D &cxlr_dax->dev; + cxlr_dax->cxlr =3D cxlr; + device_initialize(dev); + lockdep_set_class(&dev->mutex, &cxl_dax_region_key); + device_set_pm_not_required(dev); + dev->parent =3D &cxlr->dev; + dev->bus =3D &cxl_bus_type; + dev->type =3D &cxl_dax_region_type; + + return cxlr_dax; +} + +static void cxlr_dax_unregister(void *_cxlr_dax) +{ + struct cxl_dax_region *cxlr_dax =3D _cxlr_dax; + + device_unregister(&cxlr_dax->dev); +} + +int devm_cxl_add_dax_region(struct cxl_region *cxlr) +{ + struct cxl_dax_region *cxlr_dax; + struct device *dev; + int rc; + + cxlr_dax =3D cxl_dax_region_alloc(cxlr); + if (IS_ERR(cxlr_dax)) + return PTR_ERR(cxlr_dax); + + dev =3D &cxlr_dax->dev; + rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); + if (rc) + goto err; + + rc =3D device_add(dev); + if (rc) + goto err; + + dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), + dev_name(dev)); + + return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister, + cxlr_dax); +err: + put_device(dev); + return rc; +} --=20 2.47.3 From nobody Thu Apr 2 17:44:45 2026 Received: from mail-qt1-f196.google.com (mail-qt1-f196.google.com [209.85.160.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB3CB358D28 for ; Wed, 11 Feb 2026 20:42:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770842540; cv=none; b=GxYUfrOI4qoiqkne5H0CqMITyfdiZmtDQH5kwOltdIuu7ugKeOcjl41bpUp0PpQdA9ltHCiwYth1r+E8KQUHPjy3LY/RqUBqazZRc0qJYwkqk895AKf+9J8tAa31h67XfKgTmaok14ONlwNy4kRzHkJxppK1ilC0FWeLWW8yur0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770842540; c=relaxed/simple; bh=68gV8Gi8YJje3HgGHLLs6Vw7fYde7NjlI0jC39zIQkw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X2EpVD4tkSO94nHYtmrS4H8QTix7/bzfN2mtH8k9bO8+44a5XK2nBYneiDMXI0kltsoLGbGZGoHaTNRVtP+DrKT2nxzqD09SZoOPpHJnHfr14B39ZAd1wmSR701DaObxcBE472HAMFg5+bTGUt39nRtfPiYSmmIsYHK7SD0W8vs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=uJdbPfaG; arc=none smtp.client-ip=209.85.160.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="uJdbPfaG" Received: by mail-qt1-f196.google.com with SMTP id d75a77b69052e-50145d27b4cso82644871cf.2 for ; Wed, 11 Feb 2026 12:42:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1770842538; x=1771447338; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Bo4E78wtZDcFrMggw4PKgwdVgknKzbaZZjHKt3D2+6A=; b=uJdbPfaGuodW/9SNbEEXAnU124XmhA12Grv1PNyvgJpGOwOBNkFzINmtJOwmaf39Tg QEWPzeiXIS3HNmKfWIfE7Lyr+Sm+/JdUrzD8joeP6VugTLERlwQd3pQldszMOw5yXy8h mYeFzNzLP91fir3X0kw57BeGnzwBfzhVgYDkMT4G3tZmG2ncoSmxTkGqZ4QooPmGBCWS cvfHSH9m2ZnnyDRKDYzyZB770yyF35nDSKF7mjtXBfxjNoEQSphELI5cf8axH78E7eKH c8+ohrXaXlgOYwgz8wWBrqM1sRsc6+51RCFAebvh7TKEhIaa+KDmfK/YLOUHh69tZ6o7 QD8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770842538; x=1771447338; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Bo4E78wtZDcFrMggw4PKgwdVgknKzbaZZjHKt3D2+6A=; b=JC5S4DZQOi0t369DXgpsv2oEcE189YfjMsj8hv/6iVC7dv4p2cxC5Fwi6HiYGfOxEv O1kbmcQSDtoMkiLE3IGs8m4pnNf02k6mmyefjMIBYj8OCTgoUzUiGQkospmwOU2ZY9ur 39GDkFFc10UlpBrGKxwrnv6GSY7SbjlkB6aBV+HLEL9xPPVGoVS42NOIh0e/2mee5j+r KEfAjHHLer9t7zbICdY8dPAcTbRW3loSoLiyqPgpb9HpvXB40dAFyA+ge8heR9lAa+AF hM3q/0rJeG44+7049QTw2HvmR11Ibbib8xT1GzIBtHInPJrBeZ06rEMaDrWyOeT8OLqb FHAA== X-Gm-Message-State: AOJu0YwLp/w1vmSVe9vnS8USVYUqVjPLhNcCYDU9xcJavUyJR58qT2D2 ZW6gIh0yfh88QHsBSPzn+IZXaTTydXuGfhfZOoxS0muVpGdVy/WR4J0Lx/TJktWYMbdvL/hrFpt 1q2BA X-Gm-Gg: AZuq6aJniKX/UeGMrgoSFdeSQV+BUDkdxUOe+v9jEsn/sjbqzj+zReaJ/Keoh/K1Gtl acx6bel+SASknL3Hb2T3Xx/CCAN5h1EipNO+EZtt2/ipQbm+ha/NEMP657d1nLnb3TAUMsDFvSt F8GABsPakLOOGBWCPmXpIO6RwTTcfI+BnGY/VJOscYYaM3iaO79Nn5dBM1AOT4gqH/i3Nca/afQ Auj+du/CZuG0q6VFwDg3wBF8h+IO7KBkQDyC5Std3eK8FZIlF5nKWLfF7srhegUCXh65nDUTNdc ORUBXNuV2fXEGfGf6YRa1YUuDSBspjUX+H6oKjOlAIy8IGGUDj0vDtUnsyITnH8DCIXjLecUCUq gM+uFKGRP2GMLZSWraMcEXtMwGym6LunZhyy9uJM49eAvoCULy29L5dNj8S+A8leukWyGzhxpJz hmC6yPizcQr7lw6vSobnGZtxl1QR86bS3v2u5xbxArB8KSe8RQb4qos4UjSCC6n3zW8gXbZbrJC uGM62Hsc8bWrCdDmTW7W+lS1w== X-Received: by 2002:a05:622a:1207:b0:501:b1d8:6376 with SMTP id d75a77b69052e-50691c7df39mr11461951cf.76.1770842537773; Wed, 11 Feb 2026 12:42:17 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-506847d77cesm20173591cf.3.2026.02.11.12.42.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Feb 2026 12:42:17 -0800 (PST) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com Subject: [PATCH v3 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region Date: Wed, 11 Feb 2026 15:42:06 -0500 Message-ID: <20260211204206.2171525-4-gourry@gourry.net> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260211204206.2171525-1-gourry@gourry.net> References: <20260211204206.2171525-1-gourry@gourry.net> 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" Cleanup the gotos in the function. No functional change intended. Signed-off-by: Gregory Price --- drivers/cxl/core/region_dax.c | 21 ++++++++------------- drivers/cxl/cxl.h | 1 + 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/drivers/cxl/core/region_dax.c b/drivers/cxl/core/region_dax.c index c8dd2bd1d9b9..49907c6c7620 100644 --- a/drivers/cxl/core/region_dax.c +++ b/drivers/cxl/core/region_dax.c @@ -81,29 +81,24 @@ static void cxlr_dax_unregister(void *_cxlr_dax) =20 int devm_cxl_add_dax_region(struct cxl_region *cxlr) { - struct cxl_dax_region *cxlr_dax; - struct device *dev; + struct cxl_dax_region *cxlr_dax __free(put_cxl_dax_region) =3D NULL; int rc; =20 cxlr_dax =3D cxl_dax_region_alloc(cxlr); if (IS_ERR(cxlr_dax)) return PTR_ERR(cxlr_dax); =20 - dev =3D &cxlr_dax->dev; - rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); + rc =3D dev_set_name(&cxlr_dax->dev, "dax_region%d", cxlr->id); if (rc) - goto err; + return rc; =20 - rc =3D device_add(dev); + rc =3D device_add(&cxlr_dax->dev); if (rc) - goto err; + return rc; =20 - dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), - dev_name(dev)); + dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(cxlr_dax->dev.parent), + dev_name(&cxlr_dax->dev)); =20 return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister, - cxlr_dax); -err: - put_device(dev); - return rc; + no_free_ptr(cxlr_dax)); } diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 04c673e7cdb0..0b59008ea45a 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -803,6 +803,7 @@ DEFINE_FREE(put_cxl_root, struct cxl_root *, if (_T) pu= t_device(&_T->port.dev)) DEFINE_FREE(put_cxl_port, struct cxl_port *, if (!IS_ERR_OR_NULL(_T)) put_= device(&_T->dev)) DEFINE_FREE(put_cxl_root_decoder, struct cxl_root_decoder *, if (!IS_ERR_O= R_NULL(_T)) put_device(&_T->cxlsd.cxld.dev)) DEFINE_FREE(put_cxl_region, struct cxl_region *, if (!IS_ERR_OR_NULL(_T)) = put_device(&_T->dev)) +DEFINE_FREE(put_cxl_dax_region, struct cxl_dax_region *, if (!IS_ERR_OR_NU= LL(_T)) put_device(&_T->dev)) =20 int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd); void cxl_bus_rescan(void); --=20 2.47.3