Hi Babu, On 6/13/25 2:05 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 or unassign > counters when a resctrl group is created or deleted. This is a bit confusing since I do not think mbm_assign_on_mkdir has *anything* to do with unassign of counters. Counters are always (irrespective of mbm_assign_on_mkdir) unassigned when a resctrl group is deleted, no? The subject also does not seem accurate since there is no unassign on mkdir. > > 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. > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > --- ... > --- > arch/x86/kernel/cpu/resctrl/monitor.c | 1 + > fs/resctrl/rdtgroup.c | 71 ++++++++++++++++++++++++++- > 2 files changed, 70 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c > index ee0aa741cf6c..053f516a8e67 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -429,6 +429,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; > } > > r->mon_capable = true; > diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c > index bf5fd46bd455..128a9db339f3 100644 > --- a/fs/resctrl/rdtgroup.c > +++ b/fs/resctrl/rdtgroup.c > @@ -2945,6 +2945,55 @@ static void schemata_list_destroy(void) > } > } > > +/** > + * rdtgroup_assign_cntrs() - Assign counters to MBM events. Called when > + * a new group is created. > + * If "mbm_event" mode is enabled, counters are automatically assigned. "counters are automatically assigned" -> "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 > + * 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) > + return; > + > + if (resctrl_arch_mbm_cntr_assign_enabled(r) && !r->mon.mbm_assign_on_mkdir) > + return; This check is not clear to me. It looks to me as though counter assignment will be attempted if !resctrl_arch_mbm_cntr_assign_enabled(r)? Perhaps something like: 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)) > + resctrl_assign_cntr_event(r, NULL, rdtgrp, > + &mon_event_all[QOS_L3_MBM_TOTAL_EVENT_ID]); Switching the namespace like this is confusing to me. rdtgroup_assign_cntrs() has prefix rdtgroup_ to indicate it operates on a resource group. It is confusing when it switches namespace to call resctrl_assign_cntr_event() that actually assigns a specific event to a resource group. I think this will be easier to follow if: resctrl_assign_cntr_event() -> rdtgroup_assign_cntr_event() > + > + if (resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID)) > + resctrl_assign_cntr_event(r, NULL, rdtgrp, > + &mon_event_all[QOS_L3_MBM_LOCAL_EVENT_ID]); > +} > + > +/* > + * rdtgroup_unassign_cntrs() - Unassign the counters associated with MBM events. > + * Called when a group is deleted. > + */ > +static void rdtgroup_unassign_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)) > + return; > + > + if (resctrl_is_mon_event_enabled(QOS_L3_MBM_TOTAL_EVENT_ID)) > + resctrl_unassign_cntr_event(r, NULL, rdtgrp, > + &mon_event_all[QOS_L3_MBM_TOTAL_EVENT_ID]); same here, I think this will be easier to follow when namespace is consistent: resctrl_unassign_cntr_event() -> rdtgroup_unassign_cntr_event() Also, the struct rdt_resource parameter should not be needed when struct mon_evt is provided and resource can be obtained from mon_evt::rid. > + > + if (resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID)) > + resctrl_unassign_cntr_event(r, NULL, rdtgrp, > + &mon_event_all[QOS_L3_MBM_LOCAL_EVENT_ID]); > +} > + > static int rdt_get_tree(struct fs_context *fc) > { > struct rdt_fs_context *ctx = rdt_fc2context(fc); Reinette