[PATCH v2 3/3] x86/resctrl: Keep mbm_assign_mode in default mode at boot

From: Babu Moger

Date: Fri Sep 04 2026 - 14:08:09 EST


ABMC ("mbm_event" mode) allows explicit assignment of hardware MBM counters
to RMID/event pairs. It is intended for deployments that need to manage
counter assignment on platforms where the number of monitoring groups
exceeds the available hardware counters. Because hardware MBM counters are
scarce, mbm_event mode is best suited for snapshot-and-rotation workflows
that monitor a subset of groups at a time.

Commit 0f1576e43adc ("x86/resctrl: Configure mbm_event mode if supported")
enabled ABMC automatically during initialization. This causes problems on
systems with limited MBM counters and breaks existing userspace that
assumes the historical default mode, including the pqos tool from
intel-cmt-cat [1].

For example, pqos mounts resctrl and creates 16 or more monitoring groups,
using two counters per group (mbm_local_bytes and mbm_total_bytes). On
platforms that provide 32 MBM counters per domain, this consumes the entire
counter pool. Additional groups cannot be assigned counters and pqos
reports zero bandwidth for them.

Leave mbm_assign_mode in "default" mode during initialization. Default mode
can support more monitoring groups (up to 64) than mbm_event mode, which is
typically limited to 16 groups because of hardware counter availability.
Common deployments with a modest number of monitoring groups continue to
receive accurate bandwidth measurements.

Users that require ABMC functionality can enable it explicitly:

echo mbm_event > /sys/fs/resctrl/info/L3_MON/mbm_assign_mode

Note that default mode has a long-standing limitation when the number of
monitoring groups exceeds the available counter pool. After hardware
counter reallocation, reads may return "Unavailable" or misleading values.
Users that need stable measurements across a large number of monitoring
groups should use mbm_event mode and rotate assignments as needed.

Update Documentation/filesystems/resctrl.rst to reflect the default boot
behavior, document the limitations of default mode, and adjust
mbm_assign_mode examples accordingly.

Signed-off-by: Babu Moger <babu.moger@xxxxxxx>
Link: https://github.com/intel/intel-cmt-cat/issues/311 # [1]
---
v2:
Added documentation describing the known issue with the default mode.
Will add cc to stable once we have all the things in order.
Let me know if I missed anything.

v1:
https://lore.kernel.org/lkml/8cb66e18e32e4087a9712c1e68ee6da614efe244.1784322818.git.babu.moger@xxxxxxx/
---
Documentation/filesystems/resctrl.rst | 79 +++++++++++++++++----------
arch/x86/kernel/cpu/resctrl/monitor.c | 1 -
2 files changed, 49 insertions(+), 31 deletions(-)

diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst
index 79feeb1dc296..a43ed3c89a93 100644
--- a/Documentation/filesystems/resctrl.rst
+++ b/Documentation/filesystems/resctrl.rst
@@ -355,8 +355,8 @@ with the following files:
::

# cat /sys/fs/resctrl/info/L3_MON/mbm_assign_mode
- [mbm_event]
- default
+ [default]
+ mbm_event

"mbm_event":

@@ -377,20 +377,30 @@ with the following files:
will return 'Unassigned' when read until the user assigns one using
"mbm_L3_assignments".

- The mode is beneficial for AMD platforms that support more CTRL_MON
- and MON groups than available hardware counters. By default, this
- feature is enabled on AMD platforms with the ABMC (Assignable Bandwidth
- Monitoring Counters) capability, ensuring counters remain assigned even
- when the corresponding RMID is not actively used by any processor.
+ The mode is beneficial for AMD platforms that support more CTRL_MON and MON
+ groups than available hardware counters. The mbm_event mode ensures counters
+ remain assigned even when the corresponding RMID is not actively monitored.

"default":

In default mode, resctrl assumes there is a hardware counter for each
- event within every CTRL_MON and MON group. On AMD platforms, it is
- recommended to use the mbm_event mode, if supported, to prevent reset of MBM
- events between reads resulting from hardware re-allocating counters. This can
- result in misleading values or display "Unavailable" if no counter is assigned
- to the event.
+ event within every CTRL_MON and MON group. This mode is enabled by default.
+
+ Default mode has a long-standing limitation on AMD platforms that support
+ more CTRL_MON and MON groups than hardware counters. Hardware dynamically
+ shares a smaller pool of counters among RMIDs. The size of that pool is
+ not enumerated to software (unlike "num_mbm_cntrs" in mbm_event mode), and
+ "num_rmids" may be much larger. On current AMD platforms this pool can
+ provide more counters than mbm_event mode (for example 64, versus 32 ABMC
+ counters), so more groups can be monitored accurately than with mbm_event.
+ Typical usage with fewer groups keeps a counter attached and readings
+ remain accurate. Creating more groups than that pool (for example 64 or
+ more) can cause hardware to re-allocate counters
+ between reads. Bandwidth values may then be misleading, or reads may return
+ "Unavailable" if no counter is allocated to the event. There is no
+ user-visible indication when this begins. Users who need stable readings
+ for many groups should switch to mbm_event mode, if supported, and assign
+ counters to the groups of interest (rotating assignments as needed).

* To enable "mbm_event" counter assignment mode:
::
@@ -474,8 +484,8 @@ with the following files:

Determines if a counter will automatically be assigned to an RMID, MBM event
pair when its associated monitor group is created via mkdir. Enabled by default
- on boot, also when switched from "default" mode to "mbm_event" counter assignment
- mode. Users can disable this capability by writing to the interface.
+ when switched to "mbm_event" counter assignment mode. Users can disable this
+ capability by writing to the interface.

"0":
Auto assignment is disabled.
@@ -1791,32 +1801,41 @@ a. Check if MBM counter assignment mode is supported.

