[PATCH v8 next 06/10] arm_mpam: Add boot parameter to limit mpam_intpartid_max

Zeng Heng
2026-04-13T08:55:33Z

Add a new boot parameter "intpartid_max" to allow system administrators
to limit the number of internal PARTIDs used by the MPAM driver for
resource control groups. This provides flexibility to configure the
trade-off between:

* Number of resource control groups (CLOSIDs, limited by intpartid_max)
* Number of monitoring groups (RMIDs, limited by reqpartid and intpartid)

By default, the driver uses all available intPARTIDs for control groups.
With this parameter, users are able to reserve internal PARTIDs to create
additional sub-monitoring groups (provided that the narrow PARTID feature
is successfully enabled).

Example usage:
mpam.intpartid_max=7

mpam.intpartid_max is set to the maximum number of internal PARTIDs
minus one, which is applied as the limit at initialization time.

Signed-off-by: Zeng Heng <zengheng4@huawei.com>
---
drivers/resctrl/mpam_devices.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)

diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
index 8fbc8f9f9688..2aeff798a865 100644
--- a/drivers/resctrl/mpam_devices.c
+++ b/drivers/resctrl/mpam_devices.c
@@ -3,6 +3,9 @@

#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__

+#undef KBUILD_MODNAME
+#define KBUILD_MODNAME "mpam"
+
#include <linux/acpi.h>
#include <linux/atomic.h>
#include <linux/arm_mpam.h>
@@ -18,6 +21,7 @@
#include <linux/irq.h>
#include <linux/irqdesc.h>
#include <linux/list.h>
+#include <linux/moduleparam.h>
#include <linux/lockdep.h>
#include <linux/mutex.h>
#include <linux/platform_device.h>
@@ -65,6 +69,7 @@ static DEFINE_MUTEX(mpam_cpuhp_state_lock);
u16 mpam_partid_max;
u16 mpam_intpartid_max;
u8 mpam_pmg_max;
+static u16 bootparam_intpartid_max = USHRT_MAX;
static bool partid_max_init, partid_max_published;
static DEFINE_SPINLOCK(partid_max_lock);

@@ -2725,6 +2730,7 @@ static void mpam_enable_once(void)
* longer change.
*/
spin_lock(&partid_max_lock);
+ mpam_intpartid_max = min(mpam_intpartid_max, bootparam_intpartid_max);
partid_max_published = true;
spin_unlock(&partid_max_lock);

@@ -2779,6 +2785,20 @@ static void mpam_enable_once(void)
mpam_partid_max + 1, mpam_intpartid_max + 1, mpam_pmg_max + 1);
}

+static int mpam_intpartid_max_set(const char *val,
+ const struct kernel_param *kp)
+{
+ return param_set_uint_minmax(val, kp, 1, USHRT_MAX);
+}
+
+static const struct kernel_param_ops mpam_intpartid_max_ops = {
+ .set = mpam_intpartid_max_set,
+ .get = param_get_uint,
+};
+
+arch_param_cb(intpartid_max, &mpam_intpartid_max_ops,
+ &bootparam_intpartid_max, 0444);
+
static void mpam_reset_component_locked(struct mpam_component *comp)
{
struct mpam_vmsc *vmsc;
--
2.25.1