This bit is used by dax/kmem to determine whether to set the MHP_PROTECTED_MEMORY flags, which will make whether hotplug memory should be restricted to a protected memory NUMA node.
Signed-off-by: Gregory Price <[email protected]> --- drivers/dax/bus.c | 39 +++++++++++++++++++++++++++++++++++++++ drivers/dax/bus.h | 1 + drivers/dax/dax-private.h | 1 + drivers/dax/kmem.c | 2 ++ 4 files changed, 43 insertions(+) diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c index fde29e0ad68b..4321e80276f0 100644 --- a/drivers/dax/bus.c +++ b/drivers/dax/bus.c @@ -1361,6 +1361,43 @@ static ssize_t memmap_on_memory_store(struct device *dev, } static DEVICE_ATTR_RW(memmap_on_memory); +static ssize_t protected_memory_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dev_dax *dev_dax = to_dev_dax(dev); + + return sysfs_emit(buf, "%d\n", dev_dax->protected_memory); +} + +static ssize_t protected_memory_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct dev_dax *dev_dax = to_dev_dax(dev); + bool val; + int rc; + + rc = kstrtobool(buf, &val); + if (rc) + return rc; + + rc = down_write_killable(&dax_dev_rwsem); + if (rc) + return rc; + + if (dev_dax->protected_memory != val && dev->driver && + to_dax_drv(dev->driver)->type == DAXDRV_KMEM_TYPE) { + up_write(&dax_dev_rwsem); + return -EBUSY; + } + + dev_dax->protected_memory = val; + up_write(&dax_dev_rwsem); + + return len; +} +static DEVICE_ATTR_RW(protected_memory); + static umode_t dev_dax_visible(struct kobject *kobj, struct attribute *a, int n) { struct device *dev = container_of(kobj, struct device, kobj); @@ -1388,6 +1425,7 @@ static struct attribute *dev_dax_attributes[] = { &dev_attr_resource.attr, &dev_attr_numa_node.attr, &dev_attr_memmap_on_memory.attr, + &dev_attr_protected_memory.attr, NULL, }; @@ -1494,6 +1532,7 @@ static struct dev_dax *__devm_create_dev_dax(struct dev_dax_data *data) ida_init(&dev_dax->ida); dev_dax->memmap_on_memory = data->memmap_on_memory; + dev_dax->protected_memory = data->protected_memory; inode = dax_inode(dax_dev); dev->devt = inode->i_rdev; diff --git a/drivers/dax/bus.h b/drivers/dax/bus.h index cbbf64443098..0a885bf9839f 100644 --- a/drivers/dax/bus.h +++ b/drivers/dax/bus.h @@ -24,6 +24,7 @@ struct dev_dax_data { resource_size_t size; int id; bool memmap_on_memory; + bool protected_memory; }; struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data); diff --git a/drivers/dax/dax-private.h b/drivers/dax/dax-private.h index 0867115aeef2..605b7ed87ffe 100644 --- a/drivers/dax/dax-private.h +++ b/drivers/dax/dax-private.h @@ -89,6 +89,7 @@ struct dev_dax { struct device dev; struct dev_pagemap *pgmap; bool memmap_on_memory; + bool protected_memory; int nr_range; struct dev_dax_range *ranges; }; diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index c036e4d0b610..140c6cb0ac88 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -169,6 +169,8 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) mhp_flags = MHP_NID_IS_MGID; if (dev_dax->memmap_on_memory) mhp_flags |= MHP_MEMMAP_ON_MEMORY; + if (dev_dax->protected_memory) + mhp_flags |= MHP_PROTECTED_MEMORY; /* * Ensure that future kexec'd kernels will not treat -- 2.51.1

