[PATCH v11 14/23] x86/resctrl: Enforce system RMID limit on AET event groups

From: Tony Luck

Date: Mon Aug 31 2026 - 14:52:52 EST


AET (Application Energy Telemetry) event groups each support a specific
number of RMIDs. But that number may be lower than the number supported
by the system. This is especially true on systems with SNC (Sub-NUMA Cluster)
enabled as that reduces the number of supported RMIDs.

Reduce all event_group::num_rmid to system maximum.

Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
v11:
Split out as separate patch

arch/x86/kernel/cpu/resctrl/internal.h | 2 ++
arch/x86/kernel/cpu/resctrl/core.c | 2 ++
arch/x86/kernel/cpu/resctrl/intel_aet.c | 19 +++++++++++++++----
3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
index d70c8cb1cb81..27dc27480f6e 100644
--- a/arch/x86/kernel/cpu/resctrl/internal.h
+++ b/arch/x86/kernel/cpu/resctrl/internal.h
@@ -235,6 +235,7 @@ void resctrl_arch_mbm_cntr_assign_set_one(struct rdt_resource *r);

#ifdef CONFIG_X86_CPU_RESCTRL_INTEL_AET
bool intel_aet_get_events(void);
+void __init intel_aet_init(void);
void __exit intel_aet_exit(void);
int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 *val);
void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resource *r,
@@ -242,6 +243,7 @@ void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resource *r,
bool intel_handle_aet_option(bool force_off, char *tok);
#else
static inline bool intel_aet_get_events(void) { return false; }
+static inline void intel_aet_init(void) { }
static inline void __exit intel_aet_exit(void) { }
static inline int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 *val)
{
diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
index 0ddec2b67e3d..8b763cf638ef 100644
--- a/arch/x86/kernel/cpu/resctrl/core.c
+++ b/arch/x86/kernel/cpu/resctrl/core.c
@@ -1131,6 +1131,8 @@ static int __init resctrl_arch_late_init(void)
if (!get_rdt_resources())
return -ENODEV;

+ intel_aet_init();
+
state = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
"x86/resctrl/cat:online:",
resctrl_arch_online_cpu,
diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/resctrl/intel_aet.c
index 4ad6ad78e93e..fef1081f926d 100644
--- a/arch/x86/kernel/cpu/resctrl/intel_aet.c
+++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c
@@ -65,10 +65,10 @@ struct pmt_event {
* @force_on: True when "rdt" command line overrides disable of this
* event group.
* @guid: Unique number per XML description file.
- * @num_rmid: Number of RMIDs supported by this group. May be
- * adjusted downwards if enumeration from
- * intel_pmt_get_regions_by_feature() indicates fewer
- * RMIDs can be tracked simultaneously.
+ * @num_rmid: Number of RMIDs supported by this group. May be adjusted
+ * downwards if the system supports fewer RMIDs or
+ * enumeration from intel_pmt_get_regions_by_feature()
+ * indicates fewer RMIDs can be tracked simultaneously.
* @mmio_size: Number of bytes of MMIO registers for this group.
* @num_events: Number of events in this group.
* @evts: Array of event descriptors.
@@ -325,6 +325,17 @@ bool intel_aet_get_events(void)
return ret;
}

+void __init intel_aet_init(void)
+{
+ u32 max_rmid = resctrl_arch_system_max_rmid_idx();
+ struct event_group **peg, *e;
+
+ for_each_event_group(peg) {
+ e = *peg;
+ e->num_rmid = min(max_rmid, e->num_rmid);
+ }
+}
+
void __exit intel_aet_exit(void)
{
struct event_group **peg;
--
2.55.0