]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drivers/base/node: Add a helper function node_update_perf_attrs()
authorDave Jiang <dave.jiang@intel.com>
Fri, 29 Aug 2025 22:29:05 +0000 (15:29 -0700)
committerDave Jiang <dave.jiang@intel.com>
Tue, 2 Sep 2025 21:46:47 +0000 (14:46 -0700)
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.

Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Link: https://patch.msgid.link/20250829222907.1290912-3-dave.jiang@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/base/node.c
include/linux/node.h

index 3399594136b2a1e58e95b0d13ee7441dd9e5cb9e..db18a1c326371bded6af49685a304175c91baded 100644 (file)
@@ -248,6 +248,44 @@ 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 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)
+               return;
+
+       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
index 2c7529335b21a238416d5de5b55e5adeb6f41b52..866e3323f1fdc54f265d28c6aad8da3aa4b8aa57 100644 (file)
@@ -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 {