Add helper function node_update_perf_attrs() to allow update of node access
coordinates computed by an external agent such as CXL. The helper allows
updating of coordinates after the attribute being created by HMAT.
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
drivers/base/node.c | 39 +++++++++++++++++++++++++++++++++++++++
include/linux/node.h | 8 ++++++++
2 files changed, 47 insertions(+)
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 3399594136b2..cf395da18c9b 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -248,6 +248,45 @@ void node_set_perf_attrs(unsigned int nid, struct access_coordinate *coord,
}
EXPORT_SYMBOL_GPL(node_set_perf_attrs);
+/**
+ * node_update_perf_attrs - Update the performance values for given access class
+ * @nid: Node identifier to be updated
+ * @coord: Heterogeneous memory performance coordinates
+ * @access: The access class the for the given attributes
+ */
+void node_update_perf_attrs(unsigned int nid, struct access_coordinate *coord,
+ enum access_coordinate_class access)
+{
+ struct node_access_nodes *access_node;
+ struct node *node;
+ int i;
+
+ if (WARN_ON_ONCE(!node_online(nid)))
+ return;
+
+ node = node_devices[nid];
+ list_for_each_entry(access_node, &node->access_list, list_node) {
+ if (access_node->access != access)
+ continue;
+
+ access_node->coord = *coord;
+ for (i = 0; access_attrs[i]; i++) {
+ sysfs_notify(&access_node->dev.kobj,
+ NULL, access_attrs[i]->name);
+ }
+ break;
+ }
+
+ /* When setting CPU access coordinates, update mempolicy */
+ if (access == ACCESS_COORDINATE_CPU) {
+ if (mempolicy_set_node_perf(nid, coord)) {
+ pr_info("failed to set mempolicy attrs for node %d\n",
+ nid);
+ }
+ }
+}
+EXPORT_SYMBOL_GPL(node_update_perf_attrs);
+
/**
* struct node_cache_info - Internal tracking for memory node caches
* @dev: Device represeting the cache level
diff --git a/include/linux/node.h b/include/linux/node.h
index 2c7529335b21..866e3323f1fd 100644
--- a/include/linux/node.h
+++ b/include/linux/node.h
@@ -85,6 +85,8 @@ struct node_cache_attrs {
void node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs);
void node_set_perf_attrs(unsigned int nid, struct access_coordinate *coord,
enum access_coordinate_class access);
+void node_update_perf_attrs(unsigned int nid, struct access_coordinate *coord,
+ enum access_coordinate_class access);
#else
static inline void node_add_cache(unsigned int nid,
struct node_cache_attrs *cache_attrs)
@@ -96,6 +98,12 @@ static inline void node_set_perf_attrs(unsigned int nid,
enum access_coordinate_class access)
{
}
+
+static inline void node_update_perf_attrs(unsigned int nid,
+ struct access_coordinate *coord,
+ enum access_coordinate_class access)
+{
+}
#endif
struct node {
--
2.50.1
On 14.08.25 19:16, Dave Jiang wrote:
> Add helper function node_update_perf_attrs() to allow update of node access
> coordinates computed by an external agent such as CXL. The helper allows
> updating of coordinates after the attribute being created by HMAT.
>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
> ---
> drivers/base/node.c | 39 +++++++++++++++++++++++++++++++++++++++
> include/linux/node.h | 8 ++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/drivers/base/node.c b/drivers/base/node.c
> index 3399594136b2..cf395da18c9b 100644
> --- a/drivers/base/node.c
> +++ b/drivers/base/node.c
> @@ -248,6 +248,45 @@ void node_set_perf_attrs(unsigned int nid, struct access_coordinate *coord,
> }
> EXPORT_SYMBOL_GPL(node_set_perf_attrs);
>
> +/**
> + * node_update_perf_attrs - Update the performance values for given access class
> + * @nid: Node identifier to be updated
> + * @coord: Heterogeneous memory performance coordinates
> + * @access: The access class the for the given attributes
"the for": there is probably something missing
> + */
> +void node_update_perf_attrs(unsigned int nid, struct access_coordinate *coord,
> + enum access_coordinate_class access)
> +{
> + struct node_access_nodes *access_node;
> + struct node *node;
> + int i;
> +
> + if (WARN_ON_ONCE(!node_online(nid)))
> + return;
> +
> + node = node_devices[nid];
> + list_for_each_entry(access_node, &node->access_list, list_node) {
> + if (access_node->access != access)
> + continue;
> +
> + access_node->coord = *coord;
> + for (i = 0; access_attrs[i]; i++) {
> + sysfs_notify(&access_node->dev.kobj,
> + NULL, access_attrs[i]->name);
> + }
> + break;
> + }
> +
> + /* When setting CPU access coordinates, update mempolicy */
> + if (access == ACCESS_COORDINATE_CPU) {
> + if (mempolicy_set_node_perf(nid, coord)) {
> + pr_info("failed to set mempolicy attrs for node %d\n",
> + nid);
> + }
if (access == ACCESS_COORDINATE_CPU &&
mempolicy_set_node_perf(nid, coord))
pr_info("failed to set mempolicy attrs for node %d\n", nid);
or
if (access != ACCESS_COORDINATE_CPU)
return
if (mempolicy_set_node_perf(nid, coord))
pr_info("failed to set mempolicy attrs for node %d\n", nid);
With both things sorted
Acked-by: David Hildenbrand <david@redhat.com>
--
Cheers
David / dhildenb
On 8/18/25 2:49 AM, David Hildenbrand wrote:
> On 14.08.25 19:16, Dave Jiang wrote:
>> Add helper function node_update_perf_attrs() to allow update of node access
>> coordinates computed by an external agent such as CXL. The helper allows
>> updating of coordinates after the attribute being created by HMAT.
>>
>> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
>> ---
>> drivers/base/node.c | 39 +++++++++++++++++++++++++++++++++++++++
>> include/linux/node.h | 8 ++++++++
>> 2 files changed, 47 insertions(+)
>>
>> diff --git a/drivers/base/node.c b/drivers/base/node.c
>> index 3399594136b2..cf395da18c9b 100644
>> --- a/drivers/base/node.c
>> +++ b/drivers/base/node.c
>> @@ -248,6 +248,45 @@ void node_set_perf_attrs(unsigned int nid, struct access_coordinate *coord,
>> }
>> EXPORT_SYMBOL_GPL(node_set_perf_attrs);
>> +/**
>> + * node_update_perf_attrs - Update the performance values for given access class
>> + * @nid: Node identifier to be updated
>> + * @coord: Heterogeneous memory performance coordinates
>> + * @access: The access class the for the given attributes
>
> "the for": there is probably something missing
looks like extra 'the'
>
>> + */
>> +void node_update_perf_attrs(unsigned int nid, struct access_coordinate *coord,
>> + enum access_coordinate_class access)
>> +{
>> + struct node_access_nodes *access_node;
>> + struct node *node;
>> + int i;
>> +
>> + if (WARN_ON_ONCE(!node_online(nid)))
>> + return;
>> +
>> + node = node_devices[nid];
>> + list_for_each_entry(access_node, &node->access_list, list_node) {
>> + if (access_node->access != access)
>> + continue;
>> +
>> + access_node->coord = *coord;
>> + for (i = 0; access_attrs[i]; i++) {
>> + sysfs_notify(&access_node->dev.kobj,
>> + NULL, access_attrs[i]->name);
>> + }
>> + break;
>> + }
>> +
>> + /* When setting CPU access coordinates, update mempolicy */
>> + if (access == ACCESS_COORDINATE_CPU) {
>> + if (mempolicy_set_node_perf(nid, coord)) {
>> + pr_info("failed to set mempolicy attrs for node %d\n",
>> + nid);
>> + }
> if (access == ACCESS_COORDINATE_CPU &&
> mempolicy_set_node_perf(nid, coord))
> pr_info("failed to set mempolicy attrs for node %d\n", nid);
>
> or
>
> if (access != ACCESS_COORDINATE_CPU)
> return
> if (mempolicy_set_node_perf(nid, coord))
> pr_info("failed to set mempolicy attrs for node %d\n", nid);
>
ok
>
> With both things sorted
>
> Acked-by: David Hildenbrand <david@redhat.com>
>
Thanks for the ack
On Thu, 14 Aug 2025 10:16:48 -0700 Dave Jiang <dave.jiang@intel.com> wrote: > Add helper function node_update_perf_attrs() to allow update of node access > coordinates computed by an external agent such as CXL. The helper allows > updating of coordinates after the attribute being created by HMAT. > > Signed-off-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
© 2016 - 2026 Red Hat, Inc.