From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Dave Jiang <dave.jiang@intel.com>
Cc: <linux-cxl@vger.kernel.org>, <linux-acpi@vger.kernel.org>,
<dan.j.williams@intel.com>, <ira.weiny@intel.com>,
<vishal.l.verma@intel.com>, <alison.schofield@intel.com>,
<dave@stgolabs.net>, <rafael@kernel.org>,
<gregkh@linuxfoundation.org>
Subject: Re: [PATCH v5 10/12] cxl/region: Add sysfs attribute for locality attributes of CXL regions
Date: Thu, 15 Feb 2024 17:08:42 +0000 [thread overview]
Message-ID: <20240215170842.00006e18@Huawei.com> (raw)
In-Reply-To: <20240206222951.1833098-11-dave.jiang@intel.com>
On Tue, 6 Feb 2024 15:28:38 -0700
Dave Jiang <dave.jiang@intel.com> wrote:
> Add read/write latencies and bandwidth sysfs attributes for the enabled CXL
> region. The bandwidth is the aggregated bandwidth of all devices that
> contribute to the CXL region. The latency is the worst latency of the
> device amongst all the devices that contribute to the CXL region.
>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
A few comments inline. Mostly about reducing duplication.
> ---
> Documentation/ABI/testing/sysfs-bus-cxl | 60 +++++++++++
> drivers/cxl/core/region.c | 134 ++++++++++++++++++++++++
> 2 files changed, 194 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
> index fff2581b8033..5f8c26815399 100644
> --- a/Documentation/ABI/testing/sysfs-bus-cxl
> +++ b/Documentation/ABI/testing/sysfs-bus-cxl
> @@ -552,3 +552,63 @@ Description:
> attribute is only visible for devices supporting the
> capability. The retrieved errors are logged as kernel
> events when cxl_poison event tracing is enabled.
> +
> +
> +What: /sys/bus/cxl/devices/regionZ/accessY/read_bandwidth
Up to you, but it's fairly common to have multiple what lines in these
files and you could easily combine at least the read/write descriptions.
> +Date: Jan, 2024
> +KernelVersion: v6.9
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (RO) The aggregated read bandwidth of the region. The number is
> + the accumulated read bandwidth of all CXL memory devices that
> + contributes to the region in MB/s. It is identical data that
> + should appear in
> + /sys/devices/system/node/nodeX/accessY/initiators/read_bandwidth.
> + 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/regionZ/accessY/write_bandwidth
> +Date: Jan, 2024
> +KernelVersion: v6.9
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (RO) The aggregated write bandwidth of the region. The number is
> + the accumulated write bandwidth of all CXL memory devices that
> + contributes to the region in MB/s. It is identical data that
> + should appear in
> + /sys/devices/system/node/nodeX/accessY/initiators/write_bandwidth.
> + 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/regionZ/accessY/read_latency
> +Date: Jan, 2024
> +KernelVersion: v6.9
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (RO) The read latency of the region. The number is
> + the worst read latency of all CXL memory devices that
> + contributes to the region in nanoseconds. It is identical data
> + that should appear in
> + /sys/devices/system/node/nodeX/accessY/initiators/read_latency.
> + 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/regionZ/accessY/write_latency
> +Date: Jan, 2024
> +KernelVersion: v6.9
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (RO) The write latency of the region. The number is
> + the worst write latency of all CXL memory devices that
> + contributes to the region in nanoseconds. It is identical data
> + that should appear in
> + /sys/devices/system/node/nodeX/accessY/initiators/write_latency.
> + See Documentation/ABI/stable/sysfs-devices-node. access0 provides
> + the number to the closest initiator and access1 provides the
> + number to the closest CPU.
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index 0c2337b1fd41..6347dbc746f9 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -30,6 +30,138 @@
>
> static struct cxl_region *to_cxl_region(struct device *dev);
>
> +#define __ACCESS0_ATTR_RO(_name) { \
> + .attr = { .name = __stringify(_name), .mode = 0444 }, \
> + .show = _name##_access0_show, \
> +}
> +
> +#define ACCESS0_DEVICE_ATTR_RO(_name) \
> + struct device_attribute dev_attr_access0_##_name = __ACCESS0_ATTR_RO(_name)
> +
> +#define ACCESS0_ATTR(attrib) \
> +static ssize_t attrib##_access0_show(struct device *dev, \
> + struct device_attribute *attr, \
> + char *buf) \
> +{ \
> + struct cxl_region *cxlr = to_cxl_region(dev); \
> + \
> + if (cxlr->coord[0].attrib == 0) \
> + return -ENOENT; \
> + \
> + return sysfs_emit(buf, "%u\n", cxlr->coord[0].attrib); \
> +} \
> +static ACCESS0_DEVICE_ATTR_RO(attrib)
> +
> +ACCESS0_ATTR(read_bandwidth);
> +ACCESS0_ATTR(read_latency);
> +ACCESS0_ATTR(write_bandwidth);
> +ACCESS0_ATTR(write_latency);
> +
> +static struct attribute *access0_coordinate_attrs[] = {
> + &dev_attr_access0_read_bandwidth.attr,
> + &dev_attr_access0_write_bandwidth.attr,
> + &dev_attr_access0_read_latency.attr,
> + &dev_attr_access0_write_latency.attr,
> + NULL,
> +};
> +
> +static umode_t cxl_region_access0_coordinate_visible(struct kobject *kobj,
> + struct attribute *a, int n)
> +{
> + struct device *dev = kobj_to_dev(kobj);
> + struct cxl_region *cxlr = to_cxl_region(dev);
> +
> + if (a == &dev_attr_access0_read_latency.attr &&
> + cxlr->coord[ACCESS_COORDINATE_LOCAL].read_latency == 0)
> + return 0;
> +
> + if (a == &dev_attr_access0_write_latency.attr &&
> + cxlr->coord[ACCESS_COORDINATE_LOCAL].write_latency == 0)
> + return 0;
> +
> + if (a == &dev_attr_access0_read_bandwidth.attr &&
> + cxlr->coord[ACCESS_COORDINATE_LOCAL].read_bandwidth == 0)
> + return 0;
> +
> + if (a == &dev_attr_access0_write_bandwidth.attr &&
> + cxlr->coord[ACCESS_COORDINATE_LOCAL].write_bandwidth == 0)
> + return 0;
> +
> + return a->mode;
> +}
> +
> +#define __ACCESS1_ATTR_RO(_name) { \
> + .attr = { .name = __stringify(_name), .mode = 0444 }, \
> + .show = _name##_access1_show, \
> +}
Maybe define __ACCESSX_ATTR_RO(_name, _access)
etc to avoid some duplicaton.
> +
> +#define ACCESS1_DEVICE_ATTR_RO(_name) \
> + struct device_attribute dev_attr_access1_##_name = __ACCESS1_ATTR_RO(_name)
> +
> +#define ACCESS1_ATTR(attrib) \
> +static ssize_t attrib##_access1_show(struct device *dev, \
> + struct device_attribute *attr, \
> + char *buf) \
> +{ \
> + struct cxl_region *cxlr = to_cxl_region(dev); \
> + \
> + if (cxlr->coord[1].attrib == 0) \
> + return -ENOENT; \
> + \
> + return sysfs_emit(buf, "%u\n", cxlr->coord[1].attrib); \
> +} \
> +static ACCESS1_DEVICE_ATTR_RO(attrib)
> +
> +ACCESS1_ATTR(read_bandwidth);
> +ACCESS1_ATTR(read_latency);
> +ACCESS1_ATTR(write_bandwidth);
> +ACCESS1_ATTR(write_latency);
> +
> +static struct attribute *access1_coordinate_attrs[] = {
> + &dev_attr_access1_read_bandwidth.attr,
> + &dev_attr_access1_write_bandwidth.attr,
> + &dev_attr_access1_read_latency.attr,
> + &dev_attr_access1_write_latency.attr,
> + NULL,
> +};
> +
> +static umode_t cxl_region_access1_coordinate_visible(struct kobject *kobj,
> + struct attribute *a, int n)
> +{
> + struct device *dev = kobj_to_dev(kobj);
> + struct cxl_region *cxlr = to_cxl_region(dev);
> +
> + if (a == &dev_attr_access1_read_latency.attr &&
> + cxlr->coord[ACCESS_COORDINATE_CPU].read_latency == 0)
> + return 0;
> +
> + if (a == &dev_attr_access1_write_latency.attr &&
> + cxlr->coord[ACCESS_COORDINATE_CPU].write_latency == 0)
> + return 0;
> +
> + if (a == &dev_attr_access1_read_bandwidth.attr &&
> + cxlr->coord[ACCESS_COORDINATE_CPU].read_bandwidth == 0)
> + return 0;
> +
> + if (a == &dev_attr_access1_write_bandwidth.attr &&
> + cxlr->coord[ACCESS_COORDINATE_CPU].write_bandwidth == 0)
> + return 0;
> +
> + return a->mode;
> +}
> +
> +static const struct attribute_group cxl_region_access0_coordinate_group = {
> + .name = "access0",
> + .attrs = access0_coordinate_attrs,
> + .is_visible = cxl_region_access0_coordinate_visible,
> +};
> +
> +static const struct attribute_group cxl_region_access1_coordinate_group = {
> + .name = "access1",
> + .attrs = access1_coordinate_attrs,
> + .is_visible = cxl_region_access1_coordinate_visible,
> +};
> +
> static ssize_t uuid_show(struct device *dev, struct device_attribute *attr,
> char *buf)
> {
> @@ -2039,6 +2171,8 @@ static const struct attribute_group *region_groups[] = {
> &cxl_base_attribute_group,
> &cxl_region_group,
> &cxl_region_target_group,
> + &cxl_region_access0_coordinate_group,
> + &cxl_region_access1_coordinate_group,
> NULL,
> };
>
next prev parent reply other threads:[~2024-02-15 17:08 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-06 22:28 [PATCH v5 0/12] cxl: Add support to report region access coordinates to numa nodes Dave Jiang
2024-02-06 22:28 ` [PATCH v5 01/12] ACPI: HMAT: Remove register of memory node for generic target Dave Jiang
2024-02-15 16:20 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 02/12] base/node / ACPI: Enumerate node access class for 'struct access_coordinate' Dave Jiang
2024-02-15 16:24 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 03/12] ACPI: HMAT: Introduce 2 levels of generic port access class Dave Jiang
2024-02-15 16:44 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 04/12] ACPI: HMAT / cxl: Add retrieval of generic port coordinates for both access classes Dave Jiang
2024-02-15 16:46 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 05/12] cxl: Split out combine_coordinates() for common shared usage Dave Jiang
2024-02-15 16:51 ` Jonathan Cameron
2024-02-16 21:28 ` Dave Jiang
2024-02-06 22:28 ` [PATCH v5 06/12] cxl: Split out host bridge access coordinates Dave Jiang
2024-02-15 16:56 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 07/12] cxl: Move QoS class to be calculated from the nearest CPU Dave Jiang
2024-02-15 16:57 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 08/12] cxl: Set cxlmd->endpoint before adding port device Dave Jiang
2024-02-15 17:01 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 09/12] cxl/region: Calculate performance data for a region Dave Jiang
2024-02-06 22:28 ` [PATCH v5 10/12] cxl/region: Add sysfs attribute for locality attributes of CXL regions Dave Jiang
2024-02-15 17:08 ` Jonathan Cameron [this message]
2024-02-06 22:28 ` [PATCH v5 11/12] cxl/region: Add memory hotplug notifier for cxl region Dave Jiang
2024-02-15 17:16 ` Jonathan Cameron
2024-02-06 22:28 ` [PATCH v5 12/12] cxl/region: Deal with numa nodes not enumarated by SRAT Dave Jiang
2024-02-15 17:24 ` Jonathan Cameron
2024-02-20 20:47 ` Dave Jiang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240215170842.00006e18@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=gregkh@linuxfoundation.org \
--cc=ira.weiny@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=vishal.l.verma@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox