* [v4 PATCH 0/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains @ 2026-01-25 17:17 Aaron Tomlin 2026-01-25 17:17 ` [v4 PATCH 1/1] " Aaron Tomlin 0 siblings, 1 reply; 6+ messages in thread From: Aaron Tomlin @ 2026-01-25 17:17 UTC (permalink / raw) To: tony.luck, reinette.chatre, Dave.Martin, james.morse, babu.moger, tglx, mingo, bp, dave.hansen Cc: dave.martin, sean, neelx, mproche, chjohnst, linux-kernel Hi Babu, Tony, Reinette, This patch introduces a wildcard domain ID selector "*" for the io_alloc_cbm interface. It allows a user to update the Capacity Bitmask (CBM) across all cache domains in a single operation. Currently, configuring io_alloc_cbm requires an explicit ID for each domain, which is cumbersome on systems with high core counts and numerous cache clusters. Supporting a wildcard selector simplifies automation and management tasks. For example, a user can now write "*=0" to the io_alloc_cbm file to program every domain to the hardware-defined minimum CBM. Note that the value provided must still adhere to the constraints defined in the resource's min_cbm_bits. Please let me know your thoughts. Changes since v3 [1]: - Updated the wildcard documentation text to be clearer and less prescriptive (Reinette Chatre) - Reverted the while loop refactoring in resctrl_io_alloc_parse_line() to restore the standard parsing pattern and prevent invalid domain ID regressions (Reinette Chatre) - Added explicit validation to ensure the wildcard selector is followed by a value assignment (Reinette Chatre) - Restored memcpy() usage for configuration copying to minimise unrelated diff noise Changes since v2 [2]: - Dropped return -EINVAL for a missing seq_show implementation (Reinette Chatre) - Dropped helpers to check io_alloc support and enabled state (Reinette Chatre) - Removed additional complexity (Babu Moger) - Introduced the "*" wildcard for io_alloc_cbm to allow updating all cache domains (Reinette Chatre) - Replaced goto-based line parsing with a while loop to support multi-domain and wildcard iterations - Replaced memcpy() with direct structure assignment Changes since v1 [3]: - Updated each helper for consistency (Babu Moger) - Refactored the loop logic in function resctrl_io_alloc_parse_line() to improve readability - Added inline keyword to each helper - Added inline keyword to function parse_domain_cbm() [1]: https://lore.kernel.org/lkml/20251231023549.2390630-1-atomlin@atomlin.com/ [2]: https://lore.kernel.org/lkml/20251215230257.1798865-1-atomlin@atomlin.com/ [3]: https://lore.kernel.org/lkml/20251126171653.1004321-1-atomlin@atomlin.com/ Aaron Tomlin (1): x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains Documentation/filesystems/resctrl.rst | 8 ++++++++ fs/resctrl/ctrlmondata.c | 20 +++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) -- 2.51.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [v4 PATCH 1/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains 2026-01-25 17:17 [v4 PATCH 0/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains Aaron Tomlin @ 2026-01-25 17:17 ` Aaron Tomlin 2026-02-02 20:18 ` Babu Moger 2026-02-03 4:26 ` Reinette Chatre 0 siblings, 2 replies; 6+ messages in thread From: Aaron Tomlin @ 2026-01-25 17:17 UTC (permalink / raw) To: tony.luck, reinette.chatre, Dave.Martin, james.morse, babu.moger, tglx, mingo, bp, dave.hansen Cc: dave.martin, sean, neelx, mproche, chjohnst, linux-kernel Introduce a wildcard domain ID selector "*" for the io_alloc_cbm interface. This allows a user to update the Capacity Bitmask (CBM) across all cache domains in a single operation. Currently, configuring io_alloc_cbm requires an explicit ID for each domain, which is cumbersome on systems with high core counts and numerous cache clusters. Supporting a wildcard selector simplifies automation and management tasks. For example, a user can now write "*=0" to the io_alloc_cbm file to program every domain to the hardware-defined minimum CBM. Note that the value provided must still adhere to the constraints defined in the resource's min_cbm_bits. Signed-off-by: Aaron Tomlin <atomlin@atomlin.com> --- Documentation/filesystems/resctrl.rst | 8 ++++++++ fs/resctrl/ctrlmondata.c | 20 +++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst index 8c8ce678148a..734aba0d19fd 100644 --- a/Documentation/filesystems/resctrl.rst +++ b/Documentation/filesystems/resctrl.rst @@ -215,6 +215,14 @@ related to allocation: # cat /sys/fs/resctrl/info/L3/io_alloc_cbm 0=00ff;1=000f + Set each CBM to a specified value. + + An ID of "*" configures all domains with the provided CBM. + + Example:: + + # echo "*=0" > /sys/fs/resctrl/info/L3/io_alloc_cbm + 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 diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c index b2d178d3556e..f5fb74a7668a 100644 --- a/fs/resctrl/ctrlmondata.c +++ b/fs/resctrl/ctrlmondata.c @@ -873,21 +873,31 @@ static int resctrl_io_alloc_parse_line(char *line, struct rdt_resource *r, struct rdt_ctrl_domain *d; char *dom = NULL, *id; unsigned long dom_id; + bool update_all; next: if (!line || line[0] == '\0') return 0; + update_all = false; dom = strsep(&line, ";"); id = strsep(&dom, "="); - if (!dom || kstrtoul(id, 10, &dom_id)) { + + if (id && !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); + if (update_all && !dom) { + rdt_last_cmd_puts("Missing '=' after '*'\n"); + return -EINVAL; + } + 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; @@ -903,10 +913,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])); } - goto next; + if (!update_all) + goto next; } } + if (update_all) + goto next; + return -EINVAL; } -- 2.51.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v4 PATCH 1/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains 2026-01-25 17:17 ` [v4 PATCH 1/1] " Aaron Tomlin @ 2026-02-02 20:18 ` Babu Moger 2026-02-03 4:26 ` Reinette Chatre 1 sibling, 0 replies; 6+ messages in thread From: Babu Moger @ 2026-02-02 20:18 UTC (permalink / raw) To: Aaron Tomlin, tony.luck, reinette.chatre, Dave.Martin, james.morse, babu.moger, tglx, mingo, bp, dave.hansen Cc: sean, neelx, mproche, chjohnst, linux-kernel Hi Aaron, On 1/25/26 11:17, Aaron Tomlin wrote: > Introduce a wildcard domain ID selector "*" for the io_alloc_cbm > interface. This allows a user to update the Capacity Bitmask (CBM) > across all cache domains in a single operation. > > Currently, configuring io_alloc_cbm requires an explicit ID for each > domain, which is cumbersome on systems with high core counts and > numerous cache clusters. Supporting a wildcard selector simplifies > automation and management tasks. > > For example, a user can now write "*=0" to the io_alloc_cbm file to > program every domain to the hardware-defined minimum CBM. Note that the > value provided must still adhere to the constraints defined in the > resource's min_cbm_bits. > > Signed-off-by: Aaron Tomlin <atomlin@atomlin.com> > --- > Documentation/filesystems/resctrl.rst | 8 ++++++++ > fs/resctrl/ctrlmondata.c | 20 +++++++++++++++++--- > 2 files changed, 25 insertions(+), 3 deletions(-) > > diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst > index 8c8ce678148a..734aba0d19fd 100644 > --- a/Documentation/filesystems/resctrl.rst > +++ b/Documentation/filesystems/resctrl.rst > @@ -215,6 +215,14 @@ related to allocation: > # cat /sys/fs/resctrl/info/L3/io_alloc_cbm > 0=00ff;1=000f > > + Set each CBM to a specified value. > + > + An ID of "*" configures all domains with the provided CBM. > + > + Example:: > + > + # echo "*=0" > /sys/fs/resctrl/info/L3/io_alloc_cbm > + You missed adding # cat /sys/fs/resctrl/info/L3/io_alloc_cbm 0=0;1=0 Thanks Babu > 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 > diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c > index b2d178d3556e..f5fb74a7668a 100644 > --- a/fs/resctrl/ctrlmondata.c > +++ b/fs/resctrl/ctrlmondata.c > @@ -873,21 +873,31 @@ static int resctrl_io_alloc_parse_line(char *line, struct rdt_resource *r, > struct rdt_ctrl_domain *d; > char *dom = NULL, *id; > unsigned long dom_id; > + bool update_all; > > next: > if (!line || line[0] == '\0') > return 0; > > + update_all = false; > dom = strsep(&line, ";"); > id = strsep(&dom, "="); > - if (!dom || kstrtoul(id, 10, &dom_id)) { > + > + if (id && !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); > + if (update_all && !dom) { > + rdt_last_cmd_puts("Missing '=' after '*'\n"); > + return -EINVAL; > + } > + > 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; > @@ -903,10 +913,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])); > } > - goto next; > + if (!update_all) > + goto next; > } > } > > + if (update_all) > + goto next; > + > return -EINVAL; > } > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v4 PATCH 1/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains 2026-01-25 17:17 ` [v4 PATCH 1/1] " Aaron Tomlin 2026-02-02 20:18 ` Babu Moger @ 2026-02-03 4:26 ` Reinette Chatre 2026-02-03 4:28 ` Reinette Chatre 2026-02-07 23:28 ` Aaron Tomlin 1 sibling, 2 replies; 6+ messages in thread From: Reinette Chatre @ 2026-02-03 4:26 UTC (permalink / raw) To: Aaron Tomlin, tony.luck, Dave.Martin, james.morse, babu.moger, tglx, mingo, bp, dave.hansen Cc: sean, neelx, mproche, chjohnst, linux-kernel Hi Aaron, No need to add a cover letter when there is just one patch. From what I can tell the cover letter contains duplicate text so can just be dropped in the next version. Although, there may possibly be two patches in next version (more later). For the subject, please follow the custom to have the "PATCH" text be the prefix. Specifically "[PATCH vX]". For reference, see "Subject Line" in Documentation/process/submitting-patches.rst. On 1/25/26 9:17 AM, Aaron Tomlin wrote: > Introduce a wildcard domain ID selector "*" for the io_alloc_cbm > interface. This allows a user to update the Capacity Bitmask (CBM) > across all cache domains in a single operation. The changelog jumps in with what the patch does before providing any context (which can be found in paragraph below). Please follow the "context, problem, solution" structure as detailed in section "Changelog" found in Documentation/process/maintainer-tip.rst > > Currently, configuring io_alloc_cbm requires an explicit ID for each > domain, which is cumbersome on systems with high core counts and > numerous cache clusters. Supporting a wildcard selector simplifies > automation and management tasks. > > For example, a user can now write "*=0" to the io_alloc_cbm file to > program every domain to the hardware-defined minimum CBM. Note that the (nit: not all hardware has 0 as minimum CBM). > value provided must still adhere to the constraints defined in the > resource's min_cbm_bits. > > Signed-off-by: Aaron Tomlin <atomlin@atomlin.com> > --- > Documentation/filesystems/resctrl.rst | 8 ++++++++ > fs/resctrl/ctrlmondata.c | 20 +++++++++++++++++--- > 2 files changed, 25 insertions(+), 3 deletions(-) > > diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst > index 8c8ce678148a..734aba0d19fd 100644 > --- a/Documentation/filesystems/resctrl.rst > +++ b/Documentation/filesystems/resctrl.rst > @@ -215,6 +215,14 @@ related to allocation: > # cat /sys/fs/resctrl/info/L3/io_alloc_cbm > 0=00ff;1=000f > > + Set each CBM to a specified value. > + > + An ID of "*" configures all domains with the provided CBM. > + > + Example:: > + > + # echo "*=0" > /sys/fs/resctrl/info/L3/io_alloc_cbm > + > 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 > diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c > index b2d178d3556e..f5fb74a7668a 100644 > --- a/fs/resctrl/ctrlmondata.c > +++ b/fs/resctrl/ctrlmondata.c > @@ -873,21 +873,31 @@ static int resctrl_io_alloc_parse_line(char *line, struct rdt_resource *r, > struct rdt_ctrl_domain *d; > char *dom = NULL, *id; > unsigned long dom_id; > + bool update_all; > > next: > if (!line || line[0] == '\0') > return 0; > > + update_all = false; > dom = strsep(&line, ";"); > id = strsep(&dom, "="); > - if (!dom || kstrtoul(id, 10, &dom_id)) { > + > + if (id && !strcmp(id, "*")) { > + update_all = true; Since this cannot be reached if line is NULL, can id ever be NULL here? > + } else if (!dom || kstrtoul(id, 10, &dom_id)) { > rdt_last_cmd_puts("Missing '=' or non-numeric domain\n"); > return -EINVAL; > } > > dom = strim(dom); > + if (update_all && !dom) { Have you tried just writing '*' to this file as suggested in v3? Please do include doing so in your tests. The NULL check should be _before_ any access to dom. I think this can be done earlier though. How about something like below? if (dom && !strcmp(id, "*")) { ... } else if (!dom || kstrtoul(id, 10, &dom_id)) { ... } > + rdt_last_cmd_puts("Missing '=' after '*'\n"); > + return -EINVAL; > + } > + > 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; > @@ -903,10 +913,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])); > } > - goto next; > + if (!update_all) > + goto next; > } > } > > + if (update_all) > + goto next; I see that this aims to support input like "*=f;*=0" but I do not see how something like this can ever succeed since parse_cbm() stages the config and should fail if any domain already has a config. Should this perhaps just return success here? This could be made more robust by only returning success if there is no more text to parse, thus failing on input like "*=f;1=f". > + > return -EINVAL; I just noticed that this is one spot where the user interface may be confusing. The intent here is to return an error if the user provided an invalid domain ID. While this interface returns an error the last_cmd_status file is not updated. What a user would see is thus that writing to io_alloc_cmd fails but last_cmd_status returns "ok". This is a problem with existing implementation. Would you like to include a fix for this as part of this work? I think just something like rdt_last_cmd_printf("Invalid domain %d\n", dom_id); before the "return -EINVAL" should be sufficient. This needs to be a separate patch though with a: Fixes: 28fa2cce7a83 ("fs/resctrl: Introduce interface to modify io_alloc capacity bitmasks") Reinette ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v4 PATCH 1/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains 2026-02-03 4:26 ` Reinette Chatre @ 2026-02-03 4:28 ` Reinette Chatre 2026-02-07 23:28 ` Aaron Tomlin 1 sibling, 0 replies; 6+ messages in thread From: Reinette Chatre @ 2026-02-03 4:28 UTC (permalink / raw) To: Aaron Tomlin, tony.luck, Dave.Martin, james.morse, babu.moger, tglx, mingo, bp, dave.hansen Cc: sean, neelx, mproche, chjohnst, linux-kernel Hi Aaron, On 2/2/26 8:26 PM, Reinette Chatre wrote: > Hi Aaron, > > No need to add a cover letter when there is just one patch. From what > I can tell the cover letter contains duplicate text so can just be > dropped in the next version. Although, there may possibly be two patches > in next version (more later). > > For the subject, please follow the custom to have the "PATCH" text > be the prefix. Specifically "[PATCH vX]". For reference, see > "Subject Line" in Documentation/process/submitting-patches.rst. One addendum here, please update the subject prefix to "fs/resctrl:" to match the area of code modified. Reinette ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v4 PATCH 1/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains 2026-02-03 4:26 ` Reinette Chatre 2026-02-03 4:28 ` Reinette Chatre @ 2026-02-07 23:28 ` Aaron Tomlin 1 sibling, 0 replies; 6+ messages in thread From: Aaron Tomlin @ 2026-02-07 23:28 UTC (permalink / raw) To: Reinette Chatre Cc: tony.luck, Dave.Martin, james.morse, babu.moger, tglx, mingo, bp, dave.hansen, sean, neelx, mproche, chjohnst, linux-kernel [-- Attachment #1: Type: text/plain, Size: 3695 bytes --] On Mon, Feb 02, 2026 at 08:26:27PM -0800, Reinette Chatre wrote: > For the subject, please follow the custom to have the "PATCH" text > be the prefix. Specifically "[PATCH vX]". For reference, see > "Subject Line" in Documentation/process/submitting-patches.rst. Hi Reinette, Thank you for the detailed review. I will incorporate all the stylistic feedback (Subject prefix, Changelog structure, and dropping the cover letter) in v5. > > Currently, configuring io_alloc_cbm requires an explicit ID for each > > domain, which is cumbersome on systems with high core counts and > > numerous cache clusters. Supporting a wildcard selector simplifies > > automation and management tasks. > > > > For example, a user can now write "*=0" to the io_alloc_cbm file to > > program every domain to the hardware-defined minimum CBM. Note that the > > (nit: not all hardware has 0 as minimum CBM). I understand. I shall update the text to ensure the distinction regarding the hardware-defined minimum is precise. > Since this cannot be reached if line is NULL, can id ever be NULL here? > > > + } else if (!dom || kstrtoul(id, 10, &dom_id)) { > > rdt_last_cmd_puts("Missing '=' or non-numeric domain\n"); > > return -EINVAL; > > } > > > > dom = strim(dom); > > + if (update_all && !dom) { > > Have you tried just writing '*' to this file as suggested in v3? Please do > include doing so in your tests. > > The NULL check should be _before_ any access to dom. I think this can be done > earlier though. How about something like below? > > + goto next; > > } > > } > > > > + if (update_all) > > + goto next; > > I see that this aims to support input like "*=f;*=0" but I do not see how > something like this can ever succeed since parse_cbm() stages the config > and should fail if any domain already has a config. Should this perhaps > just return success here? This could be made more robust by only > returning success if there is no more text to parse, thus failing on > input like "*=f;1=f". > > > + > > return -EINVAL; Agreed. I will refactor the parsing logic to prioritise the check for dom before performing the string comparison, as you suggested. This yields a significantly cleaner flow and mitigates potential dereference issues. I will ensure that edge cases, including the standalone * (which should correctly trigger the "Missing '='" error), are explicitly covered in my testing before submission. > I just noticed that this is one spot where the user interface may be > confusing. The intent here is to return an error if the user provided an > invalid domain ID. While this interface returns an error the > last_cmd_status file is not updated. What a user would see is thus that > writing to io_alloc_cmd fails but last_cmd_status returns "ok". This is a > problem with existing implementation. Would you like to include a fix for > this as part of this work? I think just something like > rdt_last_cmd_printf("Invalid domain %d\n", dom_id); before the "return > -EINVAL" should be sufficient. This needs to be a separate patch though > with a: Fixes: 28fa2cce7a83 ("fs/resctrl: Introduce interface to modify > io_alloc capacity bitmasks") This is a valid concern. To address this properly, I intend to split the next submission into a two-patch series: 1. A fix for the existing last_cmd_status behaviour (reporting "ok" despite failure) when an invalid domain is provided. 2. The introduction of the wildcard "*" support. This approach ensures the fix is cleanly separated from the new feature logic. Kind regards, -- Aaron Tomlin [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-02-07 23:28 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-01-25 17:17 [v4 PATCH 0/1] x86/resctrl: Add "*" shorthand to set io_alloc CBM for all domains Aaron Tomlin 2026-01-25 17:17 ` [v4 PATCH 1/1] " Aaron Tomlin 2026-02-02 20:18 ` Babu Moger 2026-02-03 4:26 ` Reinette Chatre 2026-02-03 4:28 ` Reinette Chatre 2026-02-07 23:28 ` Aaron Tomlin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®