Skip to contentSkip to conversation

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

PATCH Applied Aaron Tomlin 4 participants 8 messages Mar 25 – Apr 1

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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

Hi Babu, Tony, Reinette,

This series addresses two limitations in the fs/resctrl io_alloc interface:
inconsistent error reporting and the lack of a mechanism for bulk configuration.

The last_cmd_status file is intended to report details about the most recent resctrl filesystem operation, specifically to aid in diagnosing failures. However, when parsing io_alloc_cbm, if a user provides a domain ID that does not exist in the resource, the operation fails with -EINVAL without updating last_cmd_status. This results in inconsistent behaviour where the system call returns an error, but last_cmd_status misleadingly reports "ok", leaving the user unaware that the failure was caused by an invalid domain ID. Patch 1 addresses this by writing an error message to last_cmd_status when the target domain ID cannot be found.

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. Patch 2 introduces 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.

Please let me know your thoughts.

Changes since v5 [1]:
- Corrected the subject line in Patch 1 to accurately reference "io_alloc_cbm" instead of "io_alloc" (Reinette Chatre)

- Refined both commit messages for strict accuracy and conciseness, including correcting the description of last_cmd_status behaviour and removing redundant examples (Reinette Chatre)

- Reordered commit tags in Patch 1 to place the Fixes: tag at the top in accordance with maintainer guidelines (Reinette Chatre)

- Updated the wildcard documentation to include a caveat regarding systems that do not require consecutive bits (Reinette Chatre)

- Initialised parsing variables (dom_id, update_all) at declaration to eliminate uninitialised state flows (Reinette Chatre)

- Added robust validation to immediately reject any configurations trailing a global wildcard (e.g., "*=f;1=f") (Reinette Chatre)

Changes since v4 [2]:
- Split the submission into a two-patch series to separate the fix from the new feature (Reinette Chatre)

- Refactored resctrl_io_alloc_parse_line() to prioritise the dom check before string comparison, preventing potential NULL pointer dereference (Reinette Chatre)

- Restructured commit messages to strictly follow the "Context, Problem, Solution" format (Reinette Chatre)

- Updated the documentation to include the result of the modification (Babu Moger)

- Updated the commit description to avoid implying that '0' is a universal minimum CBM (Reinette Chatre)

Changes since v3 [3]:
- 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 [4]:
- 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 [5]:
- 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/[email protected]/
[2]: https://lore.kernel.org/lkml/[email protected]/
[3]: https://lore.kernel.org/lkml/[email protected]/
[4]: https://lore.kernel.org/lkml/[email protected]/
[5]: https://lore.kernel.org/lkml/[email protected]/

Aaron Tomlin (2):
fs/resctrl: Report invalid domain ID when parsing io_alloc_cbm fs/resctrl: Add "*" shorthand to set io_alloc CBM for all domains

 Documentation/filesystems/resctrl.rst |  8 ++++++++
 fs/resctrl/ctrlmondata.c              | 22 ++++++++++++++++++----
 2 files changed, 26 insertions(+), 4 deletions(-)
Signature · 1 line
2.51.0
#1 lore raw

PATCH v6 1/2 fs/resctrl: Report invalid domain ID when parsing io_alloc_cbm

The last_cmd_status file is intended to report details about the most recent resctrl filesystem operation, specifically to aid in diagnosing failures.

However, when parsing io_alloc_cbm, if a user provides a domain ID that does not exist in the resource, the operation fails with -EINVAL without updating last_cmd_status. This results in inconsistent behaviour where the system call returns an error, but last_cmd_status misleadingly reports "ok", leaving the user unaware that the failure was caused by an invalid domain ID.

Write an error message to last_cmd_status when the target domain ID cannot be found.

Fixes 28fa2cce7a83 ("fs/resctrl: Introduce interface to modify io_alloc capacity bitmasks")
---
 fs/resctrl/ctrlmondata.c | 1 +
 1 file changed, 1 insertion(+)
fs/resctrl/ctrlmondata.c +1 -0
index cc4237c57cbe..2ef53161ce11 100644
@@ -992,6 +992,7 @@ static int resctrl_io_alloc_parse_line(char *line,  struct rdt_resource *r,
 		}
 	}
 
+	rdt_last_cmd_printf("Invalid domain %lu\n", dom_id);
 	return -EINVAL;
 }
 
Signature · 1 line
2.51.0
maintainer Reviewed-by on v6 1/2
#2 lore raw

Re: [PATCH v6 1/2] fs/resctrl: Report invalid domain ID when parsing io_alloc_cbm

Hi Aaron,

Quoted 11 lines · Aaron Tomlin

The last_cmd_status file is intended to report details about the most recent resctrl filesystem operation, specifically to aid in diagnosing failures.

However, when parsing io_alloc_cbm, if a user provides a domain ID that does not exist in the resource, the operation fails with -EINVAL without updating last_cmd_status. This results in inconsistent behaviour where the system call returns an error, but last_cmd_status misleadingly reports "ok", leaving the user unaware that the failure was caused by an invalid domain ID.

Quoted 7 lines

Write an error message to last_cmd_status when the target domain ID cannot be found.

