Re: [PATCH v4 22/28] cxl/region/extent: Expose region extent information in sysfs
From: Fan Ni
Date: Mon Oct 14 2024 - 12:10:19 EST
On Mon, Oct 07, 2024 at 06:16:28PM -0500, ira.weiny@xxxxxxxxx wrote:
> From: Navneet Singh <navneet.singh@xxxxxxxxx>
>
> Extent information can be helpful to the user to coordinate memory usage
> with the external orchestrator and FM.
>
> Expose the details of region extents by creating the following
> sysfs entries.
>
> /sys/bus/cxl/devices/dax_regionX/extentX.Y
> /sys/bus/cxl/devices/dax_regionX/extentX.Y/offset
> /sys/bus/cxl/devices/dax_regionX/extentX.Y/length
> /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag
>
> Signed-off-by: Navneet Singh <navneet.singh@xxxxxxxxx>
> Co-developed-by: Ira Weiny <ira.weiny@xxxxxxxxx>
> Signed-off-by: Ira Weiny <ira.weiny@xxxxxxxxx>
>
Reviewed-by: Fan Ni <fan.ni@xxxxxxxxxxx>
Tested-by: Fan Ni <fan.ni@xxxxxxxxxxx>
> ---
> Changes:
> [djiang: Split sysfs docs up]
> [iweiny: Adjust sysfs docs dates]
> ---
> Documentation/ABI/testing/sysfs-bus-cxl | 32 ++++++++++++++++++
> drivers/cxl/core/extent.c | 58 +++++++++++++++++++++++++++++++++
> 2 files changed, 90 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
> index b63ab622515f..64918180a3c9 100644
> --- a/Documentation/ABI/testing/sysfs-bus-cxl
> +++ b/Documentation/ABI/testing/sysfs-bus-cxl
> @@ -632,3 +632,35 @@ Description:
> See Documentation/ABI/stable/sysfs-devices-node. access0 provides
> the number to the closest initiator and access1 provides the
> number to the closest CPU.
> +
> +What: /sys/bus/cxl/devices/dax_regionX/extentX.Y/offset
> +Date: December, 2024
> +KernelVersion: v6.13
> +Contact: linux-cxl@xxxxxxxxxxxxxxx
> +Description:
> + (RO) [For Dynamic Capacity regions only] Users can use the
> + extent information to create DAX devices on specific extents.
> + This is done by creating and destroying DAX devices in specific
> + sequences and looking at the mappings created. Extent offset
> + within the region.
> +
> +What: /sys/bus/cxl/devices/dax_regionX/extentX.Y/length
> +Date: December, 2024
> +KernelVersion: v6.13
> +Contact: linux-cxl@xxxxxxxxxxxxxxx
> +Description:
> + (RO) [For Dynamic Capacity regions only] Users can use the
> + extent information to create DAX devices on specific extents.
> + This is done by creating and destroying DAX devices in specific
> + sequences and looking at the mappings created. Extent length
> + within the region.
> +
> +What: /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag
> +Date: December, 2024
> +KernelVersion: v6.13
> +Contact: linux-cxl@xxxxxxxxxxxxxxx
> +Description:
> + (RO) [For Dynamic Capacity regions only] Users can use the
> + extent information to create DAX devices on specific extents.
> + This is done by creating and destroying DAX devices in specific
> + sequences and looking at the mappings created. Extent tag.
> diff --git a/drivers/cxl/core/extent.c b/drivers/cxl/core/extent.c
> index 69a7614ba6a9..a1eb6e8e4f1a 100644
> --- a/drivers/cxl/core/extent.c
> +++ b/drivers/cxl/core/extent.c
> @@ -6,6 +6,63 @@
>
> #include "core.h"
>
> +static ssize_t offset_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> +{
> + struct region_extent *region_extent = to_region_extent(dev);
> +
> + return sysfs_emit(buf, "%#llx\n", region_extent->hpa_range.start);
> +}
> +static DEVICE_ATTR_RO(offset);
> +
> +static ssize_t length_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> +{
> + struct region_extent *region_extent = to_region_extent(dev);
> + u64 length = range_len(®ion_extent->hpa_range);
> +
> + return sysfs_emit(buf, "%#llx\n", length);
> +}
> +static DEVICE_ATTR_RO(length);
> +
> +static ssize_t tag_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> +{
> + struct region_extent *region_extent = to_region_extent(dev);
> +
> + return sysfs_emit(buf, "%pUb\n", ®ion_extent->tag);
> +}
> +static DEVICE_ATTR_RO(tag);
> +
> +static struct attribute *region_extent_attrs[] = {
> + &dev_attr_offset.attr,
> + &dev_attr_length.attr,
> + &dev_attr_tag.attr,
> + NULL,
> +};
> +
> +static uuid_t empty_tag = { 0 };
> +
> +static umode_t region_extent_visible(struct kobject *kobj,
> + struct attribute *a, int n)
> +{
> + struct device *dev = kobj_to_dev(kobj);
> + struct region_extent *region_extent = to_region_extent(dev);
> +
> + if (a == &dev_attr_tag.attr &&
> + uuid_equal(®ion_extent->tag, &empty_tag))
> + return 0;
> +
> + return a->mode;
> +}
> +
> +static const struct attribute_group region_extent_attribute_group = {
> + .attrs = region_extent_attrs,
> + .is_visible = region_extent_visible,
> +};
> +
> +__ATTRIBUTE_GROUPS(region_extent_attribute);
> +
> static void cxled_release_extent(struct cxl_endpoint_decoder *cxled,
> struct cxled_extent *ed_extent)
> {
> @@ -44,6 +101,7 @@ static void region_extent_release(struct device *dev)
> static const struct device_type region_extent_type = {
> .name = "extent",
> .release = region_extent_release,
> + .groups = region_extent_attribute_groups,
> };
>
> bool is_region_extent(struct device *dev)
>
> --
> 2.46.0
>
--
Fan Ni