Commit d2bf45d0 authored by Aaron Tomlin's avatar Aaron Tomlin Committed by Borislav Petkov (AMD)
Browse files

fs/resctrl: Add "*" shorthand to set io_alloc CBM for all domains



Configuring the io_alloc_cbm interface requires an explicit domain ID for each
cache domain. On systems with high core counts and numerous cache clusters,
this requirement becomes cumbersome for automation and management tasks that
aim to apply a uniform policy.

Introduce a wildcard domain ID selector "*" for the io_alloc_cbm interface.
This enables users to set the same Capacity Bitmask (CBM) across all cache
domains in a single operation.

Signed-off-by: default avatarAaron Tomlin <atomlin@atomlin.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Reviewed-by: default avatarBabu Moger <babu.moger@amd.com>
Tested-by: default avatarBabu Moger <babu.moger@amd.com>
Link: https://patch.msgid.link/20260325001159.447075-3-atomlin@atomlin.com
parent d06b8e7c
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -215,6 +215,14 @@ related to allocation:
			# cat /sys/fs/resctrl/info/L3/io_alloc_cbm
			0=00ff;1=000f

		An ID of "*" configures all domains with the provided CBM.

		Example on a system that does not require a minimum number of consecutive bits in the mask::

			# echo "*=0" > /sys/fs/resctrl/info/L3/io_alloc_cbm
			# cat /sys/fs/resctrl/info/L3/io_alloc_cbm
			0=0;1=0

		When CDP is enabled "io_alloc_cbm" associated with the CDP_DATA and CDP_CODE
		resources may reflect the same values. For example, values read from and
		written to /sys/fs/resctrl/info/L3DATA/io_alloc_cbm may be reflected by
+17 −4
Original line number Diff line number Diff line
@@ -954,25 +954,34 @@ static int resctrl_io_alloc_parse_line(char *line, struct rdt_resource *r,
				       struct resctrl_schema *s, u32 closid)
{
	enum resctrl_conf_type peer_type;
	unsigned long dom_id = ULONG_MAX;
	struct rdt_parse_data data;
	struct rdt_ctrl_domain *d;
	bool update_all = false;
	char *dom = NULL, *id;
	unsigned long dom_id;

next:
	if (!line || line[0] == '\0')
		return 0;

	if (update_all) {
		rdt_last_cmd_puts("Configurations after global '*'\n");
		return -EINVAL;
	}

	dom = strsep(&line, ";");
	id = strsep(&dom, "=");
	if (!dom || kstrtoul(id, 10, &dom_id)) {

	if (dom && !strcmp(id, "*")) {
		update_all = true;
	} else if (!dom || kstrtoul(id, 10, &dom_id)) {
		rdt_last_cmd_puts("Missing '=' or non-numeric domain\n");
		return -EINVAL;
	}

	dom = strim(dom);
	list_for_each_entry(d, &r->ctrl_domains, hdr.list) {
		if (d->hdr.id == dom_id) {
		if (update_all || d->hdr.id == dom_id) {
			data.buf = dom;
			data.mode = RDT_MODE_SHAREABLE;
			data.closid = closid;
@@ -988,10 +997,14 @@ static int resctrl_io_alloc_parse_line(char *line, struct rdt_resource *r,
				       &d->staged_config[s->conf_type],
				       sizeof(d->staged_config[0]));
			}
			if (!update_all)
				goto next;
		}
	}

	if (update_all)
		goto next;

	rdt_last_cmd_printf("Invalid domain %lu\n", dom_id);
	return -EINVAL;
}