drivers/base/node: Add a helper function node_update_perf_attrs()

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>
This commit is contained in:
Dave Jiang 2025-08-29 15:29:05 -07:00
parent 65128868bb
commit b57fc652ca
2 changed files with 46 additions and 0 deletions

View 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

View 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 {