[RFC PATCH 4/7] arm_mpam: resctrl: Halve num_rmid for every mon_capable resource on CDP

From: Jinjie Ruan

Date: Thu Oct 22 2026 - 04:51:18 EST


CDP emulation consumes two PARTIDs per closid, halving the PARTIDs
available for monitoring. resctrl_arch_set_cdp_enabled() only updated
the L3 resource's num_rmid, which is fine today but leaves the L2
monitor's num_rmids stale once L2 monitoring exists.

Loop over all mon_capable resources and halve each one's num_rmid.

Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
---
drivers/resctrl/mpam_resctrl.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
index 9ffee18e657c..efb9ce76acb4 100644
--- a/drivers/resctrl/mpam_resctrl.c
+++ b/drivers/resctrl/mpam_resctrl.c
@@ -189,8 +189,9 @@ static void mpam_resctrl_monitor_sync_abmc_vals(struct rdt_resource *l3)
int resctrl_arch_set_cdp_enabled(enum resctrl_res_level rid, bool enable)
{
u32 partid_i = RESCTRL_RESERVED_CLOSID, partid_d = RESCTRL_RESERVED_CLOSID;
- struct mpam_resctrl_res *res = &mpam_resctrl_controls[RDT_RESOURCE_L3];
- struct rdt_resource *l3 = &res->resctrl_res;
+ struct rdt_resource *l3 = &mpam_resctrl_controls[RDT_RESOURCE_L3].resctrl_res;
+ struct mpam_resctrl_res *res;
+ enum resctrl_res_level i;
int cpu;

if (!IS_ENABLED(CONFIG_EXPERT) && enable) {
@@ -212,10 +213,22 @@ int resctrl_arch_set_cdp_enabled(enum resctrl_res_level rid, bool enable)
cdp_enabled = enable;
mpam_resctrl_controls[rid].cdp_enabled = enable;

- if (enable)
- l3->mon.num_rmid = resctrl_arch_system_num_rmid_idx() / 2;
- else
- l3->mon.num_rmid = resctrl_arch_system_num_rmid_idx();
+ /*
+ * CDP emulation consumes two PARTIDs per closid, halving the PARTIDs
+ * available for monitoring - no matter which resource the mount
+ * option was for. Update num_rmid for all mon_capable resources,
+ * e.g. the L2 monitors as well as the L3.
+ */
+ for_each_mpam_resctrl_control(res, i) {
+ struct rdt_resource *r = &res->resctrl_res;
+
+ if (!r->mon_capable)
+ continue;
+
+ r->mon.num_rmid = resctrl_arch_system_num_rmid_idx();
+ if (enable)
+ r->mon.num_rmid /= 2;
+ }

/* The mbw_max feature can't hide cdp as it's a per-partid maximum. */
if (cdp_enabled && !mpam_resctrl_controls[RDT_RESOURCE_MBA].cdp_enabled)
--
2.43.0