[PATCH v12 15/25] x86,fs/resctrl: Handle systems where AET is the only resource
From: Tony Luck
Date: Wed Sep 16 2026 - 19:16:09 EST
On a system with no L3 monitor resources it should still be possible to
run with just AET.
Update get_rdt_mon_resources() to return true based on whether the
system supports monitoring rather than on the presence of any of the
L3 monitor features.
Refuse to mount the resctrl file system if there are no monitoring or
control features. Add invalfc() to rdt_get_tree() so the console log will
let the user know why the mount failed.
Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
v12:
Cleanups in get_rdt_mon_resources()
Add invalfc() to rdt_get_tree()
Change commit message with updated changes
---
arch/x86/kernel/cpu/resctrl/internal.h | 2 +-
arch/x86/kernel/cpu/resctrl/core.c | 20 +++++++++++---------
arch/x86/kernel/cpu/resctrl/monitor.c | 4 +---
fs/resctrl/rdtgroup.c | 8 ++++++--
4 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
index e46eb9a4c725..d70c8cb1cb81 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 e633da548959..addcb2a19c98 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,29 @@ 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 skip_l3_feature_checks;
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);
- return !rdt_get_l3_mon_config(r);
+skip_l3_feature_checks:
+ /* Even if there are no L3 monitor events, AET might 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 2f3e5b89a7fc..e684353631de 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;
@@ -514,8 +514,6 @@ int __init rdt_get_l3_mon_config(struct rdt_resource *r)
intel_rdt_mbm_apply_quirk(r->mon.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 0c9c29037667..2e9f71901f68 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -3195,6 +3195,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;
@@ -3253,8 +3258,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