[PATCH v13 15/25] x86,fs/resctrl: Handle systems where AET is the only resource
From: Tony Luck
Date: Mon Sep 28 2026 - 18:16:46 EST
Application Energy Telemetry (AET) is not enumerated by CPUID its
presence/absence is discovered at file system mount time by querying the
pmt_telemetry driver. This results in two issues:
1) On a platform with no L3 monitoring features rdt_get_l3_mon_config()
will report that the system does not support any monitoring at all.
Handle this by optimistically assuming that AET may be supported.
2) If this optimism is unfounded, rdt_get_tree() may find that neither
allocation, nor monitoring is supported. In this case it allows the
mount to succeed, but does not set "resctrl_mounted".
Move the feature test earlier and fail the mount with a diagnostic
message to the console.
Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
v13:
Add a pr_info() if no L3 features are enabled on a
"X86_FEATURE_CQM_LLC" system.
Add a comment for the "return true" from get_rdt_mon_resources()
Rewrite commit message with context for the change.
---
arch/x86/kernel/cpu/resctrl/internal.h | 2 +-
arch/x86/kernel/cpu/resctrl/core.c | 22 +++++++++++++---------
arch/x86/kernel/cpu/resctrl/monitor.c | 4 +---
fs/resctrl/rdtgroup.c | 8 ++++++--
4 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
index 086282a82fca..c038b7d80ce3 100644
--- a/arch/x86/kernel/cpu/resctrl/internal.h
+++ b/arch/x86/kernel/cpu/resctrl/internal.h
@@ -226,7 +226,7 @@ union l3_qos_abmc_cfg {
void rdt_ctrl_update(void *arg);
-int rdt_get_l3_mon_config(struct rdt_resource *r);
+void rdt_get_l3_mon_config(struct rdt_resource *r);
bool rdt_cpu_has(int flag);
diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
index b32fa143283e..0262174df7ad 100644
--- a/arch/x86/kernel/cpu/resctrl/core.c
+++ b/arch/x86/kernel/cpu/resctrl/core.c
@@ -991,7 +991,7 @@ static __init bool get_rdt_alloc_resources(void)
static __init bool get_rdt_mon_resources(void)
{
struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;
- bool ret = false;
+ bool l3_mon_found = false;
/* Any monitoring at all? */
if (!cpu_feature_enabled(X86_FEATURE_CQM))
@@ -1001,27 +1001,31 @@ static __init bool get_rdt_mon_resources(void)
/* Any of the L3 monitoring features? */
if (!cpu_feature_enabled(X86_FEATURE_CQM_LLC))
- return false;
+ goto out;
if (rdt_cpu_has(X86_FEATURE_CQM_OCCUP_LLC)) {
resctrl_enable_mon_event(QOS_L3_OCCUP_EVENT_ID, false, 0, NULL);
- ret = true;
+ l3_mon_found = true;
}
if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) {
resctrl_enable_mon_event(QOS_L3_MBM_TOTAL_EVENT_ID, false, 0, NULL);
- ret = true;
+ l3_mon_found = true;
}
if (rdt_cpu_has(X86_FEATURE_CQM_MBM_LOCAL)) {
resctrl_enable_mon_event(QOS_L3_MBM_LOCAL_EVENT_ID, false, 0, NULL);
- ret = true;
+ l3_mon_found = true;
}
if (rdt_cpu_has(X86_FEATURE_ABMC))
- ret = true;
+ l3_mon_found = true;
- if (!ret)
- return false;
+ if (l3_mon_found)
+ rdt_get_l3_mon_config(r);
+ else
+ pr_info("CPUID reports L3 monitoring support, but no L3 monitoring features found\n");
- return !rdt_get_l3_mon_config(r);
+out:
+ /* Non-L3 features, e.g. AET, may be supported */
+ return true;
}
static __init void __check_quirks_intel(void)
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
index 82a555855c1b..bd45d72d1d05 100644
--- a/arch/x86/kernel/cpu/resctrl/monitor.c
+++ b/arch/x86/kernel/cpu/resctrl/monitor.c
@@ -431,7 +431,7 @@ static void __init intel_rdt_mbm_apply_quirk(u32 num_rmid)
mbm_cf = mbm_cf_table[cf_index].cf;
}
-int __init rdt_get_l3_mon_config(struct rdt_resource *r)
+void __init rdt_get_l3_mon_config(struct rdt_resource *r)
{
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
unsigned int mbm_offset;
@@ -519,8 +519,6 @@ int __init rdt_get_l3_mon_config(struct rdt_resource *r)
intel_rdt_mbm_apply_quirk(num_rmid);
r->mon_capable = true;
-
- return 0;
}
static void resctrl_abmc_set_one_amd(void *arg)
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index 79d4ddc3d64d..ecdb5da50179 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -3193,6 +3193,11 @@ static int rdt_get_tree(struct fs_context *fc)
goto out;
}
+ if (!resctrl_alloc_capable() && !resctrl_mon_capable()) {
+ ret = invalfc(fc, "No allocation or monitoring features are available or enabled");
+ goto out;
+ }
+
ret = setup_rmid_lru_list();
if (ret)
goto out;
@@ -3251,8 +3256,7 @@ static int rdt_get_tree(struct fs_context *fc)
if (resctrl_mon_capable())
resctrl_arch_enable_mon();
- if (resctrl_alloc_capable() || resctrl_mon_capable())
- resctrl_mounted = true;
+ resctrl_mounted = true;
if (resctrl_is_mbm_enabled()) {
r = resctrl_arch_get_resource(RDT_RESOURCE_L3);
--
2.55.0