]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/resctrl: Continue counter allocation after failure
authorBen Horgan <ben.horgan@arm.com>
Wed, 6 May 2026 08:28:53 +0000 (09:28 +0100)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 8 May 2026 10:07:43 +0000 (12:07 +0200)
In mbm_event mode, with mbm_assign_on_mkdir set to 1, when a user creates a
new CTRL_MON or MON group resctrl attempts to allocate counters for each of
the supported MBM events on each resctrl domain. As counters are limited,
such allocation may fail and when it does counter allocations for the
remaining domains are skipped even if the domains have available counters.

Because of that, the user needs to view the resource group'smbm_L3_assignments
file to get an accurate view of counter assignment in a new resource group and
then manually create counters in the skipped domains with available counters.

Writes to mbm_L3_assignments using the wildcard format, <event>:*=e, also skip
counter allocation in other domains after a counter allocation failure.

When handling a request to create counters in all domains it is unnecessary
for a counter allocation in one domain to prevent counter allocation in
other domains. Always attempt to allocate all the counters requested.

  [ bp: Massage commit message. ]

Signed-off-by: Ben Horgan <ben.horgan@arm.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Babu Moger <babu.moger@amd.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lore.kernel.org/20260506082855.3694761-1-ben.horgan@arm.com
fs/resctrl/monitor.c

index 5fbcc64e50ce71c5c969fb242d569eb8f6db22d6..0e6a389a16bf69ff5e833d4db5fd20f0cbde8b3d 100644 (file)
@@ -1211,9 +1211,10 @@ static int rdtgroup_alloc_assign_cntr(struct rdt_resource *r, struct rdt_l3_mon_
  * NULL; otherwise, assign the counter to the specified domain @d.
  *
  * If all counters in a domain are already in use, rdtgroup_alloc_assign_cntr()
- * will fail. The assignment process will abort at the first failure encountered
- * during domain traversal, which may result in the event being only partially
- * assigned.
+ * will fail. When attempting to assign counters to all domains, carry on trying
+ * to assign counters after a failure since only some domains may have counters
+ * and the goal is to assign counters where possible. If any counter assignment
+ * fails, return the error from the last failing assignment.
  *
  * Return:
  * 0 on success, < 0 on failure.
@@ -1226,9 +1227,11 @@ static int rdtgroup_assign_cntr_event(struct rdt_l3_mon_domain *d, struct rdtgro
 
        if (!d) {
                list_for_each_entry(d, &r->mon_domains, hdr.list) {
-                       ret = rdtgroup_alloc_assign_cntr(r, d, rdtgrp, mevt);
-                       if (ret)
-                               return ret;
+                       int err;
+
+                       err = rdtgroup_alloc_assign_cntr(r, d, rdtgrp, mevt);
+                       if (err)
+                               ret = err;
                }
        } else {
                ret = rdtgroup_alloc_assign_cntr(r, d, rdtgrp, mevt);