* [PATCH v5 0/4] Add DAX ABI for memmap_on_memory
@ 2023-12-14 7:37 Vishal Verma
2023-12-14 7:37 ` [PATCH v5 1/4] Documentatiion/ABI: Add ABI documentation for sys-bus-dax Vishal Verma
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Vishal Verma @ 2023-12-14 7:37 UTC (permalink / raw)
To: Dan Williams, Vishal Verma, Dave Jiang, Andrew Morton, Oscar Salvador
Cc: linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Huang Ying, Greg Kroah-Hartman, linux-mm, Joao Martins,
Michal Hocko, Li Zhijian, Jonathan Cameron
The DAX drivers were missing sysfs ABI documentation entirely. Add this
missing documentation for the sysfs ABI for DAX regions and Dax devices
in patch 1. Switch to guard(device) semantics for Scope Based Resource
Management for device_{lock,unlock} flows in drivers/dax/bus.c in patch
2. Export mhp_supports_memmap_on_memory() in patch 3. Add a new ABI for
toggling memmap_on_memory semantics in patch 4.
The missing ABI was spotted in [1], this series is a split of the new
ABI additions behind the initial documentation creation.
[1]: https://lore.kernel.org/linux-cxl/651f27b728fef_ae7e7294b3@dwillia2-xfh.jf.intel.com.notmuch/
---
This series depends on [2] which adds the definition for guard(device).
[2]: https://lore.kernel.org/r/170250854466.1522182.17555361077409628655.stgit@dwillia2-xfh.jf.intel.com
---
Other Logistics -
Andrew, would you prefer patch 3 to go through mm? Or through the dax
tree with an mm ack? The remaining patches are all contained to dax, but
do depend on the memmap_on_memory set that is currently in mm-stable.
---
Changes in v5:
- Export and check mhp_supports_memmap_on_memory() in the DAX sysfs ABI
(David)
- Obtain dax_drv under the device lock (Ying)
- Check dax_drv for NULL before dereferencing it (Ying)
- Clean up some repetition in sysfs-bus-dax documentation entries
(Jonathan)
- A few additional cleanups enabled by guard(device) (Jonathan)
- Drop the DEFINE_GUARD() part of patch 2, add dependency on Dan's patch
above so it can be backported / applied separately (Jonathan, Dan)
- Link to v4: https://lore.kernel.org/r/20231212-vv-dax_abi-v4-0-1351758f0c92@intel.com
Changes in v4:
- Hold the device lock when checking if the dax_dev is bound to kmem
(Ying, Dan)
- Remove dax region checks (and locks) as they were unnecessary.
- Introduce guard(device) for device lock/unlock (Dan)
- Convert the rest of drivers/dax/bus.c to guard(device)
- Link to v3: https://lore.kernel.org/r/20231211-vv-dax_abi-v3-0-acf6cc1bde9f@intel.com
Changes in v3:
- Fix typo in ABI docs (Zhijian Li)
- Add kernel config and module parameter dependencies to the ABI docs
entry (David Hildenbrand)
- Ensure kmem isn't active when setting the sysfs attribute (Ying
Huang)
- Simplify returning from memmap_on_memory_store()
- Link to v2: https://lore.kernel.org/r/20231206-vv-dax_abi-v2-0-f4f4f2336d08@intel.com
Changes in v2:
- Fix CC lists, patch 1/2 didn't get sent correctly in v1
- Link to v1: https://lore.kernel.org/r/20231206-vv-dax_abi-v1-0-474eb88e201c@intel.com
Cc: <linux-kernel@vger.kernel.org>
Cc: <nvdimm@lists.linux.dev>
Cc: <linux-cxl@vger.kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Huang Ying <ying.huang@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: <linux-mm@kvack.org>
To: Dan Williams <dan.j.williams@intel.com>
To: Vishal Verma <vishal.l.verma@intel.com>
To: Dave Jiang <dave.jiang@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>
To: Oscar Salvador <osalvador@suse.de>
---
Vishal Verma (4):
Documentatiion/ABI: Add ABI documentation for sys-bus-dax
dax/bus: Use guard(device) in sysfs attribute helpers
mm/memory_hotplug: export mhp_supports_memmap_on_memory()
dax: add a sysfs knob to control memmap_on_memory behavior
include/linux/memory_hotplug.h | 6 ++
drivers/dax/bus.c | 181 +++++++++++++++++---------------
mm/memory_hotplug.c | 17 ++-
Documentation/ABI/testing/sysfs-bus-dax | 153 +++++++++++++++++++++++++++
4 files changed, 262 insertions(+), 95 deletions(-)
---
base-commit: a6e0c2ca980d75d5ac6b2902c5c0028eaf094db3
change-id: 20231025-vv-dax_abi-17a219c46076
Best regards,
--
Vishal Verma <vishal.l.verma@intel.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 1/4] Documentatiion/ABI: Add ABI documentation for sys-bus-dax
2023-12-14 7:37 [PATCH v5 0/4] Add DAX ABI for memmap_on_memory Vishal Verma
@ 2023-12-14 7:37 ` Vishal Verma
2023-12-14 7:37 ` [PATCH v5 2/4] dax/bus: Use guard(device) in sysfs attribute helpers Vishal Verma
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Vishal Verma @ 2023-12-14 7:37 UTC (permalink / raw)
To: Dan Williams, Vishal Verma, Dave Jiang, Andrew Morton, Oscar Salvador
Cc: linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Huang Ying, Greg Kroah-Hartman, linux-mm
Add the missing sysfs ABI documentation for the device DAX subsystem.
Various ABI attributes under this have been present since v5.1, and more
have been added over time. In preparation for adding a new attribute,
add this file with the historical details.
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
Documentation/ABI/testing/sysfs-bus-dax | 136 ++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-bus-dax b/Documentation/ABI/testing/sysfs-bus-dax
new file mode 100644
index 000000000000..6359f7bc9bf4
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-bus-dax
@@ -0,0 +1,136 @@
+What: /sys/bus/dax/devices/daxX.Y/align
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RW) Provides a way to specify an alignment for a dax device.
+ Values allowed are constrained by the physical address ranges
+ that back the dax device, and also by arch requirements.
+
+What: /sys/bus/dax/devices/daxX.Y/mapping
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (WO) Provides a way to allocate a mapping range under a dax
+ device. Specified in the format <start>-<end>.
+
+What: /sys/bus/dax/devices/daxX.Y/mapping[0..N]/start
+What: /sys/bus/dax/devices/daxX.Y/mapping[0..N]/end
+What: /sys/bus/dax/devices/daxX.Y/mapping[0..N]/page_offset
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) A dax device may have multiple constituent discontiguous
+ address ranges. These are represented by the different
+ 'mappingX' subdirectories. The 'start' attribute indicates the
+ start physical address for the given range. The 'end' attribute
+ indicates the end physical address for the given range. The
+ 'page_offset' attribute indicates the offset of the current
+ range in the dax device.
+
+What: /sys/bus/dax/devices/daxX.Y/resource
+Date: June, 2019
+KernelVersion: v5.3
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The resource attribute indicates the starting physical
+ address of a dax device. In case of a device with multiple
+ constituent ranges, it indicates the starting address of the
+ first range.
+
+What: /sys/bus/dax/devices/daxX.Y/size
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RW) The size attribute indicates the total size of a dax
+ device. For creating subdivided dax devices, or for resizing
+ an existing device, the new size can be written to this as
+ part of the reconfiguration process.
+
+What: /sys/bus/dax/devices/daxX.Y/numa_node
+Date: November, 2019
+KernelVersion: v5.5
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) If NUMA is enabled and the platform has affinitized the
+ backing device for this dax device, emit the CPU node
+ affinity for this device.
+
+What: /sys/bus/dax/devices/daxX.Y/target_node
+Date: February, 2019
+KernelVersion: v5.1
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The target-node attribute is the Linux numa-node that a
+ device-dax instance may create when it is online. Prior to
+ being online the device's 'numa_node' property reflects the
+ closest online cpu node which is the typical expectation of a
+ device 'numa_node'. Once it is online it becomes its own
+ distinct numa node.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/available_size
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The available_size attribute tracks available dax region
+ capacity. This only applies to volatile hmem devices, not pmem
+ devices, since pmem devices are defined by nvdimm namespace
+ boundaries.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/size
+Date: July, 2017
+KernelVersion: v5.1
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The size attribute indicates the size of a given dax region
+ in bytes.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/align
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The align attribute indicates alignment of the dax region.
+ Changes on align may not always be valid, when say certain
+ mappings were created with 2M and then we switch to 1G. This
+ validates all ranges against the new value being attempted, post
+ resizing.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/seed
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The seed device is a concept for dynamic dax regions to be
+ able to split the region amongst multiple sub-instances. The
+ seed device, similar to libnvdimm seed devices, is a device
+ that starts with zero capacity allocated and unbound to a
+ driver.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/create
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RW) The create interface to the dax region provides a way to
+ create a new unconfigured dax device under the given region, which
+ can then be configured (with a size etc.) and then probed.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/delete
+Date: October, 2020
+KernelVersion: v5.10
+Contact: nvdimm@lists.linux.dev
+Description:
+ (WO) The delete interface for a dax region provides for deletion
+ of any 0-sized and idle dax devices.
+
+What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/id
+Date: July, 2017
+KernelVersion: v5.1
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RO) The id attribute indicates the region id of a dax region.
--
2.41.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 2/4] dax/bus: Use guard(device) in sysfs attribute helpers
2023-12-14 7:37 [PATCH v5 0/4] Add DAX ABI for memmap_on_memory Vishal Verma
2023-12-14 7:37 ` [PATCH v5 1/4] Documentatiion/ABI: Add ABI documentation for sys-bus-dax Vishal Verma
@ 2023-12-14 7:37 ` Vishal Verma
2023-12-14 7:37 ` [PATCH v5 3/4] mm/memory_hotplug: export mhp_supports_memmap_on_memory() Vishal Verma
2023-12-14 7:37 ` [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior Vishal Verma
3 siblings, 0 replies; 8+ messages in thread
From: Vishal Verma @ 2023-12-14 7:37 UTC (permalink / raw)
To: Dan Williams, Vishal Verma, Dave Jiang, Andrew Morton, Oscar Salvador
Cc: linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Huang Ying, Greg Kroah-Hartman, linux-mm, Joao Martins
Use the guard(device) macro to lock a 'struct device', and unlock it
automatically when going out of scope using Scope Based Resource
Management semantics. A lot of the sysfs attribute writes in
drivers/dax/bus.c benefit from a cleanup using these, so change these
where applicable.
Cc: Joao Martins <joao.m.martins@oracle.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/dax/bus.c | 143 ++++++++++++++++++++++--------------------------------
1 file changed, 59 insertions(+), 84 deletions(-)
diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
index 1ff1ab5fa105..6226de131d17 100644
--- a/drivers/dax/bus.c
+++ b/drivers/dax/bus.c
@@ -294,13 +294,10 @@ static ssize_t available_size_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct dax_region *dax_region = dev_get_drvdata(dev);
- unsigned long long size;
- device_lock(dev);
- size = dax_region_avail_size(dax_region);
- device_unlock(dev);
+ guard(device)(dev);
- return sprintf(buf, "%llu\n", size);
+ return sprintf(buf, "%llu\n", dax_region_avail_size(dax_region));
}
static DEVICE_ATTR_RO(available_size);
@@ -309,17 +306,14 @@ static ssize_t seed_show(struct device *dev,
{
struct dax_region *dax_region = dev_get_drvdata(dev);
struct device *seed;
- ssize_t rc;
if (is_static(dax_region))
return -EINVAL;
- device_lock(dev);
+ guard(device)(dev);
seed = dax_region->seed;
- rc = sprintf(buf, "%s\n", seed ? dev_name(seed) : "");
- device_unlock(dev);
- return rc;
+ return sprintf(buf, "%s\n", seed ? dev_name(seed) : "");
}
static DEVICE_ATTR_RO(seed);
@@ -328,24 +322,28 @@ static ssize_t create_show(struct device *dev,
{
struct dax_region *dax_region = dev_get_drvdata(dev);
struct device *youngest;
- ssize_t rc;
if (is_static(dax_region))
return -EINVAL;
- device_lock(dev);
+ guard(device)(dev);
youngest = dax_region->youngest;
- rc = sprintf(buf, "%s\n", youngest ? dev_name(youngest) : "");
- device_unlock(dev);
- return rc;
+ return sprintf(buf, "%s\n", youngest ? dev_name(youngest) : "");
}
static ssize_t create_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t len)
{
struct dax_region *dax_region = dev_get_drvdata(dev);
+ struct dev_dax_data data = {
+ .dax_region = dax_region,
+ .size = 0,
+ .id = -1,
+ .memmap_on_memory = false,
+ };
unsigned long long avail;
+ struct dev_dax *dev_dax;
ssize_t rc;
int val;
@@ -358,38 +356,25 @@ static ssize_t create_store(struct device *dev, struct device_attribute *attr,
if (val != 1)
return -EINVAL;
- device_lock(dev);
+ guard(device)(dev);
avail = dax_region_avail_size(dax_region);
if (avail == 0)
- rc = -ENOSPC;
- else {
- struct dev_dax_data data = {
- .dax_region = dax_region,
- .size = 0,
- .id = -1,
- .memmap_on_memory = false,
- };
- struct dev_dax *dev_dax = devm_create_dev_dax(&data);
+ return -ENOSPC;
- if (IS_ERR(dev_dax))
- rc = PTR_ERR(dev_dax);
- else {
- /*
- * In support of crafting multiple new devices
- * simultaneously multiple seeds can be created,
- * but only the first one that has not been
- * successfully bound is tracked as the region
- * seed.
- */
- if (!dax_region->seed)
- dax_region->seed = &dev_dax->dev;
- dax_region->youngest = &dev_dax->dev;
- rc = len;
- }
- }
- device_unlock(dev);
+ dev_dax = devm_create_dev_dax(&data);
+ if (IS_ERR(dev_dax))
+ return PTR_ERR(dev_dax);
- return rc;
+ /*
+ * In support of crafting multiple new devices simultaneously multiple
+ * seeds can be created, but only the first one that has not been
+ * successfully bound is tracked as the region seed.
+ */
+ if (!dax_region->seed)
+ dax_region->seed = &dev_dax->dev;
+ dax_region->youngest = &dev_dax->dev;
+
+ return len;
}
static DEVICE_ATTR_RW(create);
@@ -481,12 +466,9 @@ static int __free_dev_dax_id(struct dev_dax *dev_dax)
static int free_dev_dax_id(struct dev_dax *dev_dax)
{
struct device *dev = &dev_dax->dev;
- int rc;
- device_lock(dev);
- rc = __free_dev_dax_id(dev_dax);
- device_unlock(dev);
- return rc;
+ guard(device)(dev);
+ return __free_dev_dax_id(dev_dax);
}
static int alloc_dev_dax_id(struct dev_dax *dev_dax)
@@ -908,9 +890,8 @@ static ssize_t size_show(struct device *dev,
struct dev_dax *dev_dax = to_dev_dax(dev);
unsigned long long size;
- device_lock(dev);
+ guard(device)(dev);
size = dev_dax_size(dev_dax);
- device_unlock(dev);
return sprintf(buf, "%llu\n", size);
}
@@ -1080,17 +1061,16 @@ static ssize_t size_store(struct device *dev, struct device_attribute *attr,
return -EINVAL;
}
- device_lock(dax_region->dev);
- if (!dax_region->dev->driver) {
- device_unlock(dax_region->dev);
+ guard(device)(dax_region->dev);
+ if (!dax_region->dev->driver)
return -ENXIO;
- }
- device_lock(dev);
+
+ guard(device)(dev);
rc = dev_dax_resize(dax_region, dev_dax, val);
- device_unlock(dev);
- device_unlock(dax_region->dev);
+ if (rc)
+ return rc;
- return rc == 0 ? len : rc;
+ return len;
}
static DEVICE_ATTR_RW(size);
@@ -1137,21 +1117,20 @@ static ssize_t mapping_store(struct device *dev, struct device_attribute *attr,
if (rc)
return rc;
- rc = -ENXIO;
- device_lock(dax_region->dev);
- if (!dax_region->dev->driver) {
- device_unlock(dax_region->dev);
- return rc;
- }
- device_lock(dev);
+ guard(device)(dax_region->dev);
+ if (!dax_region->dev->driver)
+ return -ENXIO;
+ guard(device)(dev);
to_alloc = range_len(&r);
- if (alloc_is_aligned(dev_dax, to_alloc))
- rc = alloc_dev_dax_range(dev_dax, r.start, to_alloc);
- device_unlock(dev);
- device_unlock(dax_region->dev);
+ if (!alloc_is_aligned(dev_dax, to_alloc))
+ return -ENXIO;
- return rc == 0 ? len : rc;
+ rc = alloc_dev_dax_range(dev_dax, r.start, to_alloc);
+ if (rc)
+ return rc;
+
+ return len;
}
static DEVICE_ATTR_WO(mapping);
@@ -1196,27 +1175,23 @@ static ssize_t align_store(struct device *dev, struct device_attribute *attr,
if (!dax_align_valid(val))
return -EINVAL;
- device_lock(dax_region->dev);
- if (!dax_region->dev->driver) {
- device_unlock(dax_region->dev);
+ guard(device)(dax_region->dev);
+ if (!dax_region->dev->driver)
return -ENXIO;
- }
- device_lock(dev);
- if (dev->driver) {
- rc = -EBUSY;
- goto out_unlock;
- }
+ guard(device)(dev);
+ if (dev->driver)
+ return -EBUSY;
align_save = dev_dax->align;
dev_dax->align = val;
rc = dev_dax_validate_align(dev_dax);
- if (rc)
+ if (rc) {
dev_dax->align = align_save;
-out_unlock:
- device_unlock(dev);
- device_unlock(dax_region->dev);
- return rc == 0 ? len : rc;
+ return rc;
+ }
+
+ return len;
}
static DEVICE_ATTR_RW(align);
--
2.41.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 3/4] mm/memory_hotplug: export mhp_supports_memmap_on_memory()
2023-12-14 7:37 [PATCH v5 0/4] Add DAX ABI for memmap_on_memory Vishal Verma
2023-12-14 7:37 ` [PATCH v5 1/4] Documentatiion/ABI: Add ABI documentation for sys-bus-dax Vishal Verma
2023-12-14 7:37 ` [PATCH v5 2/4] dax/bus: Use guard(device) in sysfs attribute helpers Vishal Verma
@ 2023-12-14 7:37 ` Vishal Verma
2023-12-14 9:10 ` David Hildenbrand
2023-12-14 7:37 ` [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior Vishal Verma
3 siblings, 1 reply; 8+ messages in thread
From: Vishal Verma @ 2023-12-14 7:37 UTC (permalink / raw)
To: Dan Williams, Vishal Verma, Dave Jiang, Andrew Morton, Oscar Salvador
Cc: linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Huang Ying, Greg Kroah-Hartman, linux-mm, Michal Hocko
In preparation for adding sysfs ABI to toggle memmap_on_memory semantics
for drivers adding memory, export the mhp_supports_memmap_on_memory()
helper. This allows drivers to check if memmap_on_memory support is
available before trying to request it, and display an appropriate
message if it isn't available. As part of this, remove the size argument
to this - with recent updates to allow memmap_on_memory for larger
ranges, and the internal splitting of altmaps into respective memory
blocks, the size argument is meaningless.
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Huang Ying <ying.huang@intel.com>
Suggested-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
include/linux/memory_hotplug.h | 6 ++++++
mm/memory_hotplug.c | 17 ++++++-----------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index 7d2076583494..ebc9d528f00c 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -121,6 +121,7 @@ struct mhp_params {
bool mhp_range_allowed(u64 start, u64 size, bool need_mapping);
struct range mhp_get_pluggable_range(bool need_mapping);
+bool mhp_supports_memmap_on_memory(void);
/*
* Zone resizing functions
@@ -262,6 +263,11 @@ static inline bool movable_node_is_enabled(void)
return false;
}
+static bool mhp_supports_memmap_on_memory(void)
+{
+ return false;
+}
+
static inline void pgdat_kswapd_lock(pg_data_t *pgdat) {}
static inline void pgdat_kswapd_unlock(pg_data_t *pgdat) {}
static inline void pgdat_kswapd_lock_init(pg_data_t *pgdat) {}
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 926e1cfb10e9..751664c519f7 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1325,7 +1325,7 @@ static inline bool arch_supports_memmap_on_memory(unsigned long vmemmap_size)
}
#endif
-static bool mhp_supports_memmap_on_memory(unsigned long size)
+bool mhp_supports_memmap_on_memory(void)
{
unsigned long vmemmap_size = memory_block_memmap_size();
unsigned long memmap_pages = memory_block_memmap_on_memory_pages();
@@ -1334,17 +1334,11 @@ static bool mhp_supports_memmap_on_memory(unsigned long size)
* Besides having arch support and the feature enabled at runtime, we
* need a few more assumptions to hold true:
*
- * a) We span a single memory block: memory onlining/offlinin;g happens
- * in memory block granularity. We don't want the vmemmap of online
- * memory blocks to reside on offline memory blocks. In the future,
- * we might want to support variable-sized memory blocks to make the
- * feature more versatile.
- *
- * b) The vmemmap pages span complete PMDs: We don't want vmemmap code
+ * a) The vmemmap pages span complete PMDs: We don't want vmemmap code
* to populate memory from the altmap for unrelated parts (i.e.,
* other memory blocks)
*
- * c) The vmemmap pages (and thereby the pages that will be exposed to
+ * b) The vmemmap pages (and thereby the pages that will be exposed to
* the buddy) have to cover full pageblocks: memory onlining/offlining
* code requires applicable ranges to be page-aligned, for example, to
* set the migratetypes properly.
@@ -1356,7 +1350,7 @@ static bool mhp_supports_memmap_on_memory(unsigned long size)
* altmap as an alternative source of memory, and we do not exactly
* populate a single PMD.
*/
- if (!mhp_memmap_on_memory() || size != memory_block_size_bytes())
+ if (!mhp_memmap_on_memory())
return false;
/*
@@ -1379,6 +1373,7 @@ static bool mhp_supports_memmap_on_memory(unsigned long size)
return arch_supports_memmap_on_memory(vmemmap_size);
}
+EXPORT_SYMBOL_GPL(mhp_supports_memmap_on_memory);
static void __ref remove_memory_blocks_and_altmaps(u64 start, u64 size)
{
@@ -1512,7 +1507,7 @@ int __ref add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags)
* Self hosted memmap array
*/
if ((mhp_flags & MHP_MEMMAP_ON_MEMORY) &&
- mhp_supports_memmap_on_memory(memory_block_size_bytes())) {
+ mhp_supports_memmap_on_memory()) {
ret = create_altmaps_and_memory_blocks(nid, group, start, size);
if (ret)
goto error;
--
2.41.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior
2023-12-14 7:37 [PATCH v5 0/4] Add DAX ABI for memmap_on_memory Vishal Verma
` (2 preceding siblings ...)
2023-12-14 7:37 ` [PATCH v5 3/4] mm/memory_hotplug: export mhp_supports_memmap_on_memory() Vishal Verma
@ 2023-12-14 7:37 ` Vishal Verma
2023-12-14 8:31 ` Greg Kroah-Hartman
2023-12-15 4:53 ` Huang, Ying
3 siblings, 2 replies; 8+ messages in thread
From: Vishal Verma @ 2023-12-14 7:37 UTC (permalink / raw)
To: Dan Williams, Vishal Verma, Dave Jiang, Andrew Morton, Oscar Salvador
Cc: linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Huang Ying, Greg Kroah-Hartman, linux-mm, Li Zhijian,
Jonathan Cameron
Add a sysfs knob for dax devices to control the memmap_on_memory setting
if the dax device were to be hotplugged as system memory.
The default memmap_on_memory setting for dax devices originating via
pmem or hmem is set to 'false' - i.e. no memmap_on_memory semantics, to
preserve legacy behavior. For dax devices via CXL, the default is on.
The sysfs control allows the administrator to override the above
defaults if needed.
Cc: David Hildenbrand <david@redhat.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Huang Ying <ying.huang@intel.com>
Tested-by: Li Zhijian <lizhijian@fujitsu.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/dax/bus.c | 38 +++++++++++++++++++++++++++++++++
Documentation/ABI/testing/sysfs-bus-dax | 17 +++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
index 6226de131d17..f4d3beec507c 100644
--- a/drivers/dax/bus.c
+++ b/drivers/dax/bus.c
@@ -1245,6 +1245,43 @@ static ssize_t numa_node_show(struct device *dev,
}
static DEVICE_ATTR_RO(numa_node);
+static ssize_t memmap_on_memory_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct dev_dax *dev_dax = to_dev_dax(dev);
+
+ return sprintf(buf, "%d\n", dev_dax->memmap_on_memory);
+}
+
+static ssize_t memmap_on_memory_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t len)
+{
+ struct dev_dax *dev_dax = to_dev_dax(dev);
+ struct dax_device_driver *dax_drv;
+ ssize_t rc;
+ bool val;
+
+ rc = kstrtobool(buf, &val);
+ if (rc)
+ return rc;
+
+ if (val == true && !mhp_supports_memmap_on_memory()) {
+ dev_dbg(dev, "memmap_on_memory is not available\n");
+ return -EOPNOTSUPP;
+ }
+
+ guard(device)(dev);
+ dax_drv = to_dax_drv(dev->driver);
+ if (dax_drv && dev_dax->memmap_on_memory != val &&
+ dax_drv->type == DAXDRV_KMEM_TYPE)
+ return -EBUSY;
+ dev_dax->memmap_on_memory = val;
+
+ return len;
+}
+static DEVICE_ATTR_RW(memmap_on_memory);
+
static umode_t dev_dax_visible(struct kobject *kobj, struct attribute *a, int n)
{
struct device *dev = container_of(kobj, struct device, kobj);
@@ -1271,6 +1308,7 @@ static struct attribute *dev_dax_attributes[] = {
&dev_attr_align.attr,
&dev_attr_resource.attr,
&dev_attr_numa_node.attr,
+ &dev_attr_memmap_on_memory.attr,
NULL,
};
diff --git a/Documentation/ABI/testing/sysfs-bus-dax b/Documentation/ABI/testing/sysfs-bus-dax
index 6359f7bc9bf4..40d9965733b2 100644
--- a/Documentation/ABI/testing/sysfs-bus-dax
+++ b/Documentation/ABI/testing/sysfs-bus-dax
@@ -134,3 +134,20 @@ KernelVersion: v5.1
Contact: nvdimm@lists.linux.dev
Description:
(RO) The id attribute indicates the region id of a dax region.
+
+What: /sys/bus/dax/devices/daxX.Y/memmap_on_memory
+Date: October, 2023
+KernelVersion: v6.8
+Contact: nvdimm@lists.linux.dev
+Description:
+ (RW) Control the memmap_on_memory setting if the dax device
+ were to be hotplugged as system memory. This determines whether
+ the 'altmap' for the hotplugged memory will be placed on the
+ device being hotplugged (memmap_on_memory=1) or if it will be
+ placed on regular memory (memmap_on_memory=0). This attribute
+ must be set before the device is handed over to the 'kmem'
+ driver (i.e. hotplugged into system-ram). Additionally, this
+ depends on CONFIG_MHP_MEMMAP_ON_MEMORY, and a globally enabled
+ memmap_on_memory parameter for memory_hotplug. This is
+ typically set on the kernel command line -
+ memory_hotplug.memmap_on_memory set to 'true' or 'force'."
--
2.41.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior
2023-12-14 7:37 ` [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior Vishal Verma
@ 2023-12-14 8:31 ` Greg Kroah-Hartman
2023-12-15 4:53 ` Huang, Ying
1 sibling, 0 replies; 8+ messages in thread
From: Greg Kroah-Hartman @ 2023-12-14 8:31 UTC (permalink / raw)
To: Vishal Verma
Cc: Dan Williams, Dave Jiang, Andrew Morton, Oscar Salvador,
linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Huang Ying, linux-mm, Li Zhijian, Jonathan Cameron
On Thu, Dec 14, 2023 at 12:37:57AM -0700, Vishal Verma wrote:
> +static ssize_t memmap_on_memory_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + struct dev_dax *dev_dax = to_dev_dax(dev);
> +
> + return sprintf(buf, "%d\n", dev_dax->memmap_on_memory);
checkpatch should have noticed that this should be sysfs_emit(), right?
If not, please make the change anyway.
> diff --git a/Documentation/ABI/testing/sysfs-bus-dax b/Documentation/ABI/testing/sysfs-bus-dax
> index 6359f7bc9bf4..40d9965733b2 100644
> --- a/Documentation/ABI/testing/sysfs-bus-dax
> +++ b/Documentation/ABI/testing/sysfs-bus-dax
> @@ -134,3 +134,20 @@ KernelVersion: v5.1
> Contact: nvdimm@lists.linux.dev
> Description:
> (RO) The id attribute indicates the region id of a dax region.
> +
> +What: /sys/bus/dax/devices/daxX.Y/memmap_on_memory
> +Date: October, 2023
It's not October anymore :)
thanks,
greg k-h
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v5 3/4] mm/memory_hotplug: export mhp_supports_memmap_on_memory()
2023-12-14 7:37 ` [PATCH v5 3/4] mm/memory_hotplug: export mhp_supports_memmap_on_memory() Vishal Verma
@ 2023-12-14 9:10 ` David Hildenbrand
0 siblings, 0 replies; 8+ messages in thread
From: David Hildenbrand @ 2023-12-14 9:10 UTC (permalink / raw)
To: Vishal Verma, Dan Williams, Dave Jiang, Andrew Morton, Oscar Salvador
Cc: linux-kernel, nvdimm, linux-cxl, Dave Hansen, Huang Ying,
Greg Kroah-Hartman, linux-mm, Michal Hocko
On 14.12.23 08:37, Vishal Verma wrote:
> In preparation for adding sysfs ABI to toggle memmap_on_memory semantics
> for drivers adding memory, export the mhp_supports_memmap_on_memory()
> helper. This allows drivers to check if memmap_on_memory support is
> available before trying to request it, and display an appropriate
> message if it isn't available. As part of this, remove the size argument
> to this - with recent updates to allow memmap_on_memory for larger
> ranges, and the internal splitting of altmaps into respective memory
> blocks, the size argument is meaningless.
>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: David Hildenbrand <david@redhat.com>
> Cc: Michal Hocko <mhocko@suse.com>
> Cc: Oscar Salvador <osalvador@suse.de>
> Cc: Dan Williams <dan.j.williams@intel.com>
> Cc: Dave Jiang <dave.jiang@intel.com>
> Cc: Dave Hansen <dave.hansen@linux.intel.com>
> Cc: Huang Ying <ying.huang@intel.com>
> Suggested-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
> ---
> include/linux/memory_hotplug.h | 6 ++++++
> mm/memory_hotplug.c | 17 ++++++-----------
> 2 files changed, 12 insertions(+), 11 deletions(-)
>
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index 7d2076583494..ebc9d528f00c 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -121,6 +121,7 @@ struct mhp_params {
>
> bool mhp_range_allowed(u64 start, u64 size, bool need_mapping);
> struct range mhp_get_pluggable_range(bool need_mapping);
> +bool mhp_supports_memmap_on_memory(void);
>
> /*
> * Zone resizing functions
> @@ -262,6 +263,11 @@ static inline bool movable_node_is_enabled(void)
> return false;
> }
>
> +static bool mhp_supports_memmap_on_memory(void)
> +{
> + return false;
> +}
> +
> static inline void pgdat_kswapd_lock(pg_data_t *pgdat) {}
> static inline void pgdat_kswapd_unlock(pg_data_t *pgdat) {}
> static inline void pgdat_kswapd_lock_init(pg_data_t *pgdat) {}
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 926e1cfb10e9..751664c519f7 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -1325,7 +1325,7 @@ static inline bool arch_supports_memmap_on_memory(unsigned long vmemmap_size)
> }
> #endif
>
> -static bool mhp_supports_memmap_on_memory(unsigned long size)
> +bool mhp_supports_memmap_on_memory(void)
> {
> unsigned long vmemmap_size = memory_block_memmap_size();
> unsigned long memmap_pages = memory_block_memmap_on_memory_pages();
> @@ -1334,17 +1334,11 @@ static bool mhp_supports_memmap_on_memory(unsigned long size)
> * Besides having arch support and the feature enabled at runtime, we
> * need a few more assumptions to hold true:
> *
> - * a) We span a single memory block: memory onlining/offlinin;g happens
> - * in memory block granularity. We don't want the vmemmap of online
> - * memory blocks to reside on offline memory blocks. In the future,
> - * we might want to support variable-sized memory blocks to make the
> - * feature more versatile.
> - *
> - * b) The vmemmap pages span complete PMDs: We don't want vmemmap code
> + * a) The vmemmap pages span complete PMDs: We don't want vmemmap code
> * to populate memory from the altmap for unrelated parts (i.e.,
> * other memory blocks)
> *
> - * c) The vmemmap pages (and thereby the pages that will be exposed to
> + * b) The vmemmap pages (and thereby the pages that will be exposed to
> * the buddy) have to cover full pageblocks: memory onlining/offlining
> * code requires applicable ranges to be page-aligned, for example, to
> * set the migratetypes properly.
> @@ -1356,7 +1350,7 @@ static bool mhp_supports_memmap_on_memory(unsigned long size)
> * altmap as an alternative source of memory, and we do not exactly
> * populate a single PMD.
> */
> - if (!mhp_memmap_on_memory() || size != memory_block_size_bytes())
> + if (!mhp_memmap_on_memory())
> return false;
>
> /*
> @@ -1379,6 +1373,7 @@ static bool mhp_supports_memmap_on_memory(unsigned long size)
>
> return arch_supports_memmap_on_memory(vmemmap_size);
> }
> +EXPORT_SYMBOL_GPL(mhp_supports_memmap_on_memory);
>
> static void __ref remove_memory_blocks_and_altmaps(u64 start, u64 size)
> {
> @@ -1512,7 +1507,7 @@ int __ref add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags)
> * Self hosted memmap array
> */
> if ((mhp_flags & MHP_MEMMAP_ON_MEMORY) &&
> - mhp_supports_memmap_on_memory(memory_block_size_bytes())) {
> + mhp_supports_memmap_on_memory()) {
> ret = create_altmaps_and_memory_blocks(nid, group, start, size);
> if (ret)
> goto error;
>
Acked-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior
2023-12-14 7:37 ` [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior Vishal Verma
2023-12-14 8:31 ` Greg Kroah-Hartman
@ 2023-12-15 4:53 ` Huang, Ying
1 sibling, 0 replies; 8+ messages in thread
From: Huang, Ying @ 2023-12-15 4:53 UTC (permalink / raw)
To: Vishal Verma
Cc: Dan Williams, Dave Jiang, Andrew Morton, Oscar Salvador,
linux-kernel, nvdimm, linux-cxl, David Hildenbrand, Dave Hansen,
Greg Kroah-Hartman, linux-mm, Li Zhijian, Jonathan Cameron
Vishal Verma <vishal.l.verma@intel.com> writes:
> Add a sysfs knob for dax devices to control the memmap_on_memory setting
> if the dax device were to be hotplugged as system memory.
>
> The default memmap_on_memory setting for dax devices originating via
> pmem or hmem is set to 'false' - i.e. no memmap_on_memory semantics, to
> preserve legacy behavior. For dax devices via CXL, the default is on.
> The sysfs control allows the administrator to override the above
> defaults if needed.
>
> Cc: David Hildenbrand <david@redhat.com>
> Cc: Dan Williams <dan.j.williams@intel.com>
> Cc: Dave Jiang <dave.jiang@intel.com>
> Cc: Dave Hansen <dave.hansen@linux.intel.com>
> Cc: Huang Ying <ying.huang@intel.com>
> Tested-by: Li Zhijian <lizhijian@fujitsu.com>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
> ---
> drivers/dax/bus.c | 38 +++++++++++++++++++++++++++++++++
> Documentation/ABI/testing/sysfs-bus-dax | 17 +++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
> index 6226de131d17..f4d3beec507c 100644
> --- a/drivers/dax/bus.c
> +++ b/drivers/dax/bus.c
> @@ -1245,6 +1245,43 @@ static ssize_t numa_node_show(struct device *dev,
> }
> static DEVICE_ATTR_RO(numa_node);
>
> +static ssize_t memmap_on_memory_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + struct dev_dax *dev_dax = to_dev_dax(dev);
> +
> + return sprintf(buf, "%d\n", dev_dax->memmap_on_memory);
> +}
> +
> +static ssize_t memmap_on_memory_store(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t len)
> +{
> + struct dev_dax *dev_dax = to_dev_dax(dev);
> + struct dax_device_driver *dax_drv;
> + ssize_t rc;
> + bool val;
> +
> + rc = kstrtobool(buf, &val);
> + if (rc)
> + return rc;
> +
> + if (val == true && !mhp_supports_memmap_on_memory()) {
> + dev_dbg(dev, "memmap_on_memory is not available\n");
> + return -EOPNOTSUPP;
> + }
> +
> + guard(device)(dev);
> + dax_drv = to_dax_drv(dev->driver);
Although "struct driver" is the first member of "struct
dax_device_driver", I feel the code is fragile to depends on that. Can
we check dev->driver directly instead?
--
Best Regards,
Huang, Ying
> + if (dax_drv && dev_dax->memmap_on_memory != val &&
> + dax_drv->type == DAXDRV_KMEM_TYPE)
> + return -EBUSY;
> + dev_dax->memmap_on_memory = val;
> +
> + return len;
> +}
> +static DEVICE_ATTR_RW(memmap_on_memory);
> +
> static umode_t dev_dax_visible(struct kobject *kobj, struct attribute *a, int n)
> {
> struct device *dev = container_of(kobj, struct device, kobj);
> @@ -1271,6 +1308,7 @@ static struct attribute *dev_dax_attributes[] = {
> &dev_attr_align.attr,
> &dev_attr_resource.attr,
> &dev_attr_numa_node.attr,
> + &dev_attr_memmap_on_memory.attr,
> NULL,
> };
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-dax b/Documentation/ABI/testing/sysfs-bus-dax
> index 6359f7bc9bf4..40d9965733b2 100644
> --- a/Documentation/ABI/testing/sysfs-bus-dax
> +++ b/Documentation/ABI/testing/sysfs-bus-dax
> @@ -134,3 +134,20 @@ KernelVersion: v5.1
> Contact: nvdimm@lists.linux.dev
> Description:
> (RO) The id attribute indicates the region id of a dax region.
> +
> +What: /sys/bus/dax/devices/daxX.Y/memmap_on_memory
> +Date: October, 2023
> +KernelVersion: v6.8
> +Contact: nvdimm@lists.linux.dev
> +Description:
> + (RW) Control the memmap_on_memory setting if the dax device
> + were to be hotplugged as system memory. This determines whether
> + the 'altmap' for the hotplugged memory will be placed on the
> + device being hotplugged (memmap_on_memory=1) or if it will be
> + placed on regular memory (memmap_on_memory=0). This attribute
> + must be set before the device is handed over to the 'kmem'
> + driver (i.e. hotplugged into system-ram). Additionally, this
> + depends on CONFIG_MHP_MEMMAP_ON_MEMORY, and a globally enabled
> + memmap_on_memory parameter for memory_hotplug. This is
> + typically set on the kernel command line -
> + memory_hotplug.memmap_on_memory set to 'true' or 'force'."
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-12-15 4:55 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-14 7:37 [PATCH v5 0/4] Add DAX ABI for memmap_on_memory Vishal Verma
2023-12-14 7:37 ` [PATCH v5 1/4] Documentatiion/ABI: Add ABI documentation for sys-bus-dax Vishal Verma
2023-12-14 7:37 ` [PATCH v5 2/4] dax/bus: Use guard(device) in sysfs attribute helpers Vishal Verma
2023-12-14 7:37 ` [PATCH v5 3/4] mm/memory_hotplug: export mhp_supports_memmap_on_memory() Vishal Verma
2023-12-14 9:10 ` David Hildenbrand
2023-12-14 7:37 ` [PATCH v5 4/4] dax: add a sysfs knob to control memmap_on_memory behavior Vishal Verma
2023-12-14 8:31 ` Greg Kroah-Hartman
2023-12-15 4:53 ` Huang, Ying
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox