From: Navneet Singh <navneet.singh@intel.com>
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@intel.com>
Co-developed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
Changes:
[iweiny: split this out]
[Jonathan: add documentation for extent sysfs]
[Jonathan/djbw: s/label/tag]
[Jonathan/djbw: treat tag as uuid]
[djbw: use __ATTRIBUTE_GROUPS]
[djbw: make tag invisible if it is empty]
[djbw/iweiny: use conventional id names for extents; extentX.Y]
---
Documentation/ABI/testing/sysfs-bus-cxl | 13 ++++++++
drivers/cxl/core/extent.c | 58 +++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
index 3a5ee88e551b..e97e6a73c960 100644
--- a/Documentation/ABI/testing/sysfs-bus-cxl
+++ b/Documentation/ABI/testing/sysfs-bus-cxl
@@ -599,3 +599,16 @@ 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
+ /sys/bus/cxl/devices/dax_regionX/extentX.Y/length
+ /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag
+Date: October, 2024
+KernelVersion: v6.12
+Contact: linux-cxl@vger.kernel.org
+Description:
+ (RO) [For Dynamic Capacity regions only] Extent offset and
+ length within the region. 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.
diff --git a/drivers/cxl/core/extent.c b/drivers/cxl/core/extent.c
index 34456594cdc3..d7d526a51e2b 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.45.2
On Fri, Aug 16, 2024 at 09:44:27AM -0500, ira.weiny@intel.com wrote:
> From: Navneet Singh <navneet.singh@intel.com>
>
> 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@intel.com>
> Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Fan Ni <fan.ni@samsung.com>
>
> ---
> Changes:
> [iweiny: split this out]
> [Jonathan: add documentation for extent sysfs]
> [Jonathan/djbw: s/label/tag]
> [Jonathan/djbw: treat tag as uuid]
> [djbw: use __ATTRIBUTE_GROUPS]
> [djbw: make tag invisible if it is empty]
> [djbw/iweiny: use conventional id names for extents; extentX.Y]
> ---
> Documentation/ABI/testing/sysfs-bus-cxl | 13 ++++++++
> drivers/cxl/core/extent.c | 58 +++++++++++++++++++++++++++++++++
> 2 files changed, 71 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
> index 3a5ee88e551b..e97e6a73c960 100644
> --- a/Documentation/ABI/testing/sysfs-bus-cxl
> +++ b/Documentation/ABI/testing/sysfs-bus-cxl
> @@ -599,3 +599,16 @@ 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
> + /sys/bus/cxl/devices/dax_regionX/extentX.Y/length
> + /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag
> +Date: October, 2024
> +KernelVersion: v6.12
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (RO) [For Dynamic Capacity regions only] Extent offset and
> + length within the region. 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.
> diff --git a/drivers/cxl/core/extent.c b/drivers/cxl/core/extent.c
> index 34456594cdc3..d7d526a51e2b 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.45.2
>
--
Fan Ni
On Fri, 16 Aug 2024 09:44:27 -0500 ira.weiny@intel.com wrote: > From: Navneet Singh <navneet.singh@intel.com> > > 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@intel.com> > Co-developed-by: Ira Weiny <ira.weiny@intel.com> > Signed-off-by: Ira Weiny <ira.weiny@intel.com> > LGTM with or without the docs split. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
On 8/16/24 7:44 AM, ira.weiny@intel.com wrote:
> From: Navneet Singh <navneet.singh@intel.com>
>
> 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@intel.com>
> Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
>
> ---
> Changes:
> [iweiny: split this out]
> [Jonathan: add documentation for extent sysfs]
> [Jonathan/djbw: s/label/tag]
> [Jonathan/djbw: treat tag as uuid]
> [djbw: use __ATTRIBUTE_GROUPS]
> [djbw: make tag invisible if it is empty]
> [djbw/iweiny: use conventional id names for extents; extentX.Y]
> ---
> Documentation/ABI/testing/sysfs-bus-cxl | 13 ++++++++
> drivers/cxl/core/extent.c | 58 +++++++++++++++++++++++++++++++++
> 2 files changed, 71 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
> index 3a5ee88e551b..e97e6a73c960 100644
> --- a/Documentation/ABI/testing/sysfs-bus-cxl
> +++ b/Documentation/ABI/testing/sysfs-bus-cxl
> @@ -599,3 +599,16 @@ 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
> + /sys/bus/cxl/devices/dax_regionX/extentX.Y/length
> + /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag
I wonder consider an entry for each with their own descriptions, which seems to be the standard practice.
DJ
> +Date: October, 2024
> +KernelVersion: v6.12
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (RO) [For Dynamic Capacity regions only] Extent offset and
> + length within the region. 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.
> diff --git a/drivers/cxl/core/extent.c b/drivers/cxl/core/extent.c
> index 34456594cdc3..d7d526a51e2b 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)
>
Dave Jiang wrote:
>
>
> On 8/16/24 7:44 AM, ira.weiny@intel.com wrote:
> > From: Navneet Singh <navneet.singh@intel.com>
> >
> > 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@intel.com>
> > Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> > Signed-off-by: Ira Weiny <ira.weiny@intel.com>
> >
> > ---
> > Changes:
> > [iweiny: split this out]
> > [Jonathan: add documentation for extent sysfs]
> > [Jonathan/djbw: s/label/tag]
> > [Jonathan/djbw: treat tag as uuid]
> > [djbw: use __ATTRIBUTE_GROUPS]
> > [djbw: make tag invisible if it is empty]
> > [djbw/iweiny: use conventional id names for extents; extentX.Y]
> > ---
> > Documentation/ABI/testing/sysfs-bus-cxl | 13 ++++++++
> > drivers/cxl/core/extent.c | 58 +++++++++++++++++++++++++++++++++
> > 2 files changed, 71 insertions(+)
> >
> > diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
> > index 3a5ee88e551b..e97e6a73c960 100644
> > --- a/Documentation/ABI/testing/sysfs-bus-cxl
> > +++ b/Documentation/ABI/testing/sysfs-bus-cxl
> > @@ -599,3 +599,16 @@ 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
> > + /sys/bus/cxl/devices/dax_regionX/extentX.Y/length
> > + /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag
>
> I wonder consider an entry for each with their own descriptions, which seems to be the standard practice.
:-/ Except kind of for the access'.
What: /sys/bus/cxl/devices/regionZ/accessY/read_bandwidth
/sys/bus/cxl/devices/regionZ/accessY/write_banwidth
What: /sys/bus/cxl/devices/regionZ/accessY/read_latency
/sys/bus/cxl/devices/regionZ/accessY/write_latency
But I think you have a point.
Ira
>
> DJ
>
[snip]
On Thu, 22 Aug 2024 21:58:02 -0500 Ira Weiny <ira.weiny@intel.com> wrote: > Dave Jiang wrote: > > > > > > On 8/16/24 7:44 AM, ira.weiny@intel.com wrote: > > > From: Navneet Singh <navneet.singh@intel.com> > > > > > > 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@intel.com> > > > Co-developed-by: Ira Weiny <ira.weiny@intel.com> > > > Signed-off-by: Ira Weiny <ira.weiny@intel.com> > > > > > > --- > > > Changes: > > > [iweiny: split this out] > > > [Jonathan: add documentation for extent sysfs] > > > [Jonathan/djbw: s/label/tag] > > > [Jonathan/djbw: treat tag as uuid] > > > [djbw: use __ATTRIBUTE_GROUPS] > > > [djbw: make tag invisible if it is empty] > > > [djbw/iweiny: use conventional id names for extents; extentX.Y] > > > --- > > > Documentation/ABI/testing/sysfs-bus-cxl | 13 ++++++++ > > > drivers/cxl/core/extent.c | 58 +++++++++++++++++++++++++++++++++ > > > 2 files changed, 71 insertions(+) > > > > > > diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl > > > index 3a5ee88e551b..e97e6a73c960 100644 > > > --- a/Documentation/ABI/testing/sysfs-bus-cxl > > > +++ b/Documentation/ABI/testing/sysfs-bus-cxl > > > @@ -599,3 +599,16 @@ 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 > > > + /sys/bus/cxl/devices/dax_regionX/extentX.Y/length > > > + /sys/bus/cxl/devices/dax_regionX/extentX.Y/tag > > > > I wonder consider an entry for each with their own descriptions, which seems to be the standard practice. > > :-/ Except kind of for the access'. > > What: /sys/bus/cxl/devices/regionZ/accessY/read_bandwidth > /sys/bus/cxl/devices/regionZ/accessY/write_banwidth > > What: /sys/bus/cxl/devices/regionZ/accessY/read_latency > /sys/bus/cxl/devices/regionZ/accessY/write_latency > > But I think you have a point. It's a balance between complexity and repetition. E.g. https://elixir.bootlin.com/linux/v6.11-rc4/source/Documentation/ABI/testing/sysfs-bus-iio#L427 is one of these files I know far too well. That would be a lot of very boring repetition and that doc is long enough without breaking them up. Here there are only 3 and a good bit of description differs so probably good to split up. Less so for bandwidth and latency cases. Jonathan > > Ira > > > > > DJ > > > > [snip] >
© 2016 - 2026 Red Hat, Inc.