[RFC PATCH 17/31] x86/resctrl: Introduce region aware MBM event definitions
From: Chen Yu
Date: Sun Aug 02 2026 - 12:18:48 EST
Region-Aware RDT supports per-region MBM. Per the specification,
there are a maximum of 4 memory regions currently: DDR, CXL link,
UPI link, and Persistent Memory (including both local and remote
regions).
Based on this information, introduce 4 region-based MBM events
accordingly.
Signed-off-by: Chen Yu <yu.c.chen@xxxxxxxxx>
---
fs/resctrl/monitor.c | 13 +++++++++++++
fs/resctrl/rdtgroup.c | 15 ++++++++++++++-
include/linux/resctrl.h | 8 ++++++--
include/linux/resctrl_types.h | 14 +++++++++++++-
4 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
index 63d48be41025..aadac544576b 100644
--- a/fs/resctrl/monitor.c
+++ b/fs/resctrl/monitor.c
@@ -802,6 +802,17 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_l3_mon_domai
resctrl_arch_mon_ctx_free(rr.r, evtid, rr.arch_mon_ctx);
}
+static void rmbm_update(struct rdt_resource *r, struct rdt_l3_mon_domain *d,
+ struct rdtgroup *rdtgrp)
+{
+ enum resctrl_event_id evt;
+
+ for_each_rmbm_event_id(evt) {
+ if (resctrl_is_mon_event_enabled(evt))
+ mbm_update_one_event(r, d, rdtgrp, evt);
+ }
+}
+
static void mbm_update(struct rdt_resource *r, struct rdt_l3_mon_domain *d,
struct rdtgroup *rdtgrp)
{
@@ -814,6 +825,8 @@ static void mbm_update(struct rdt_resource *r, struct rdt_l3_mon_domain *d,
if (resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID))
mbm_update_one_event(r, d, rdtgrp, QOS_L3_MBM_LOCAL_EVENT_ID);
+
+ rmbm_update(r, d, rdtgrp);
}
/*
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index cb85108b4a1b..c1aac0dcd332 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -126,10 +126,23 @@ void rdt_staged_configs_clear(void)
}
}
+static bool resctrl_is_rmbm_enabled(void)
+{
+ enum resctrl_event_id evt;
+
+ for_each_rmbm_event_id(evt) {
+ if (resctrl_is_mon_event_enabled(evt))
+ return true;
+ }
+
+ return false;
+}
+
static bool resctrl_is_mbm_enabled(void)
{
return (resctrl_is_mon_event_enabled(QOS_L3_MBM_TOTAL_EVENT_ID) ||
- resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID));
+ resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID) ||
+ resctrl_is_rmbm_enabled());
}
/*
diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
index e8da30a71e13..7bbda28baccf 100644
--- a/include/linux/resctrl.h
+++ b/include/linux/resctrl.h
@@ -519,7 +519,7 @@ bool resctrl_arch_is_evt_configurable(enum resctrl_event_id evt);
static inline bool resctrl_is_mbm_event(enum resctrl_event_id eventid)
{
return (eventid >= QOS_L3_MBM_TOTAL_EVENT_ID &&
- eventid <= QOS_L3_MBM_LOCAL_EVENT_ID);
+ eventid <= QOS_L3_MBM_R3_EVENT_ID);
}
u32 resctrl_get_mon_evt_cfg(enum resctrl_event_id eventid);
@@ -527,7 +527,11 @@ u32 resctrl_get_mon_evt_cfg(enum resctrl_event_id eventid);
/* Iterate over all memory bandwidth events */
#define for_each_mbm_event_id(eventid) \
for (eventid = QOS_L3_MBM_TOTAL_EVENT_ID; \
- eventid <= QOS_L3_MBM_LOCAL_EVENT_ID; eventid++)
+ eventid <= QOS_L3_MBM_R3_EVENT_ID; eventid++)
+
+#define for_each_rmbm_event_id(eventid) \
+ for (eventid = QOS_L3_MBM_R0_EVENT_ID; \
+ eventid <= QOS_L3_MBM_R3_EVENT_ID; eventid++)
/* Iterate over memory bandwidth arrays in domain structures */
#define for_each_mbm_idx(idx) \
diff --git a/include/linux/resctrl_types.h b/include/linux/resctrl_types.h
index a5f56faa18d2..41dc1dff8c16 100644
--- a/include/linux/resctrl_types.h
+++ b/include/linux/resctrl_types.h
@@ -50,6 +50,18 @@ enum resctrl_event_id {
QOS_L3_MBM_TOTAL_EVENT_ID = 0x02,
QOS_L3_MBM_LOCAL_EVENT_ID = 0x03,
+ /*
+ * Region based MBM events.
+ * at most 4 regions for now, these
+ * 4 regions could be mapped to
+ * different memory regions, including
+ * local and remote regions.
+ */
+ QOS_L3_MBM_R0_EVENT_ID,
+ QOS_L3_MBM_R1_EVENT_ID,
+ QOS_L3_MBM_R2_EVENT_ID,
+ QOS_L3_MBM_R3_EVENT_ID,
+
/* Intel Telemetry Events */
PMT_EVENT_ENERGY,
PMT_EVENT_ACTIVITY,
@@ -65,7 +77,7 @@ enum resctrl_event_id {
QOS_NUM_EVENTS,
};
-#define QOS_NUM_L3_MBM_EVENTS (QOS_L3_MBM_LOCAL_EVENT_ID - QOS_L3_MBM_TOTAL_EVENT_ID + 1)
+#define QOS_NUM_L3_MBM_EVENTS (QOS_L3_MBM_R3_EVENT_ID - QOS_L3_MBM_TOTAL_EVENT_ID + 1)
#define MBM_STATE_IDX(evt) ((evt) - QOS_L3_MBM_TOTAL_EVENT_ID)
#endif /* __LINUX_RESCTRL_TYPES_H */
--
2.43.0