* [PATCH v5 0/3] pull region-specific logic into new files
@ 2026-03-27 2:02 Gregory Price
2026-03-27 2:02 ` [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c Gregory Price
` (3 more replies)
0 siblings, 4 replies; 13+ messages in thread
From: Gregory Price @ 2026-03-27 2:02 UTC (permalink / raw)
To: linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
cxl/core/region.c presently contains logic to handle cxl_region,
cxl_pmem_region, and cxl_dax_region. The cxl_pmem_region and
cxl_dax_region management code deserves new files to make it clear
that this logic applies to a specific types of regions.
This also breaks up development space so fewer conflicts can occur, and
it becomes clear where changes are actually happening.
I snuck in a cleanup.h fixup for devm_cxl_add_dax_region to tidy up some
of the existing functions.
v4 -> v5: Ira test fixes
Jonathan nit fixes
v3 -> v4: address DJ's feedback on cleanup.h patch:
move __free() declaration to assignment point
restore local dev variable
v2 -> v3: renamed from x_region to region_x because it's prettier
added cleanup.h
small nits asked for by Jonathan (commas)
Gregory Price (3):
cxl/core/region: move pmem region driver logic into region_pmem.c
cxl/core/region: move dax region device logic into region_dax.c
cxl/core: use cleanup.h for devm_cxl_add_dax_region
drivers/cxl/core/Makefile | 2 +-
drivers/cxl/core/core.h | 2 +
drivers/cxl/core/region.c | 283 ---------------------------------
drivers/cxl/core/region_dax.c | 106 ++++++++++++
drivers/cxl/core/region_pmem.c | 191 ++++++++++++++++++++++
drivers/cxl/cxl.h | 1 +
tools/testing/cxl/Kbuild | 2 +-
7 files changed, 302 insertions(+), 285 deletions(-)
create mode 100644 drivers/cxl/core/region_dax.c
create mode 100644 drivers/cxl/core/region_pmem.c
--
2.53.0
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c
2026-03-27 2:02 [PATCH v5 0/3] pull region-specific logic into new files Gregory Price
@ 2026-03-27 2:02 ` Gregory Price
2026-03-27 16:56 ` Ira Weiny
2026-03-27 2:02 ` [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c Gregory Price
` (2 subsequent siblings)
3 siblings, 1 reply; 13+ messages in thread
From: Gregory Price @ 2026-03-27 2:02 UTC (permalink / raw)
To: linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
core/region.c is overloaded with per-region control logic (pmem, dax,
sysram, etc). Move the pmem region driver logic from region.c into
region_pmem.c make it clear that this code only applies to pmem regions.
No functional changes.
Signed-off-by: Gregory Price <gourry@gourry.net>
Co-developed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
drivers/cxl/core/Makefile | 2 +-
drivers/cxl/core/core.h | 1 +
drivers/cxl/core/region.c | 184 -------------------------------
drivers/cxl/core/region_pmem.c | 191 +++++++++++++++++++++++++++++++++
tools/testing/cxl/Kbuild | 2 +-
5 files changed, 194 insertions(+), 186 deletions(-)
create mode 100644 drivers/cxl/core/region_pmem.c
diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile
index a639a9499972..f73776fe323b 100644
--- a/drivers/cxl/core/Makefile
+++ b/drivers/cxl/core/Makefile
@@ -15,7 +15,7 @@ cxl_core-y += hdm.o
cxl_core-y += pmu.o
cxl_core-y += cdat.o
cxl_core-$(CONFIG_TRACING) += trace.o
-cxl_core-$(CONFIG_CXL_REGION) += region.o
+cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o
cxl_core-$(CONFIG_CXL_MCE) += mce.o
cxl_core-$(CONFIG_CXL_FEATURES) += features.o
cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += edac.o
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index 5539e941782f..ef03966eeabd 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 dpa);
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);
#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 f24b7e754727..72aee1408efb 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -2781,46 +2781,6 @@ static ssize_t delete_region_store(struct device *dev,
}
DEVICE_ATTR_WO(delete_region);
-static void cxl_pmem_region_release(struct device *dev)
-{
- struct cxl_pmem_region *cxlr_pmem = to_cxl_pmem_region(dev);
- int i;
-
- for (i = 0; i < cxlr_pmem->nr_mappings; i++) {
- struct cxl_memdev *cxlmd = cxlr_pmem->mapping[i].cxlmd;
-
- put_device(&cxlmd->dev);
- }
-
- kfree(cxlr_pmem);
-}
-
-static const struct attribute_group *cxl_pmem_region_attribute_groups[] = {
- &cxl_base_attribute_group,
- NULL,
-};
-
-const struct device_type cxl_pmem_region_type = {
- .name = "cxl_pmem_region",
- .release = cxl_pmem_region_release,
- .groups = cxl_pmem_region_attribute_groups,
-};
-
-bool is_cxl_pmem_region(struct device *dev)
-{
- return dev->type == &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;
@@ -3476,64 +3436,6 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
return -ENXIO;
}
-static struct lock_class_key cxl_pmem_region_key;
-
-static int cxl_pmem_region_alloc(struct cxl_region *cxlr)
-{
- struct cxl_region_params *p = &cxlr->params;
- struct cxl_nvdimm_bridge *cxl_nvb;
- struct device *dev;
- int i;
-
- guard(rwsem_read)(&cxl_rwsem.region);
- if (p->state != CXL_CONFIG_COMMIT)
- return -ENXIO;
-
- struct cxl_pmem_region *cxlr_pmem __free(kfree) =
- kzalloc_flex(*cxlr_pmem, mapping, p->nr_targets);
- if (!cxlr_pmem)
- return -ENOMEM;
-
- cxlr_pmem->hpa_range.start = p->res->start;
- cxlr_pmem->hpa_range.end = p->res->end;
-
- /* Snapshot the region configuration underneath the cxl_rwsem.region */
- cxlr_pmem->nr_mappings = p->nr_targets;
- for (i = 0; i < p->nr_targets; i++) {
- struct cxl_endpoint_decoder *cxled = p->targets[i];
- struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
- struct cxl_pmem_region_mapping *m = &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 == 0) {
- cxl_nvb = cxl_find_nvdimm_bridge(cxlmd->endpoint);
- if (!cxl_nvb)
- return -ENODEV;
- cxlr->cxl_nvb = cxl_nvb;
- }
- m->cxlmd = cxlmd;
- get_device(&cxlmd->dev);
- m->start = cxled->dpa_res->start;
- m->size = resource_size(cxled->dpa_res);
- m->position = i;
- }
-
- dev = &cxlr_pmem->dev;
- device_initialize(dev);
- lockdep_set_class(&dev->mutex, &cxl_pmem_region_key);
- device_set_pm_not_required(dev);
- dev->parent = &cxlr->dev;
- dev->bus = &cxl_bus_type;
- dev->type = &cxl_pmem_region_type;
- cxlr_pmem->cxlr = cxlr;
- cxlr->cxlr_pmem = no_free_ptr(cxlr_pmem);
-
- return 0;
-}
-
static void cxl_dax_region_release(struct device *dev)
{
struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
@@ -3597,92 +3499,6 @@ static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr)
return cxlr_dax;
}
-static void cxlr_pmem_unregister(void *_cxlr_pmem)
-{
- struct cxl_pmem_region *cxlr_pmem = _cxlr_pmem;
- struct cxl_region *cxlr = cxlr_pmem->cxlr;
- struct cxl_nvdimm_bridge *cxl_nvb = 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 = NULL;
- cxlr_pmem->cxlr = NULL;
- device_unregister(&cxlr_pmem->dev);
-}
-
-static void cxlr_release_nvdimm(void *_cxlr)
-{
- struct cxl_region *cxlr = _cxlr;
- struct cxl_nvdimm_bridge *cxl_nvb = 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 = 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 = cxl_pmem_region_alloc(cxlr);
- if (rc)
- return rc;
- cxlr_pmem = cxlr->cxlr_pmem;
- cxl_nvb = cxlr->cxl_nvb;
-
- dev = &cxlr_pmem->dev;
- rc = dev_set_name(dev, "pmem_region%d", cxlr->id);
- if (rc)
- goto err;
-
- rc = 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 = devm_add_action_or_reset(&cxl_nvb->dev,
- cxlr_pmem_unregister,
- cxlr_pmem);
- else
- rc = -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 = NULL;
- return rc;
-}
-
static void cxlr_dax_unregister(void *_cxlr_dax)
{
struct cxl_dax_region *cxlr_dax = _cxlr_dax;
diff --git a/drivers/cxl/core/region_pmem.c b/drivers/cxl/core/region_pmem.c
new file mode 100644
index 000000000000..b2f1e567d398
--- /dev/null
+++ b/drivers/cxl/core/region_pmem.c
@@ -0,0 +1,191 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright(c) 2022 Intel Corporation. All rights reserved. */
+#include <linux/device.h>
+#include <linux/slab.h>
+#include <cxlmem.h>
+#include <cxl.h>
+#include "core.h"
+
+static void cxl_pmem_region_release(struct device *dev)
+{
+ struct cxl_pmem_region *cxlr_pmem = to_cxl_pmem_region(dev);
+ int i;
+
+ for (i = 0; i < cxlr_pmem->nr_mappings; i++) {
+ struct cxl_memdev *cxlmd = cxlr_pmem->mapping[i].cxlmd;
+
+ put_device(&cxlmd->dev);
+ }
+
+ kfree(cxlr_pmem);
+}
+
+static const struct attribute_group *cxl_pmem_region_attribute_groups[] = {
+ &cxl_base_attribute_group,
+ NULL
+};
+
+const struct device_type cxl_pmem_region_type = {
+ .name = "cxl_pmem_region",
+ .release = cxl_pmem_region_release,
+ .groups = cxl_pmem_region_attribute_groups,
+};
+
+bool is_cxl_pmem_region(struct device *dev)
+{
+ return dev->type == &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 = &cxlr->params;
+ struct cxl_nvdimm_bridge *cxl_nvb;
+ struct device *dev;
+ int i;
+
+ guard(rwsem_read)(&cxl_rwsem.region);
+ if (p->state != CXL_CONFIG_COMMIT)
+ return -ENXIO;
+
+ struct cxl_pmem_region *cxlr_pmem __free(kfree) =
+ kzalloc_flex(*cxlr_pmem, mapping, p->nr_targets);
+ if (!cxlr_pmem)
+ return -ENOMEM;
+
+ cxlr_pmem->hpa_range.start = p->res->start;
+ cxlr_pmem->hpa_range.end = p->res->end;
+
+ /* Snapshot the region configuration underneath the cxl_rwsem.region */
+ cxlr_pmem->nr_mappings = p->nr_targets;
+ for (i = 0; i < p->nr_targets; i++) {
+ struct cxl_endpoint_decoder *cxled = p->targets[i];
+ struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
+ struct cxl_pmem_region_mapping *m = &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 == 0) {
+ cxl_nvb = cxl_find_nvdimm_bridge(cxlmd->endpoint);
+ if (!cxl_nvb)
+ return -ENODEV;
+ cxlr->cxl_nvb = cxl_nvb;
+ }
+ m->cxlmd = cxlmd;
+ get_device(&cxlmd->dev);
+ m->start = cxled->dpa_res->start;
+ m->size = resource_size(cxled->dpa_res);
+ m->position = i;
+ }
+
+ dev = &cxlr_pmem->dev;
+ device_initialize(dev);
+ lockdep_set_class(&dev->mutex, &cxl_pmem_region_key);
+ device_set_pm_not_required(dev);
+ dev->parent = &cxlr->dev;
+ dev->bus = &cxl_bus_type;
+ dev->type = &cxl_pmem_region_type;
+ cxlr_pmem->cxlr = cxlr;
+ cxlr->cxlr_pmem = no_free_ptr(cxlr_pmem);
+
+ return 0;
+}
+
+static void cxlr_pmem_unregister(void *_cxlr_pmem)
+{
+ struct cxl_pmem_region *cxlr_pmem = _cxlr_pmem;
+ struct cxl_region *cxlr = cxlr_pmem->cxlr;
+ struct cxl_nvdimm_bridge *cxl_nvb = 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 = NULL;
+ cxlr_pmem->cxlr = NULL;
+ device_unregister(&cxlr_pmem->dev);
+}
+
+static void cxlr_release_nvdimm(void *_cxlr)
+{
+ struct cxl_region *cxlr = _cxlr;
+ struct cxl_nvdimm_bridge *cxl_nvb = 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 = 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 = cxl_pmem_region_alloc(cxlr);
+ if (rc)
+ return rc;
+ cxlr_pmem = cxlr->cxlr_pmem;
+ cxl_nvb = cxlr->cxl_nvb;
+
+ dev = &cxlr_pmem->dev;
+ rc = dev_set_name(dev, "pmem_region%d", cxlr->id);
+ if (rc)
+ goto err;
+
+ rc = 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 = devm_add_action_or_reset(&cxl_nvb->dev,
+ cxlr_pmem_unregister,
+ cxlr_pmem);
+ else
+ rc = -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 = NULL;
+ return rc;
+}
diff --git a/tools/testing/cxl/Kbuild b/tools/testing/cxl/Kbuild
index 53d84a6874b7..f53d79a05661 100644
--- a/tools/testing/cxl/Kbuild
+++ b/tools/testing/cxl/Kbuild
@@ -59,7 +59,7 @@ cxl_core-y += $(CXL_CORE_SRC)/hdm.o
cxl_core-y += $(CXL_CORE_SRC)/pmu.o
cxl_core-y += $(CXL_CORE_SRC)/cdat.o
cxl_core-$(CONFIG_TRACING) += $(CXL_CORE_SRC)/trace.o
-cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o
+cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o
cxl_core-$(CONFIG_CXL_MCE) += $(CXL_CORE_SRC)/mce.o
cxl_core-$(CONFIG_CXL_FEATURES) += $(CXL_CORE_SRC)/features.o
cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += $(CXL_CORE_SRC)/edac.o
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-03-27 2:02 [PATCH v5 0/3] pull region-specific logic into new files Gregory Price
2026-03-27 2:02 ` [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c Gregory Price
@ 2026-03-27 2:02 ` Gregory Price
2026-03-27 16:57 ` Ira Weiny
2026-04-11 0:02 ` Anisa Su
2026-03-27 2:02 ` [PATCH v5 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region Gregory Price
2026-03-27 18:57 ` [PATCH v5 0/3] pull region-specific logic into new files Dave Jiang
3 siblings, 2 replies; 13+ messages in thread
From: Gregory Price @ 2026-03-27 2:02 UTC (permalink / raw)
To: linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
core/region.c is overloaded with per-region control logic (pmem, dax,
sysram, etc). Move the CXL DAX region device infrastructure from
region.c into a new region_dax.c file.
This will also allow us to add additional dax-driver integration paths
that don't further dirty the core region.c logic.
No functional changes.
Signed-off-by: Gregory Price <gourry@gourry.net>
Co-developed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
drivers/cxl/core/Makefile | 2 +-
drivers/cxl/core/core.h | 1 +
drivers/cxl/core/region.c | 99 ------------------------------
drivers/cxl/core/region_dax.c | 109 ++++++++++++++++++++++++++++++++++
tools/testing/cxl/Kbuild | 2 +-
5 files changed, 112 insertions(+), 101 deletions(-)
create mode 100644 drivers/cxl/core/region_dax.c
diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile
index f73776fe323b..ce7213818d3c 100644
--- a/drivers/cxl/core/Makefile
+++ b/drivers/cxl/core/Makefile
@@ -15,7 +15,7 @@ cxl_core-y += hdm.o
cxl_core-y += pmu.o
cxl_core-y += cdat.o
cxl_core-$(CONFIG_TRACING) += trace.o
-cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o
+cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o region_dax.o
cxl_core-$(CONFIG_CXL_MCE) += mce.o
cxl_core-$(CONFIG_CXL_FEATURES) += features.o
cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += edac.o
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index ef03966eeabd..82ca3a476708 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 dpa);
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);
#else
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 72aee1408efb..6a2ef3475764 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -3436,105 +3436,6 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
return -ENXIO;
}
-static void cxl_dax_region_release(struct device *dev)
-{
- struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
-
- kfree(cxlr_dax);
-}
-
-static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
- &cxl_base_attribute_group,
- NULL,
-};
-
-const struct device_type cxl_dax_region_type = {
- .name = "cxl_dax_region",
- .release = cxl_dax_region_release,
- .groups = cxl_dax_region_attribute_groups,
-};
-
-static bool is_cxl_dax_region(struct device *dev)
-{
- return dev->type == &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 = &cxlr->params;
- struct cxl_dax_region *cxlr_dax;
- struct device *dev;
-
- guard(rwsem_read)(&cxl_rwsem.region);
- if (p->state != CXL_CONFIG_COMMIT)
- return ERR_PTR(-ENXIO);
-
- cxlr_dax = kzalloc_obj(*cxlr_dax);
- if (!cxlr_dax)
- return ERR_PTR(-ENOMEM);
-
- cxlr_dax->hpa_range.start = p->res->start;
- cxlr_dax->hpa_range.end = p->res->end;
-
- dev = &cxlr_dax->dev;
- cxlr_dax->cxlr = cxlr;
- device_initialize(dev);
- lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
- device_set_pm_not_required(dev);
- dev->parent = &cxlr->dev;
- dev->bus = &cxl_bus_type;
- dev->type = &cxl_dax_region_type;
-
- return cxlr_dax;
-}
-
-static void cxlr_dax_unregister(void *_cxlr_dax)
-{
- struct cxl_dax_region *cxlr_dax = _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 = cxl_dax_region_alloc(cxlr);
- if (IS_ERR(cxlr_dax))
- return PTR_ERR(cxlr_dax);
-
- dev = &cxlr_dax->dev;
- rc = dev_set_name(dev, "dax_region%d", cxlr->id);
- if (rc)
- goto err;
-
- rc = 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 = data;
diff --git a/drivers/cxl/core/region_dax.c b/drivers/cxl/core/region_dax.c
new file mode 100644
index 000000000000..fe367759ac69
--- /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 <linux/device.h>
+#include <linux/slab.h>
+#include <cxlmem.h>
+#include <cxl.h>
+#include "core.h"
+
+static void cxl_dax_region_release(struct device *dev)
+{
+ struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
+
+ kfree(cxlr_dax);
+}
+
+static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
+ &cxl_base_attribute_group,
+ NULL
+};
+
+const struct device_type cxl_dax_region_type = {
+ .name = "cxl_dax_region",
+ .release = cxl_dax_region_release,
+ .groups = cxl_dax_region_attribute_groups,
+};
+
+static bool is_cxl_dax_region(struct device *dev)
+{
+ return dev->type == &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 = &cxlr->params;
+ struct cxl_dax_region *cxlr_dax;
+ struct device *dev;
+
+ guard(rwsem_read)(&cxl_rwsem.region);
+ if (p->state != CXL_CONFIG_COMMIT)
+ return ERR_PTR(-ENXIO);
+
+ cxlr_dax = kzalloc_obj(*cxlr_dax);
+ if (!cxlr_dax)
+ return ERR_PTR(-ENOMEM);
+
+ cxlr_dax->hpa_range.start = p->res->start;
+ cxlr_dax->hpa_range.end = p->res->end;
+
+ dev = &cxlr_dax->dev;
+ cxlr_dax->cxlr = cxlr;
+ device_initialize(dev);
+ lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
+ device_set_pm_not_required(dev);
+ dev->parent = &cxlr->dev;
+ dev->bus = &cxl_bus_type;
+ dev->type = &cxl_dax_region_type;
+
+ return cxlr_dax;
+}
+
+static void cxlr_dax_unregister(void *_cxlr_dax)
+{
+ struct cxl_dax_region *cxlr_dax = _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 = cxl_dax_region_alloc(cxlr);
+ if (IS_ERR(cxlr_dax))
+ return PTR_ERR(cxlr_dax);
+
+ dev = &cxlr_dax->dev;
+ rc = dev_set_name(dev, "dax_region%d", cxlr->id);
+ if (rc)
+ goto err;
+
+ rc = 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;
+}
diff --git a/tools/testing/cxl/Kbuild b/tools/testing/cxl/Kbuild
index f53d79a05661..d2b291e5f842 100644
--- a/tools/testing/cxl/Kbuild
+++ b/tools/testing/cxl/Kbuild
@@ -59,7 +59,7 @@ cxl_core-y += $(CXL_CORE_SRC)/hdm.o
cxl_core-y += $(CXL_CORE_SRC)/pmu.o
cxl_core-y += $(CXL_CORE_SRC)/cdat.o
cxl_core-$(CONFIG_TRACING) += $(CXL_CORE_SRC)/trace.o
-cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o
+cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o $(CXL_CORE_SRC)/region_dax.o
cxl_core-$(CONFIG_CXL_MCE) += $(CXL_CORE_SRC)/mce.o
cxl_core-$(CONFIG_CXL_FEATURES) += $(CXL_CORE_SRC)/features.o
cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += $(CXL_CORE_SRC)/edac.o
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v5 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region
2026-03-27 2:02 [PATCH v5 0/3] pull region-specific logic into new files Gregory Price
2026-03-27 2:02 ` [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c Gregory Price
2026-03-27 2:02 ` [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c Gregory Price
@ 2026-03-27 2:02 ` Gregory Price
2026-03-27 17:05 ` Ira Weiny
2026-03-27 18:57 ` [PATCH v5 0/3] pull region-specific logic into new files Dave Jiang
3 siblings, 1 reply; 13+ messages in thread
From: Gregory Price @ 2026-03-27 2:02 UTC (permalink / raw)
To: linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
Cleanup the gotos in the function. No functional change.
Signed-off-by: Gregory Price <gourry@gourry.net>
---
drivers/cxl/core/region_dax.c | 13 +++++--------
drivers/cxl/cxl.h | 1 +
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/cxl/core/region_dax.c b/drivers/cxl/core/region_dax.c
index fe367759ac69..de04f78f6ad8 100644
--- a/drivers/cxl/core/region_dax.c
+++ b/drivers/cxl/core/region_dax.c
@@ -81,29 +81,26 @@ static void cxlr_dax_unregister(void *_cxlr_dax)
int devm_cxl_add_dax_region(struct cxl_region *cxlr)
{
- struct cxl_dax_region *cxlr_dax;
struct device *dev;
int rc;
- cxlr_dax = cxl_dax_region_alloc(cxlr);
+ struct cxl_dax_region *cxlr_dax __free(put_cxl_dax_region) =
+ cxl_dax_region_alloc(cxlr);
if (IS_ERR(cxlr_dax))
return PTR_ERR(cxlr_dax);
dev = &cxlr_dax->dev;
rc = dev_set_name(dev, "dax_region%d", cxlr->id);
if (rc)
- goto err;
+ return rc;
rc = device_add(dev);
if (rc)
- goto err;
+ return rc;
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;
+ no_free_ptr(cxlr_dax));
}
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index f08be12e0e53..249a2f5ffc7b 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -712,6 +712,7 @@ DEFINE_FREE(put_cxl_root, struct cxl_root *, if (_T) put_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_OR_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_NULL(_T)) put_device(&_T->dev))
int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd);
void cxl_bus_rescan(void);
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c
2026-03-27 2:02 ` [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c Gregory Price
@ 2026-03-27 16:56 ` Ira Weiny
0 siblings, 0 replies; 13+ messages in thread
From: Ira Weiny @ 2026-03-27 16:56 UTC (permalink / raw)
To: Gregory Price, linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
Gregory Price wrote:
> core/region.c is overloaded with per-region control logic (pmem, dax,
> sysram, etc). Move the pmem region driver logic from region.c into
> region_pmem.c make it clear that this code only applies to pmem regions.
>
> No functional changes.
>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Gregory Price <gourry@gourry.net>
> Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
> ---
[snip]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-03-27 2:02 ` [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c Gregory Price
@ 2026-03-27 16:57 ` Ira Weiny
2026-04-11 0:02 ` Anisa Su
1 sibling, 0 replies; 13+ messages in thread
From: Ira Weiny @ 2026-03-27 16:57 UTC (permalink / raw)
To: Gregory Price, linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
Gregory Price wrote:
> core/region.c is overloaded with per-region control logic (pmem, dax,
> sysram, etc). Move the CXL DAX region device infrastructure from
> region.c into a new region_dax.c file.
>
> This will also allow us to add additional dax-driver integration paths
> that don't further dirty the core region.c logic.
>
> No functional changes.
>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Gregory Price <gourry@gourry.net>
> Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
> ---
[snip]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region
2026-03-27 2:02 ` [PATCH v5 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region Gregory Price
@ 2026-03-27 17:05 ` Ira Weiny
0 siblings, 0 replies; 13+ messages in thread
From: Ira Weiny @ 2026-03-27 17:05 UTC (permalink / raw)
To: Gregory Price, linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron, dave.jiang,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
Gregory Price wrote:
> Cleanup the gotos in the function. No functional change.
>
> Signed-off-by: Gregory Price <gourry@gourry.net>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
[snip]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 0/3] pull region-specific logic into new files
2026-03-27 2:02 [PATCH v5 0/3] pull region-specific logic into new files Gregory Price
` (2 preceding siblings ...)
2026-03-27 2:02 ` [PATCH v5 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region Gregory Price
@ 2026-03-27 18:57 ` Dave Jiang
3 siblings, 0 replies; 13+ messages in thread
From: Dave Jiang @ 2026-03-27 18:57 UTC (permalink / raw)
To: Gregory Price, linux-cxl
Cc: linux-kernel, kernel-team, dave, jonathan.cameron,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
On 3/26/26 7:02 PM, Gregory Price wrote:
> cxl/core/region.c presently contains logic to handle cxl_region,
> cxl_pmem_region, and cxl_dax_region. The cxl_pmem_region and
> cxl_dax_region management code deserves new files to make it clear
> that this logic applies to a specific types of regions.
>
> This also breaks up development space so fewer conflicts can occur, and
> it becomes clear where changes are actually happening.
>
> I snuck in a cleanup.h fixup for devm_cxl_add_dax_region to tidy up some
> of the existing functions.
>
> v4 -> v5: Ira test fixes
> Jonathan nit fixes
>
> v3 -> v4: address DJ's feedback on cleanup.h patch:
> move __free() declaration to assignment point
> restore local dev variable
>
> v2 -> v3: renamed from x_region to region_x because it's prettier
> added cleanup.h
> small nits asked for by Jonathan (commas)
>
> Gregory Price (3):
> cxl/core/region: move pmem region driver logic into region_pmem.c
> cxl/core/region: move dax region device logic into region_dax.c
> cxl/core: use cleanup.h for devm_cxl_add_dax_region
>
> drivers/cxl/core/Makefile | 2 +-
> drivers/cxl/core/core.h | 2 +
> drivers/cxl/core/region.c | 283 ---------------------------------
> drivers/cxl/core/region_dax.c | 106 ++++++++++++
> drivers/cxl/core/region_pmem.c | 191 ++++++++++++++++++++++
> drivers/cxl/cxl.h | 1 +
> tools/testing/cxl/Kbuild | 2 +-
> 7 files changed, 302 insertions(+), 285 deletions(-)
> create mode 100644 drivers/cxl/core/region_dax.c
> create mode 100644 drivers/cxl/core/region_pmem.c
>
I applied to for-7.1/cxl-region-refactor branch and pushed to the cxl.git so it gets 0-day coverage. But I'm going hold off until the end to merge this in case of merge conflicts.
29990ab5cb40 cxl/core: use cleanup.h for devm_cxl_add_dax_region
d747cf98f091 cxl/core/region: move dax region device logic into region_dax.c
8a1ec5fb2360 cxl/core/region: move pmem region driver logic into region_pmem.c
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-03-27 2:02 ` [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c Gregory Price
2026-03-27 16:57 ` Ira Weiny
@ 2026-04-11 0:02 ` Anisa Su
2026-04-11 0:26 ` Dave Jiang
2026-04-11 5:09 ` Gregory Price
1 sibling, 2 replies; 13+ messages in thread
From: Anisa Su @ 2026-04-11 0:02 UTC (permalink / raw)
To: Gregory Price
Cc: linux-cxl, linux-kernel, kernel-team, dave, jonathan.cameron,
dave.jiang, alison.schofield, vishal.l.verma, ira.weiny,
dan.j.williams
On Thu, Mar 26, 2026 at 10:02:02PM -0400, Gregory Price wrote:
> core/region.c is overloaded with per-region control logic (pmem, dax,
> sysram, etc). Move the CXL DAX region device infrastructure from
> region.c into a new region_dax.c file.
>
> This will also allow us to add additional dax-driver integration paths
> that don't further dirty the core region.c logic.
>
> No functional changes.
>
> Signed-off-by: Gregory Price <gourry@gourry.net>
> Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
> ---
> drivers/cxl/core/Makefile | 2 +-
> drivers/cxl/core/core.h | 1 +
> drivers/cxl/core/region.c | 99 ------------------------------
> drivers/cxl/core/region_dax.c | 109 ++++++++++++++++++++++++++++++++++
> tools/testing/cxl/Kbuild | 2 +-
> 5 files changed, 112 insertions(+), 101 deletions(-)
> create mode 100644 drivers/cxl/core/region_dax.c
>
> diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile
> index f73776fe323b..ce7213818d3c 100644
> --- a/drivers/cxl/core/Makefile
> +++ b/drivers/cxl/core/Makefile
> @@ -15,7 +15,7 @@ cxl_core-y += hdm.o
> cxl_core-y += pmu.o
> cxl_core-y += cdat.o
> cxl_core-$(CONFIG_TRACING) += trace.o
> -cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o
> +cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o region_dax.o
> cxl_core-$(CONFIG_CXL_MCE) += mce.o
> cxl_core-$(CONFIG_CXL_FEATURES) += features.o
> cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += edac.o
> diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
> index ef03966eeabd..82ca3a476708 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 dpa);
> 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);
>
> #else
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index 72aee1408efb..6a2ef3475764 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -3436,105 +3436,6 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
> return -ENXIO;
> }
>
> -static void cxl_dax_region_release(struct device *dev)
> -{
> - struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
> -
> - kfree(cxlr_dax);
> -}
> -
> -static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
> - &cxl_base_attribute_group,
> - NULL,
> -};
> -
> -const struct device_type cxl_dax_region_type = {
> - .name = "cxl_dax_region",
> - .release = cxl_dax_region_release,
> - .groups = cxl_dax_region_attribute_groups,
> -};
> -
> -static bool is_cxl_dax_region(struct device *dev)
> -{
> - return dev->type == &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 = &cxlr->params;
> - struct cxl_dax_region *cxlr_dax;
> - struct device *dev;
> -
> - guard(rwsem_read)(&cxl_rwsem.region);
> - if (p->state != CXL_CONFIG_COMMIT)
> - return ERR_PTR(-ENXIO);
> -
> - cxlr_dax = kzalloc_obj(*cxlr_dax);
> - if (!cxlr_dax)
> - return ERR_PTR(-ENOMEM);
> -
> - cxlr_dax->hpa_range.start = p->res->start;
> - cxlr_dax->hpa_range.end = p->res->end;
> -
> - dev = &cxlr_dax->dev;
> - cxlr_dax->cxlr = cxlr;
> - device_initialize(dev);
> - lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
> - device_set_pm_not_required(dev);
> - dev->parent = &cxlr->dev;
> - dev->bus = &cxl_bus_type;
> - dev->type = &cxl_dax_region_type;
> -
> - return cxlr_dax;
> -}
> -
> -static void cxlr_dax_unregister(void *_cxlr_dax)
> -{
> - struct cxl_dax_region *cxlr_dax = _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 = cxl_dax_region_alloc(cxlr);
> - if (IS_ERR(cxlr_dax))
> - return PTR_ERR(cxlr_dax);
> -
> - dev = &cxlr_dax->dev;
> - rc = dev_set_name(dev, "dax_region%d", cxlr->id);
> - if (rc)
> - goto err;
> -
> - rc = 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 = data;
> diff --git a/drivers/cxl/core/region_dax.c b/drivers/cxl/core/region_dax.c
> new file mode 100644
> index 000000000000..fe367759ac69
> --- /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 <linux/device.h>
> +#include <linux/slab.h>
> +#include <cxlmem.h>
> +#include <cxl.h>
> +#include "core.h"
> +
> +static void cxl_dax_region_release(struct device *dev)
> +{
> + struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
> +
> + kfree(cxlr_dax);
> +}
> +
> +static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
> + &cxl_base_attribute_group,
> + NULL
> +};
> +
> +const struct device_type cxl_dax_region_type = {
> + .name = "cxl_dax_region",
> + .release = cxl_dax_region_release,
> + .groups = cxl_dax_region_attribute_groups,
> +};
> +
> +static bool is_cxl_dax_region(struct device *dev)
> +{
> + return dev->type == &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 = &cxlr->params;
> + struct cxl_dax_region *cxlr_dax;
> + struct device *dev;
> +
> + guard(rwsem_read)(&cxl_rwsem.region);
> + if (p->state != CXL_CONFIG_COMMIT)
> + return ERR_PTR(-ENXIO);
> +
> + cxlr_dax = kzalloc_obj(*cxlr_dax);
> + if (!cxlr_dax)
> + return ERR_PTR(-ENOMEM);
> +
> + cxlr_dax->hpa_range.start = p->res->start;
> + cxlr_dax->hpa_range.end = p->res->end;
> +
> + dev = &cxlr_dax->dev;
> + cxlr_dax->cxlr = cxlr;
cxlr->cxlr_dax = cxlr_dax;
Running into segfaults without this ^
> + device_initialize(dev);
> + lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
> + device_set_pm_not_required(dev);
> + dev->parent = &cxlr->dev;
> + dev->bus = &cxl_bus_type;
> + dev->type = &cxl_dax_region_type;
> +
> + return cxlr_dax;
> +}
> +
> +static void cxlr_dax_unregister(void *_cxlr_dax)
> +{
> + struct cxl_dax_region *cxlr_dax = _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 = cxl_dax_region_alloc(cxlr);
> + if (IS_ERR(cxlr_dax))
> + return PTR_ERR(cxlr_dax);
> +
> + dev = &cxlr_dax->dev;
> + rc = dev_set_name(dev, "dax_region%d", cxlr->id);
> + if (rc)
> + goto err;
> +
> + rc = 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;
> +}
> diff --git a/tools/testing/cxl/Kbuild b/tools/testing/cxl/Kbuild
> index f53d79a05661..d2b291e5f842 100644
> --- a/tools/testing/cxl/Kbuild
> +++ b/tools/testing/cxl/Kbuild
> @@ -59,7 +59,7 @@ cxl_core-y += $(CXL_CORE_SRC)/hdm.o
> cxl_core-y += $(CXL_CORE_SRC)/pmu.o
> cxl_core-y += $(CXL_CORE_SRC)/cdat.o
> cxl_core-$(CONFIG_TRACING) += $(CXL_CORE_SRC)/trace.o
> -cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o
> +cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o $(CXL_CORE_SRC)/region_dax.o
> cxl_core-$(CONFIG_CXL_MCE) += $(CXL_CORE_SRC)/mce.o
> cxl_core-$(CONFIG_CXL_FEATURES) += $(CXL_CORE_SRC)/features.o
> cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += $(CXL_CORE_SRC)/edac.o
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-04-11 0:02 ` Anisa Su
@ 2026-04-11 0:26 ` Dave Jiang
2026-04-11 5:09 ` Gregory Price
1 sibling, 0 replies; 13+ messages in thread
From: Dave Jiang @ 2026-04-11 0:26 UTC (permalink / raw)
To: Anisa Su, Gregory Price
Cc: linux-cxl, linux-kernel, kernel-team, dave, jonathan.cameron,
alison.schofield, vishal.l.verma, ira.weiny, dan.j.williams
On 4/10/26 5:02 PM, Anisa Su wrote:
> On Thu, Mar 26, 2026 at 10:02:02PM -0400, Gregory Price wrote:
>> core/region.c is overloaded with per-region control logic (pmem, dax,
>> sysram, etc). Move the CXL DAX region device infrastructure from
>> region.c into a new region_dax.c file.
>>
>> This will also allow us to add additional dax-driver integration paths
>> that don't further dirty the core region.c logic.
>>
>> No functional changes.
>>
>> Signed-off-by: Gregory Price <gourry@gourry.net>
>> Co-developed-by: Ira Weiny <ira.weiny@intel.com>
>> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
>> ---
>> drivers/cxl/core/Makefile | 2 +-
>> drivers/cxl/core/core.h | 1 +
>> drivers/cxl/core/region.c | 99 ------------------------------
>> drivers/cxl/core/region_dax.c | 109 ++++++++++++++++++++++++++++++++++
>> tools/testing/cxl/Kbuild | 2 +-
>> 5 files changed, 112 insertions(+), 101 deletions(-)
>> create mode 100644 drivers/cxl/core/region_dax.c
>>
>> diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile
>> index f73776fe323b..ce7213818d3c 100644
>> --- a/drivers/cxl/core/Makefile
>> +++ b/drivers/cxl/core/Makefile
>> @@ -15,7 +15,7 @@ cxl_core-y += hdm.o
>> cxl_core-y += pmu.o
>> cxl_core-y += cdat.o
>> cxl_core-$(CONFIG_TRACING) += trace.o
>> -cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o
>> +cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o region_dax.o
>> cxl_core-$(CONFIG_CXL_MCE) += mce.o
>> cxl_core-$(CONFIG_CXL_FEATURES) += features.o
>> cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += edac.o
>> diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
>> index ef03966eeabd..82ca3a476708 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 dpa);
>> 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);
>>
>> #else
>> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
>> index 72aee1408efb..6a2ef3475764 100644
>> --- a/drivers/cxl/core/region.c
>> +++ b/drivers/cxl/core/region.c
>> @@ -3436,105 +3436,6 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
>> return -ENXIO;
>> }
>>
>> -static void cxl_dax_region_release(struct device *dev)
>> -{
>> - struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
>> -
>> - kfree(cxlr_dax);
>> -}
>> -
>> -static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
>> - &cxl_base_attribute_group,
>> - NULL,
>> -};
>> -
>> -const struct device_type cxl_dax_region_type = {
>> - .name = "cxl_dax_region",
>> - .release = cxl_dax_region_release,
>> - .groups = cxl_dax_region_attribute_groups,
>> -};
>> -
>> -static bool is_cxl_dax_region(struct device *dev)
>> -{
>> - return dev->type == &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 = &cxlr->params;
>> - struct cxl_dax_region *cxlr_dax;
>> - struct device *dev;
>> -
>> - guard(rwsem_read)(&cxl_rwsem.region);
>> - if (p->state != CXL_CONFIG_COMMIT)
>> - return ERR_PTR(-ENXIO);
>> -
>> - cxlr_dax = kzalloc_obj(*cxlr_dax);
>> - if (!cxlr_dax)
>> - return ERR_PTR(-ENOMEM);
>> -
>> - cxlr_dax->hpa_range.start = p->res->start;
>> - cxlr_dax->hpa_range.end = p->res->end;
>> -
>> - dev = &cxlr_dax->dev;
>> - cxlr_dax->cxlr = cxlr;
>> - device_initialize(dev);
>> - lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
>> - device_set_pm_not_required(dev);
>> - dev->parent = &cxlr->dev;
>> - dev->bus = &cxl_bus_type;
>> - dev->type = &cxl_dax_region_type;
>> -
>> - return cxlr_dax;
>> -}
>> -
>> -static void cxlr_dax_unregister(void *_cxlr_dax)
>> -{
>> - struct cxl_dax_region *cxlr_dax = _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 = cxl_dax_region_alloc(cxlr);
>> - if (IS_ERR(cxlr_dax))
>> - return PTR_ERR(cxlr_dax);
>> -
>> - dev = &cxlr_dax->dev;
>> - rc = dev_set_name(dev, "dax_region%d", cxlr->id);
>> - if (rc)
>> - goto err;
>> -
>> - rc = 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 = data;
>> diff --git a/drivers/cxl/core/region_dax.c b/drivers/cxl/core/region_dax.c
>> new file mode 100644
>> index 000000000000..fe367759ac69
>> --- /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 <linux/device.h>
>> +#include <linux/slab.h>
>> +#include <cxlmem.h>
>> +#include <cxl.h>
>> +#include "core.h"
>> +
>> +static void cxl_dax_region_release(struct device *dev)
>> +{
>> + struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
>> +
>> + kfree(cxlr_dax);
>> +}
>> +
>> +static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
>> + &cxl_base_attribute_group,
>> + NULL
>> +};
>> +
>> +const struct device_type cxl_dax_region_type = {
>> + .name = "cxl_dax_region",
>> + .release = cxl_dax_region_release,
>> + .groups = cxl_dax_region_attribute_groups,
>> +};
>> +
>> +static bool is_cxl_dax_region(struct device *dev)
>> +{
>> + return dev->type == &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 = &cxlr->params;
>> + struct cxl_dax_region *cxlr_dax;
>> + struct device *dev;
>> +
>> + guard(rwsem_read)(&cxl_rwsem.region);
>> + if (p->state != CXL_CONFIG_COMMIT)
>> + return ERR_PTR(-ENXIO);
>> +
>> + cxlr_dax = kzalloc_obj(*cxlr_dax);
>> + if (!cxlr_dax)
>> + return ERR_PTR(-ENOMEM);
>> +
>> + cxlr_dax->hpa_range.start = p->res->start;
>> + cxlr_dax->hpa_range.end = p->res->end;
>> +
>> + dev = &cxlr_dax->dev;
>> + cxlr_dax->cxlr = cxlr;
> cxlr->cxlr_dax = cxlr_dax;
>
> Running into segfaults without this ^
Can you pls create a fixes patch?
DJ
>> + device_initialize(dev);
>> + lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
>> + device_set_pm_not_required(dev);
>> + dev->parent = &cxlr->dev;
>> + dev->bus = &cxl_bus_type;
>> + dev->type = &cxl_dax_region_type;
>> +
>> + return cxlr_dax;
>> +}
>> +
>> +static void cxlr_dax_unregister(void *_cxlr_dax)
>> +{
>> + struct cxl_dax_region *cxlr_dax = _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 = cxl_dax_region_alloc(cxlr);
>> + if (IS_ERR(cxlr_dax))
>> + return PTR_ERR(cxlr_dax);
>> +
>> + dev = &cxlr_dax->dev;
>> + rc = dev_set_name(dev, "dax_region%d", cxlr->id);
>> + if (rc)
>> + goto err;
>> +
>> + rc = 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;
>> +}
>> diff --git a/tools/testing/cxl/Kbuild b/tools/testing/cxl/Kbuild
>> index f53d79a05661..d2b291e5f842 100644
>> --- a/tools/testing/cxl/Kbuild
>> +++ b/tools/testing/cxl/Kbuild
>> @@ -59,7 +59,7 @@ cxl_core-y += $(CXL_CORE_SRC)/hdm.o
>> cxl_core-y += $(CXL_CORE_SRC)/pmu.o
>> cxl_core-y += $(CXL_CORE_SRC)/cdat.o
>> cxl_core-$(CONFIG_TRACING) += $(CXL_CORE_SRC)/trace.o
>> -cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o
>> +cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o $(CXL_CORE_SRC)/region_dax.o
>> cxl_core-$(CONFIG_CXL_MCE) += $(CXL_CORE_SRC)/mce.o
>> cxl_core-$(CONFIG_CXL_FEATURES) += $(CXL_CORE_SRC)/features.o
>> cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += $(CXL_CORE_SRC)/edac.o
>> --
>> 2.53.0
>>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-04-11 0:02 ` Anisa Su
2026-04-11 0:26 ` Dave Jiang
@ 2026-04-11 5:09 ` Gregory Price
2026-04-11 17:39 ` Dan Williams
2026-04-13 17:00 ` Anisa Su
1 sibling, 2 replies; 13+ messages in thread
From: Gregory Price @ 2026-04-11 5:09 UTC (permalink / raw)
To: Anisa Su
Cc: linux-cxl, linux-kernel, kernel-team, dave, jonathan.cameron,
dave.jiang, alison.schofield, vishal.l.verma, ira.weiny,
dan.j.williams
On Fri, Apr 10, 2026 at 05:02:00PM -0700, Anisa Su wrote:
> > +
> > + cxlr_dax->hpa_range.start = p->res->start;
> > + cxlr_dax->hpa_range.end = p->res->end;
> > +
> > + dev = &cxlr_dax->dev;
> > + cxlr_dax->cxlr = cxlr;
> cxlr->cxlr_dax = cxlr_dax;
>
> Running into segfaults without this ^
This should have been a purely non-functional change (the code is just
moving from A to B without changes).
That would mean the original code should run into this too unless I
mucked up the move.
~Gregory
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-04-11 5:09 ` Gregory Price
@ 2026-04-11 17:39 ` Dan Williams
2026-04-13 17:00 ` Anisa Su
1 sibling, 0 replies; 13+ messages in thread
From: Dan Williams @ 2026-04-11 17:39 UTC (permalink / raw)
To: Gregory Price
Cc: linux-cxl, linux-kernel, kernel-team, dave, jonathan.cameron,
dave.jiang, alison.schofield, vishal.l.verma, ira.weiny
Gregory Price wrote:
> On Fri, Apr 10, 2026 at 05:02:00PM -0700, Anisa Su wrote:
> > > +
> > > + cxlr_dax->hpa_range.start = p->res->start;
> > > + cxlr_dax->hpa_range.end = p->res->end;
> > > +
> > > + dev = &cxlr_dax->dev;
> > > + cxlr_dax->cxlr = cxlr;
> > cxlr->cxlr_dax = cxlr_dax;
> >
> > Running into segfaults without this ^
>
> This should have been a purely non-functional change (the code is just
> moving from A to B without changes).
>
> That would mean the original code should run into this too unless I
> mucked up the move.
I do not think you mucked anything up ->cxlr_dax does not exist in mainline.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c
2026-04-11 5:09 ` Gregory Price
2026-04-11 17:39 ` Dan Williams
@ 2026-04-13 17:00 ` Anisa Su
1 sibling, 0 replies; 13+ messages in thread
From: Anisa Su @ 2026-04-13 17:00 UTC (permalink / raw)
To: Gregory Price
Cc: Anisa Su, linux-cxl, linux-kernel, kernel-team, dave,
jonathan.cameron, dave.jiang, alison.schofield, vishal.l.verma,
ira.weiny, dan.j.williams
On Sat, Apr 11, 2026 at 01:09:13AM -0400, Gregory Price wrote:
> On Fri, Apr 10, 2026 at 05:02:00PM -0700, Anisa Su wrote:
> > > +
> > > + cxlr_dax->hpa_range.start = p->res->start;
> > > + cxlr_dax->hpa_range.end = p->res->end;
> > > +
> > > + dev = &cxlr_dax->dev;
> > > + cxlr_dax->cxlr = cxlr;
> > cxlr->cxlr_dax = cxlr_dax;
> >
> > Running into segfaults without this ^
>
> This should have been a purely non-functional change (the code is just
> moving from A to B without changes).
>
> That would mean the original code should run into this too unless I
> mucked up the move.
>
> ~Gregory
Wait no sorry I was wrong... I got confused by the merge conflict when I was
rebasing the dcd series
Pls ignore
- Anisa
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-04-13 17:00 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-27 2:02 [PATCH v5 0/3] pull region-specific logic into new files Gregory Price
2026-03-27 2:02 ` [PATCH v5 1/3] cxl/core/region: move pmem region driver logic into region_pmem.c Gregory Price
2026-03-27 16:56 ` Ira Weiny
2026-03-27 2:02 ` [PATCH v5 2/3] cxl/core/region: move dax region device logic into region_dax.c Gregory Price
2026-03-27 16:57 ` Ira Weiny
2026-04-11 0:02 ` Anisa Su
2026-04-11 0:26 ` Dave Jiang
2026-04-11 5:09 ` Gregory Price
2026-04-11 17:39 ` Dan Williams
2026-04-13 17:00 ` Anisa Su
2026-03-27 2:02 ` [PATCH v5 3/3] cxl/core: use cleanup.h for devm_cxl_add_dax_region Gregory Price
2026-03-27 17:05 ` Ira Weiny
2026-03-27 18:57 ` [PATCH v5 0/3] pull region-specific logic into new files Dave Jiang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.