Hi Babu, On 10/9/24 10:39 AM, Babu Moger wrote: > Provide the interface to list the assignment states of all the resctrl > groups in mbm_cntr_assign mode. > > Example: > $mount -t resctrl resctrl /sys/fs/resctrl/ > $cat /sys/fs/resctrl/info/L3_MON/mbm_assign_control > //0=tl;1=tl; > > List follows the following format: > > "<CTRL_MON group>/<MON group>/<domain_id>=<flags>" > > Format for specific type of groups: > > - Default CTRL_MON group: > "//<domain_id>=<flags>" > > - Non-default CTRL_MON group: > "<CTRL_MON group>//<domain_id>=<flags>" > > - Child MON group of default CTRL_MON group: > "/<MON group>/<domain_id>=<flags>" > > - Child MON group of non-default CTRL_MON group: > "<CTRL_MON group>/<MON group>/<domain_id>=<flags>" > > Flags can be one of the following: > t MBM total event is enabled > l MBM local event is enabled > tl Both total and local MBM events are enabled > _ None of the MBM events are enabled > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > --- > v8: Moved resctrl_mbm_event_assigned() in here as it is first used here. > Moved rdt_last_cmd_clear() before making any call. > Updated the commit log. > Corrected the doc format. > > v7: Renamed the interface name from 'mbm_control' to 'mbm_assign_control' > to match 'mbm_assign_mode'. > Removed Arch references from FS code. > Added rdt_last_cmd_clear() before the command processing. > Added rdtgroup_mutex before all the calls. > Removed references of ABMC from FS code. > > v6: The domain specific assignment can be determined looking at mbm_cntr_map. > Removed rdtgroup_abmc_dom_cfg() and rdtgroup_abmc_dom_state(). > Removed the switch statement for the domain_state detection. > Determined the flags incremently. > Removed special handling of default group while printing.. > > v5: Replaced "assignment flags" with "flags". > Changes related to mon structure. > Changes related renaming the interface from mbm_assign_control to > mbm_control. > > v4: Added functionality to query domain specific assigment in. > rdtgroup_abmc_dom_state(). > > v3: New patch. > Addresses the feedback to provide the global assignment interface. > https://lore.kernel.org/lkml/c73f444b-83a1-4e9a-95d3-54c5165ee782@xxxxxxxxx/ > --- > Documentation/arch/x86/resctrl.rst | 44 +++++++++++++++ > arch/x86/kernel/cpu/resctrl/monitor.c | 1 + > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 76 ++++++++++++++++++++++++++ > 3 files changed, 121 insertions(+) > > diff --git a/Documentation/arch/x86/resctrl.rst b/Documentation/arch/x86/resctrl.rst > index d9574078f735..b85d3bc3e301 100644 > --- a/Documentation/arch/x86/resctrl.rst > +++ b/Documentation/arch/x86/resctrl.rst > @@ -310,6 +310,50 @@ with the following files: > The number of monitoring counters available for assignment when the > architecture supports mbm_cntr_assign mode. > > +"mbm_assign_control": > + Reports the resctrl group and monitor status of each group. > + > + List follows the following format: > + "<CTRL_MON group>/<MON group>/<domain_id>=<flags>" > + > + Format for specific type of groups: > + > + * Default CTRL_MON group: > + "//<domain_id>=<flags>" > + > + * Non-default CTRL_MON group: > + "<CTRL_MON group>//<domain_id>=<flags>" > + > + * Child MON group of default CTRL_MON group: > + "/<MON group>/<domain_id>=<flags>" > + > + * Child MON group of non-default CTRL_MON group: > + "<CTRL_MON group>/<MON group>/<domain_id>=<flags>" > + > + Flags can be one of the following: > + :: > + > + t MBM total event is assigned. > + l MBM local event is assigned. > + tl Both total and local MBM events are assigned. > + _ None of the MBM events are assigned. > + > + Examples: > + :: > + > + # mkdir /sys/fs/resctrl/mon_groups/child_default_mon_grp > + # mkdir /sys/fs/resctrl/non_default_ctrl_mon_grp > + # mkdir /sys/fs/resctrl/non_default_ctrl_mon_grp/mon_groups/child_non_default_mon_grp > + > + # cat /sys/fs/resctrl/info/L3_MON/mbm_assign_control > + non_default_ctrl_mon_grp//0=tl;1=tl; > + non_default_ctrl_mon_grp/child_non_default_mon_grp/0=tl;1=tl; > + //0=tl;1=tl; > + /child_default_mon_grp/0=tl;1=tl; > + > + There are four resctrl groups. All the groups have total and local MBM events > + assigned on domain 0 and 1. > + > "max_threshold_occupancy": > Read/write file provides the largest value (in > bytes) at which a previously used LLC_occupancy > diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c > index 395d99984893..fa7c77935080 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -1269,6 +1269,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) > r->mon.num_mbm_cntrs = (ebx & GENMASK(15, 0)) + 1; > resctrl_file_fflags_init("num_mbm_cntrs", RFTYPE_MON_INFO); > hw_res->mbm_cntr_assign_enabled = true; > + resctrl_file_fflags_init("mbm_assign_control", RFTYPE_MON_INFO); > } > } > > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index cf2e0ad0e4f4..cf92ceb0f05e 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -970,6 +970,76 @@ static int rdtgroup_num_mbm_cntrs_show(struct kernfs_open_file *of, > return 0; > } > > +static bool resctrl_mbm_event_assigned(struct rdtgroup *rdtg, > + struct rdt_mon_domain *d, u32 evtid) u32 -> enum resctrl_event_id ? > +{ > + int index = MBM_EVENT_ARRAY_INDEX(evtid); > + int cntr_id = rdtg->mon.cntr_id[index]; > + > + return cntr_id != MON_CNTR_UNSET && test_bit(cntr_id, d->mbm_cntr_map); > +} > + > +static char *rdtgroup_mon_state_to_str(struct rdtgroup *rdtgrp, > + struct rdt_mon_domain *d, char *str) > +{ > + char *tmp = str; > + > + /* Query the total and local event flags for the domain */ > + if (resctrl_mbm_event_assigned(rdtgrp, d, QOS_L3_MBM_TOTAL_EVENT_ID)) > + *tmp++ = 't'; > + > + if (resctrl_mbm_event_assigned(rdtgrp, d, QOS_L3_MBM_LOCAL_EVENT_ID)) > + *tmp++ = 'l'; > + > + if (tmp == str) > + *tmp++ = '_'; > + > + *tmp = '\0'; > + return str; > +} > + Reinette