[RFC PATCH v2 01/19] arm_mpam: resctrl: Leave CDP off when there are too few PARTIDs
Jinjie Ruan
ruanjinjie at huawei.com
Thu Oct 29 05:35:53 PDT 2026
Enabling CDP needs a second PARTID for the reserved closid. If firmware
reports too few PARTIDs, resctrl_arch_set_cdp_enabled() returns -EINVAL,
but only after it has recorded CDP as enabled, halved the monitor count
and turned off the mbw_max MBA control. resctrl then reports an error
and believes CDP is off, which leaves the two sides out of step and the
halved monitor count and the missing MBA control are not undone.
Check the PARTID limit, and work out the CDP PARTIDs, before anything is
changed so a failed enable has no effect.
Fixes: 6789fb99282c ("arm_mpam: resctrl: Add CDP emulation")
Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>
---
drivers/resctrl/mpam_resctrl.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
index 5468367776e2..886f0595d364 100644
--- a/drivers/resctrl/mpam_resctrl.c
+++ b/drivers/resctrl/mpam_resctrl.c
@@ -210,6 +210,18 @@ int resctrl_arch_set_cdp_enabled(enum resctrl_res_level rid, bool enable)
if (enable)
pr_warn("CDP is an expert feature and may cause MPAM to malfunction.\n");
+ /*
+ * Check this before changing any state: if CDP can't be enabled the
+ * caller must see CDP left off.
+ */
+ if (enable) {
+ if (mpam_partid_max < 1)
+ return -EINVAL;
+
+ partid_d = resctrl_get_config_index(RESCTRL_RESERVED_CLOSID, CDP_DATA);
+ partid_i = resctrl_get_config_index(RESCTRL_RESERVED_CLOSID, CDP_CODE);
+ }
+
/*
* resctrl_arch_set_cdp_enabled() is only called with enable set to
* false on error and unmount.
@@ -238,14 +250,6 @@ int resctrl_arch_set_cdp_enabled(enum resctrl_res_level rid, bool enable)
if (!cdp_enabled && mpam_resctrl_controls[RDT_RESOURCE_MBA].class)
mpam_resctrl_controls[RDT_RESOURCE_MBA].resctrl_res.alloc_capable = true;
- if (enable) {
- if (mpam_partid_max < 1)
- return -EINVAL;
-
- partid_d = resctrl_get_config_index(RESCTRL_RESERVED_CLOSID, CDP_DATA);
- partid_i = resctrl_get_config_index(RESCTRL_RESERVED_CLOSID, CDP_CODE);
- }
-
mpam_set_task_partid_pmg(current, partid_d, partid_i, 0, 0);
WRITE_ONCE(arm64_mpam_global_default, mpam_get_regval(current));
--
2.34.1
More information about the linux-arm-kernel
mailing list