[PATCH v10 01/17] x86/resctrl: Fix enumeration of number of supported RMIDs
From: Tony Luck
Date: Wed Jul 29 2026 - 13:36:47 EST
There is a multi-step decision tree for enumeration on X86 of Intel Resource
Director Technology (RDT) also known as AMD Platform Quality of Service (PQOS)
First check CPUID(0x7,0x0).EBX{12} (Linux feature flag X86_FEATURE_CQM).
If this is "0" no monitoring features are supported. If it is "1" then
monitoring is supported, the IA32_PQR_ASSOC MSR exists, and the RMID field can
be written with values from zero to the value enumerated in CPUID(0xF,0x0).EBX.
Second check CPUID(0xF,0x0).EDX{1} (Linux feature flag X86_FEATURE_CQM_LLC).
If this is "1" then one or more L3 cache monitoring features exist and
further enumeration from CPUID(0xF,0x1) provides information about L3
monitoring features.
Linux skips the check for X86_FEATURE_CQM and begins with step two checking
X86_FEATURE_CQM_LLC.
This is a problem for systems that do not support any L3 monitoring features
(or have disabled them with the kernel boot parameter "clearcpuid=cqm_llc")
but do support other features such as Application Energy Telemetry. On
such a system cpuinfo_x86::x86_cache_max_rmid is incorrectly set to "-1".
Correct the checks to follow guidance from the Intel Software
Developer's manual and AMD Architecture Programmer's Manual.
Fixes: cbc82b172638 ("x86: Add support for Intel Cache QoS Monitoring (CQM) detection")
Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
v10:
New patch so that boot_cpu_data.x86_cache_max_rmid is useful
even on systems that don't have cache monitoring.
Perhaps only worthy of backport to older kernels if taking the
rest of this series.
arch/x86/kernel/cpu/resctrl/core.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
index 9b9495174041..e3544c99cff1 100644
--- a/arch/x86/kernel/cpu/resctrl/core.c
+++ b/arch/x86/kernel/cpu/resctrl/core.c
@@ -1075,20 +1075,17 @@ static enum cpuhp_state rdt_online;
/* Runs once on the BSP during boot. */
void resctrl_cpu_detect(struct cpuinfo_x86 *c)
{
- if (!cpu_has(c, X86_FEATURE_CQM_LLC) && !cpu_has(c, X86_FEATURE_ABMC)) {
+ if (!cpu_has(c, X86_FEATURE_CQM)) {
c->x86_cache_max_rmid = -1;
c->x86_cache_occ_scale = -1;
c->x86_cache_mbm_width_offset = -1;
return;
}
- /* will be overridden if occupancy monitoring exists */
+ /* May be overridden if L3 monitoring exists and supports fewer RMIDs. */
c->x86_cache_max_rmid = cpuid_ebx(0xf);
- if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC) ||
- cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL) ||
- cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL) ||
- cpu_has(c, X86_FEATURE_ABMC)) {
+ if (cpu_has(c, X86_FEATURE_CQM_LLC) || cpu_has(c, X86_FEATURE_ABMC)) {
u32 eax, ebx, ecx, edx;
/* QoS sub-leaf, EAX=0Fh, ECX=1 */
--
2.55.0