Commit b57fc652 authored by Dave Jiang's avatar Dave Jiang
Browse files

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: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarJonathan Cameron <jonathan.cameron@huawei.com>
Link: https://patch.msgid.link/20250829222907.1290912-3-dave.jiang@intel.com


Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
parent 65128868
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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 {