Fixes 28fa2cce7a83 ("fs/resctrl: Introduce interface to modify io_alloc capacity bitmasks")

---

Thank you.

Reinette

merge bot Applied
#3 lore raw

[tip: x86/cache] fs/resctrl: Report invalid domain ID when parsing io_alloc_cbm

In reply to Aaron Tomlin
The following commit has been merged into the x86/cache branch of tip:

The following commit has been merged into the x86/cache branch of tip:

Commit-ID:     d06b8e7c97c3290e61006e30b32beb9e715fab82
Gitweb:        https://git.kernel.org/tip/d06b8e7c97c3290e61006e30b32beb9e715fab82
Author:        Aaron Tomlin <[email protected]>
AuthorDate:    Tue, 24 Mar 2026 20:11:58 -04:00
Committer:     Borislav Petkov (AMD) <[email protected]>
CommitterDate: Thu, 02 Apr 2026 00:11:35 +02:00

fs/resctrl: Report invalid domain ID when parsing io_alloc_cbm

The last_cmd_status file is intended to report details about the most recent resctrl filesystem operation, specifically to aid in diagnosing failures.

However, when parsing io_alloc_cbm, if a user provides a domain ID that does not exist in the resource, the operation fails with -EINVAL without updating last_cmd_status. This results in inconsistent behaviour where the system call returns an error, but last_cmd_status misleadingly reports "ok", leaving the user unaware that the failure was caused by an invalid domain ID.

Write an error message to last_cmd_status when the target domain ID cannot be found.

---
 fs/resctrl/ctrlmondata.c | 1 +
 1 file changed, 1 insertion(+)
fs/resctrl/ctrlmondata.c +1 -0
index cc4237c..2ef5316 100644
@@ -992,6 +992,7 @@ next:
 		}
 	}
 
+	rdt_last_cmd_printf("Invalid domain %lu\n", dom_id);
 	return -EINVAL;
 }
 
#4 lore raw

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

In reply to Aaron Tomlin

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.

---
 Documentation/filesystems/resctrl.rst |  8 ++++++++
 fs/resctrl/ctrlmondata.c              | 21 +++++++++++++++++----
 2 files changed, 25 insertions(+), 4 deletions(-)
Documentation/filesystems/resctrl.rst +8 -0
index ba609f8d4de5..b003bed339fd 100644
@@ -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
fs/resctrl/ctrlmondata.c +17 -4
index 2ef53161ce11..9a7dfc48cb2e 100644
@@ -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]));
 			}
-			goto next;
+			if (!update_all)
+				goto next;
 		}
 	}
 
+	if (update_all)
+		goto next;
+
 	rdt_last_cmd_printf("Invalid domain %lu\n", dom_id);
 	return -EINVAL;
 }
Signature · 1 line
2.51.0
maintainer Reviewed-by on v6 2/2
#5 lore raw

Hi Aaron,

Quoted 11 lines · Aaron Tomlin

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.

---

Thank you.

Reinette

merge bot Applied
#6 lore raw
In reply to Aaron Tomlin
The following commit has been merged into the x86/cache branch of tip:

The following commit has been merged into the x86/cache branch of tip:

Commit-ID:     d2bf45d067c728b0fe6e8f99a7386b8291e391e3
Gitweb:        https://git.kernel.org/tip/d2bf45d067c728b0fe6e8f99a7386b8291e391e3
Author:        Aaron Tomlin <[email protected]>
AuthorDate:    Tue, 24 Mar 2026 20:11:59 -04:00
Committer:     Borislav Petkov (AMD) <[email protected]>
CommitterDate: Thu, 02 Apr 2026 00:22:59 +02:00

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.

---
 Documentation/filesystems/resctrl.rst |  8 ++++++++
 fs/resctrl/ctrlmondata.c              | 21 +++++++++++++++++----
 2 files changed, 25 insertions(+), 4 deletions(-)
Documentation/filesystems/resctrl.rst +8 -0
index ba609f8..b003bed 100644
@@ -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
fs/resctrl/ctrlmondata.c +17 -4
index 2ef5316..9a7dfc4 100644
@@ -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;
 }
Tested-by Babu Moger Reviewed-by Babu Moger on the v6 series
#7 lore raw
In reply to Aaron Tomlin

Looks good to me.

Quoted 24 lines · Aaron Tomlin

Hi Babu, Tony, Reinette,

This series addresses two limitations in the fs/resctrl io_alloc interface:
inconsistent error reporting and the lack of a mechanism for bulk configuration.

The last_cmd_status file is intended to report details about the most recent resctrl filesystem operation, specifically to aid in diagnosing failures. However, when parsing io_alloc_cbm, if a user provides a domain ID that does not exist in the resource, the operation fails with -EINVAL without updating last_cmd_status. This results in inconsistent behaviour where the system call returns an error, but last_cmd_status misleadingly reports "ok", leaving the user unaware that the failure was caused by an invalid domain ID. Patch 1 addresses this by writing an error message to last_cmd_status when the target domain ID cannot be found.

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. Patch 2 introduces 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.

Quoted 1 line

Please let me know your thoughts.