Hi Babu,
On 7/8/25 3:17 PM, Babu Moger wrote:
Resctrl provides a user-configurable option mbm_assign_on_mkdir that
determines if a counter will automatically be assigned to an RMID, event
pair when its associated monitor group is created via mkdir.
Enable mbm_assign_on_mkdir by default and automatically assign the counters
when a resctrl group is created.
Counters allocated to a resctrl group should be released when the group is
deleted. Add support to unassign and free counters during the group
teardown.
By default, each group requires two counters: one for the MBM total event
and one for the MBM local event.
If the counters are exhausted, the kernel will log the error message
"Unable to allocate counter in domain" in
/sys/fs/resctrl/info/last_cmd_status when a new group is created and the
counter assignment will fail. However, the creation of a group should not
fail due to assignment failures. Users have the flexibility to modify the
assignments at a later time.
I find that this changelog jumps around a bit. Below is an attempt at some
re-organization. Please feel free to improve:
Resctrl provides a user-configurable option mbm_assign_on_mkdir that
determines if a counter will automatically be assigned to an RMID, event
pair when its associated monitor group is created via mkdir.
Enable mbm_assign_on_mkdir by default to automatically assign
counters to the two default events (MBM total and MBM local) of a new
monitoring group created via mkdir. This maintains backward compatibility
with original resctrl support for these two events.
Unassign and free counters belonging to a monitoring group when the group is
deleted.
Monitor group creation does not fail if a counter cannot be assigned to
one or both events. There may be limited counters and users have the
flexibility to modify counter assignments at a later time.
Log the error message "Unable to allocate counter in domain" in
/sys/fs/resctrl/info/last_cmd_status when a new monitoring group is created
but counter assignment failed.
Signed-off-by: Babu Moger <babu.moger@xxxxxxx>
---
...
---
arch/x86/kernel/cpu/resctrl/monitor.c | 1 +
fs/resctrl/rdtgroup.c | 70 ++++++++++++++++++++++++++-
2 files changed, 69 insertions(+), 2 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
index 026c2e2d19d3..e0706083fe0e 100644
--- a/arch/x86/kernel/cpu/resctrl/monitor.c
+++ b/arch/x86/kernel/cpu/resctrl/monitor.c
@@ -457,6 +457,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)
r->mon.mbm_cntr_assignable = true;
cpuid_count(0x80000020, 5, &eax, &ebx, &ecx, &edx);
r->mon.num_mbm_cntrs = (ebx & GENMASK(15, 0)) + 1;
+ r->mon.mbm_assign_on_mkdir = true;
This is a resctrl fs default. Should it not be set in
resctrl_mon_resource_init()?
Sure.
}
r->mon_capable = true;
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index b7289ce2b3a6..645245f274e9 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -2884,6 +2884,54 @@ static void schemata_list_destroy(void)
}
}
+/*
+ * rdtgroup_assign_cntrs() - Assign counters to MBM events. Called when
+ * a new group is created.
+ * If "mbm_event" counter assignment mode is enabled, counters should be
+ * automatically assigned if the "mbm_assign_on_mkdir" is set.
+ * Each group can accommodate two counters: one for the total event and
"Each group can accommodate two counters" -> "Each group can accommodate two counters
per domain"?
+ * one for the local event. Assignments may fail due to the limited number
+ * of counters. However, it is not necessary to fail the group creation
+ * and thus no failure is returned. Users have the option to modify the
+ * counter assignments after the group has been created.
+ */
+static void rdtgroup_assign_cntrs(struct rdtgroup *rdtgrp)
+{
+ struct rdt_resource *r = resctrl_arch_get_resource(RDT_RESOURCE_L3);
+
+ if (!r->mon_capable || !resctrl_arch_mbm_cntr_assign_enabled(r) ||
+ !r->mon.mbm_assign_on_mkdir)
+ return;
+
+ if (resctrl_is_mon_event_enabled(QOS_L3_MBM_TOTAL_EVENT_ID))
+ rdtgroup_assign_cntr_event(NULL, rdtgrp,
+ &mon_event_all[QOS_L3_MBM_TOTAL_EVENT_ID]);
+
+ if (resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID))
+ rdtgroup_assign_cntr_event(NULL, rdtgrp,
+ &mon_event_all[QOS_L3_MBM_LOCAL_EVENT_ID]);
+}
+
Reinette