# mount -t resctrl resctrl /sys/fs/resctrl/

+ # cat /sys/fs/resctrl/info/L3_MON/mbm_assign_mode
+ [default]
+ mbm_event
+
+The "mbm_event" and "default" modes are supported. The "default" mode
+is enabled by default.
+
+b. Enable "mbm_event" counter assignment mode.
+::
+
+ # echo "mbm_event" > /sys/fs/resctrl/info/L3_MON/mbm_assign_mode
# cat /sys/fs/resctrl/info/L3_MON/mbm_assign_mode
[mbm_event]
default

-The "mbm_event" mode is detected and enabled.
-
-b. Check how many assignable counters are supported.
+c. Check how many assignable counters are supported.
::

# cat /sys/fs/resctrl/info/L3_MON/num_mbm_cntrs
0=32;1=32

-c. Check how many assignable counters are available for assignment in each domain.
+d. Check how many assignable counters are available for assignment in each domain.
::

# cat /sys/fs/resctrl/info/L3_MON/available_mbm_cntrs
0=30;1=30

-d. To list the default group's assign states.
+e. To list the default group's assign states.
::

# cat /sys/fs/resctrl/mbm_L3_assignments
mbm_total_bytes:0=e;1=e
mbm_local_bytes:0=e;1=e

-e. To unassign the counter associated with the mbm_total_bytes event on domain 0.
+f. To unassign the counter associated with the mbm_total_bytes event on domain 0.
::

# echo "mbm_total_bytes:0=_" > /sys/fs/resctrl/mbm_L3_assignments
@@ -1824,7 +1843,7 @@ e. To unassign the counter associated with the mbm_total_bytes event on domain
mbm_total_bytes:0=_;1=e
mbm_local_bytes:0=e;1=e

-f. To unassign the counter associated with the mbm_total_bytes event on all domains.
+g. To unassign the counter associated with the mbm_total_bytes event on all domains.
::

# echo "mbm_total_bytes:*=_" > /sys/fs/resctrl/mbm_L3_assignments
@@ -1832,7 +1851,7 @@ f. To unassign the counter associated with the mbm_total_bytes event on all doma
mbm_total_bytes:0=_;1=_
mbm_local_bytes:0=e;1=e

-g. To assign a counter associated with the mbm_total_bytes event on all domains in
+h. To assign a counter associated with the mbm_total_bytes event on all domains in
exclusive mode.
::

@@ -1841,7 +1860,7 @@ exclusive mode.
mbm_total_bytes:0=e;1=e
mbm_local_bytes:0=e;1=e

-h. Read the events mbm_total_bytes and mbm_local_bytes of the default group. There is
+i. Read the events mbm_total_bytes and mbm_local_bytes of the default group. There is
no change in reading the events with the assignment.
::

@@ -1854,7 +1873,7 @@ no change in reading the events with the assignment.
# cat /sys/fs/resctrl/mon_data/mon_L3_01/mbm_local_bytes
121212144

-i. Check the event configurations.
+j. Check the event configurations.
::

# cat /sys/fs/resctrl/info/L3_MON/event_configs/mbm_total_bytes/event_filter
@@ -1864,7 +1883,7 @@ i. Check the event configurations.
# cat /sys/fs/resctrl/info/L3_MON/event_configs/mbm_local_bytes/event_filter
local_reads,local_non_temporal_writes,local_reads_slow_memory

-j. Change the event configuration for mbm_local_bytes.
+k. Change the event configuration for mbm_local_bytes.
::

# echo "local_reads, local_non_temporal_writes, local_reads_slow_memory, remote_reads" >
@@ -1873,7 +1892,7 @@ j. Change the event configuration for mbm_local_bytes.
# cat /sys/fs/resctrl/info/L3_MON/event_configs/mbm_local_bytes/event_filter
local_reads,local_non_temporal_writes,local_reads_slow_memory,remote_reads

-k. Now read the local events again. The first read may come back with "Unavailable"
+l. Now read the local events again. The first read may come back with "Unavailable"
status. The subsequent read of mbm_local_bytes will display the current value.
::

@@ -1886,9 +1905,9 @@ status. The subsequent read of mbm_local_bytes will display the current value.
# cat /sys/fs/resctrl/mon_data/mon_L3_01/mbm_local_bytes
1566565

-l. Users have the option to go back to 'default' mbm_assign_mode if required. This can be
-done using the following command. Note that switching the mbm_assign_mode may reset all
-the MBM counters (and thus all MBM events) of all the resctrl groups.
+m. Users have the option to switch back to 'default' mbm_assign_mode if required. This
+can be done using the following command. Note that switching the mbm_assign_mode may
+reset all the MBM counters (and thus all MBM events) of all the resctrl groups.
::

# echo "default" > /sys/fs/resctrl/info/L3_MON/mbm_assign_mode
@@ -1896,7 +1915,7 @@ the MBM counters (and thus all MBM events) of all the resctrl groups.
mbm_event
[default]

-m. Unmount the resctrl filesystem.
+n. Unmount the resctrl filesystem.
::

# umount /sys/fs/resctrl/
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
index 3838e0a13d36..8a0d6086518b 100644
--- a/arch/x86/kernel/cpu/resctrl/monitor.c
+++ b/arch/x86/kernel/cpu/resctrl/monitor.c
@@ -471,7 +471,6 @@ int __init rdt_get_l3_mon_config(struct rdt_resource *r)
r->mon.mbm_cntr_configurable = true;
cpuid_count(0x80000020, 5, &eax, &ebx, &ecx, &edx);
r->mon.num_mbm_cntrs = (ebx & GENMASK(15, 0)) + 1;
- hw_res->mbm_cntr_assign_enabled = true;
}

r->mon_capable = true;
--
2.43.0