[RFC PATCH v2 01/10] arm_mpam: resctrl: Use find_component() when allocating a domain

From: Reinette Chatre

Date: Mon Oct 19 2026 - 18:08:19 EST


mpam_resctrl_alloc_domain() starts by checking that the resource's
class has a component whose CPU affinity includes the CPU, and fails the
domain allocation otherwise. When the resource supports allocation, that
component also backs the control domain. The check uses an open-coded
walk of the class's component list, while the same function uses
find_component() to find the component backing each monitoring event.

The open-coded walk duplicates find_component(). It also holds the SRCU
read lock until mpam_resctrl_alloc_domain() returns, which suggests that
the component needs this protection while the domain is set up.

The component does not need it. Components are freed only when an MSC
fails to probe, in which case MPAM is never enabled and no resctrl
domain is created, or by mpam_disable(), which first removes the CPU
hotplug callbacks and thereby tears down all resctrl domains. A component
therefore outlives every domain that refers to it. The SRCU read lock is
only needed while walking the component list, and find_component() holds
it for that walk. In addition, mpam_resctrl_alloc_domain() only runs
from MPAM's CPU hotplug startup callback, which already holds the SRCU
read lock throughout.

Replace the open-coded walk with find_component().

Signed-off-by: Reinette Chatre <reinette.chatre@xxxxxxxxx>
---
drivers/resctrl/mpam_resctrl.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
index 9cec5843e8fa..3d5f90f9f1f3 100644
--- a/drivers/resctrl/mpam_resctrl.c
+++ b/drivers/resctrl/mpam_resctrl.c
@@ -1623,21 +1623,12 @@ mpam_resctrl_alloc_domain(unsigned int cpu, struct mpam_resctrl_res *res)
struct rdt_l3_mon_domain *mon_d;
struct rdt_ctrl_domain *ctrl_d;
struct mpam_class *class = res->class;
- struct mpam_component *comp_iter, *ctrl_comp;
+ struct mpam_component *ctrl_comp;
struct rdt_resource *r = &res->resctrl_res;

lockdep_assert_held(&domain_list_lock);

- ctrl_comp = NULL;
- guard(srcu)(&mpam_srcu);
- list_for_each_entry_srcu(comp_iter, &class->components, class_list,
- srcu_read_lock_held(&mpam_srcu)) {
- if (cpumask_test_cpu(cpu, &comp_iter->affinity)) {
- ctrl_comp = comp_iter;
- break;
- }
- }
-
+ ctrl_comp = find_component(class, cpu);
/* class has no component for this CPU */
if (WARN_ON_ONCE(!ctrl_comp))
return ERR_PTR(-EINVAL);
--
2.55.0