Add protected_memory bit to cxl region. The setting is subsequently forwarded to the dax device it creates. This allows the auto-hotplug process to occur without an intermediate step requiring udev to poke the DAX device protected memory bit explicitly before onlining.
Signed-off-by: Gregory Price <[email protected]> --- drivers/cxl/core/region.c | 30 ++++++++++++++++++++++++++++++ drivers/cxl/cxl.h | 2 ++ drivers/dax/cxl.c | 1 + 3 files changed, 33 insertions(+) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index b06fee1978ba..a0e28821961c 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -754,6 +754,35 @@ static ssize_t size_show(struct device *dev, struct device_attribute *attr, } static DEVICE_ATTR_RW(size); +static ssize_t protected_memory_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct cxl_region *cxlr = to_cxl_region(dev); + + return sysfs_emit(buf, "%d\n", cxlr->protected_memory); +} + +static ssize_t protected_memory_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct cxl_region *cxlr = to_cxl_region(dev); + bool val; + int rc; + + rc = kstrtobool(buf, &val); + if (rc) + return rc; + + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) + return rc; + + cxlr->protected_memory = val; + return len; +} +static DEVICE_ATTR_RW(protected_memory); + static struct attribute *cxl_region_attrs[] = { &dev_attr_uuid.attr, &dev_attr_commit.attr, @@ -762,6 +791,7 @@ static struct attribute *cxl_region_attrs[] = { &dev_attr_resource.attr, &dev_attr_size.attr, &dev_attr_mode.attr, + &dev_attr_protected_memory.attr, NULL, }; diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 231ddccf8977..0ff4898224ba 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -530,6 +530,7 @@ enum cxl_partition_mode { * @coord: QoS access coordinates for the region * @node_notifier: notifier for setting the access coordinates to node * @adist_notifier: notifier for calculating the abstract distance of node + * @protected_memory: mark region memory as protected from kernel allocation */ struct cxl_region { struct device dev; @@ -543,6 +544,7 @@ struct cxl_region { struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct notifier_block node_notifier; struct notifier_block adist_notifier; + bool protected_memory; }; struct cxl_nvdimm_bridge { diff --git a/drivers/dax/cxl.c b/drivers/dax/cxl.c index 13cd94d32ff7..a4232a5507b5 100644 --- a/drivers/dax/cxl.c +++ b/drivers/dax/cxl.c @@ -27,6 +27,7 @@ static int cxl_dax_region_probe(struct device *dev) .id = -1, .size = range_len(&cxlr_dax->hpa_range), .memmap_on_memory = true, + .protected_memory = cxlr->protected_memory, }; return PTR_ERR_OR_ZERO(devm_create_dev_dax(&data)); -- 2.51.1

