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

JIRA: https://redhat.atlassian.net/browse/RHEL-174711

commit d2bf45d067c728b0fe6e8f99a7386b8291e391e3
Author: Aaron Tomlin <atomlin@atomlin.com>
Date:   Tue Mar 24 20:11:59 2026 -0400

    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: Aaron Tomlin <atomlin@atomlin.com>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
    Reviewed-by: Babu Moger <babu.moger@amd.com>
    Tested-by: Babu Moger <babu.moger@amd.com>
    Link: https://patch.msgid.link/20260325001159.447075-3-atomlin@atomlin.com

(cherry picked from commit d2bf45d067c728b0fe6e8f99a7386b8291e391e3)
Assisted-by: Patchpal
Signed-off-by: Steve Best <sbest@redhat.com>
This commit is contained in:
Steve Best
2026-08-24 02:24:13 -04:00
parent 0a69b5abfd
commit 319d168769
2 changed files with 25 additions and 4 deletions
+8
View File
@@ -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
View File
@@ -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 @@ next:
&d->staged_config[s->conf_type],
sizeof(d->staged_config[0]));
}
goto next;
if (!update_all)
goto next;
}
}
if (update_all)
goto next;
rdt_last_cmd_printf("Invalid domain %lu\n", dom_id);
return -EINVAL;
}