Using these attributes region label is added/deleted into LSA. These attributes are called from userspace (ndctl) after region creation.
Signed-off-by: Neeraj Kumar <s.nee...@samsung.com> --- drivers/cxl/core/pmem_region.c | 103 +++++++++++++++++++++++++++++++++ drivers/cxl/cxl.h | 1 + 2 files changed, 104 insertions(+) diff --git a/drivers/cxl/core/pmem_region.c b/drivers/cxl/core/pmem_region.c index a29526c27d40..f582d796c21b 100644 --- a/drivers/cxl/core/pmem_region.c +++ b/drivers/cxl/core/pmem_region.c @@ -45,8 +45,111 @@ static void cxl_pmem_region_release(struct device *dev) kfree(cxlr_pmem); } +static ssize_t region_label_update_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct cxl_pmem_region *cxlr_pmem = to_cxl_pmem_region(dev); + struct cxl_region *cxlr = cxlr_pmem->cxlr; + struct cxl_region_params *p = &cxlr->params; + ssize_t rc; + bool update; + + rc = kstrtobool(buf, &update); + if (rc) + return rc; + + rc = down_write_killable(&cxl_region_rwsem); + if (rc) + return rc; + + /* Region not yet committed */ + if (update && p->state != CXL_CONFIG_COMMIT) { + dev_dbg(dev, "region not committed, can't update into LSA\n"); + rc = -ENXIO; + goto out; + } + + if (cxlr && cxlr->cxlr_pmem && cxlr->cxlr_pmem->nd_region) { + rc = nd_region_label_update(cxlr->cxlr_pmem->nd_region); + + if (!rc) + p->region_label_state = 1; + } + +out: + up_write(&cxl_region_rwsem); + + if (rc) + return rc; + + return len; +} + +static ssize_t region_label_update_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct cxl_pmem_region *cxlr_pmem = to_cxl_pmem_region(dev); + struct cxl_region *cxlr = cxlr_pmem->cxlr; + struct cxl_region_params *p = &cxlr->params; + ssize_t rc; + + rc = down_read_interruptible(&cxl_region_rwsem); + if (rc) + return rc; + rc = sysfs_emit(buf, "%d\n", p->region_label_state); + up_read(&cxl_region_rwsem); + + return rc; +} +static DEVICE_ATTR_RW(region_label_update); + +static ssize_t region_label_delete_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct cxl_pmem_region *cxlr_pmem = to_cxl_pmem_region(dev); + struct cxl_region *cxlr = cxlr_pmem->cxlr; + struct cxl_region_params *p = &cxlr->params; + ssize_t rc; + + rc = down_write_killable(&cxl_region_rwsem); + if (rc) + return rc; + + if (cxlr && cxlr->cxlr_pmem && cxlr->cxlr_pmem->nd_region) { + rc = nd_region_label_delete(cxlr->cxlr_pmem->nd_region); + if (rc) + goto out; + } + + if (!rc) + p->region_label_state = 0; + +out: + up_write(&cxl_region_rwsem); + + if (rc) + return rc; + + return len; +} +DEVICE_ATTR_WO(region_label_delete); + +static struct attribute *cxl_pmem_region_attrs[] = { + &dev_attr_region_label_update.attr, + &dev_attr_region_label_delete.attr, + NULL, +}; + +struct attribute_group cxl_pmem_region_group = { + .attrs = cxl_pmem_region_attrs, +}; + static const struct attribute_group *cxl_pmem_region_attribute_groups[] = { &cxl_base_attribute_group, + &cxl_pmem_region_group, NULL, }; diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index c6cd0c8d78a1..f67bf7df287a 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -498,6 +498,7 @@ enum cxl_config_state { */ struct cxl_region_params { enum cxl_config_state state; + int region_label_state; uuid_t uuid; int interleave_ways; int interleave_granularity; -- 2.34.1