]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/resctrl: Add "*" shorthand to set io_alloc CBM for all domains
authorAaron Tomlin <atomlin@atomlin.com>
Wed, 25 Mar 2026 00:11:59 +0000 (20:11 -0400)
committerBorislav Petkov (AMD) <bp@alien8.de>
Wed, 1 Apr 2026 22:22:59 +0000 (00:22 +0200)
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
Documentation/filesystems/resctrl.rst
fs/resctrl/ctrlmondata.c

index ba609f8d4de57d6edf714d9c5076c1bdf08f384b..b003bed339fddd7e44a5feadf2ad5baa12e076fe 100644 (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
index 2ef53161ce119e903e9bb0d8c69eb1b5b93b6593..9a7dfc48cb2e2972cda8058a5650704b6ac0604e 100644 (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;
 }