(andipan.das@xxxxxxx -> sandipan.das@xxxxxxx to stop sending undeliverable emails) Hi Babu, On 12/12/24 12:15 PM, Babu Moger wrote: > Provide the interface to display the number of monitoring counters > available for assignment in each domain when mbm_cntr_assign is supported. > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > --- > v10: Patch changed to handle the counters at domain level. > https://lore.kernel.org/lkml/CALPaoCj+zWq1vkHVbXYP0znJbe6Ke3PXPWjtri5AFgD9cQDCUg@xxxxxxxxxxxxxx/ > So, display logic also changed now. > > v9: New patch > --- > Documentation/arch/x86/resctrl.rst | 4 +++ > arch/x86/kernel/cpu/resctrl/monitor.c | 1 + > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 47 ++++++++++++++++++++++++++ > 3 files changed, 52 insertions(+) > > diff --git a/Documentation/arch/x86/resctrl.rst b/Documentation/arch/x86/resctrl.rst > index 43a861adeada..c075fcee96b7 100644 > --- a/Documentation/arch/x86/resctrl.rst > +++ b/Documentation/arch/x86/resctrl.rst > @@ -302,6 +302,10 @@ with the following files: > memory bandwidth tracking to a single memory bandwidth event per > monitoring group. > > +"available_mbm_cntrs": > + The number of monitoring counters available for assignment in each > + domain when the architecture supports mbm_cntr_assign mode. "architecture supports" -> "system supports" It looks to me as though more than just support is required, the mode is also required to be enabled? > + > "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 b07d60fabf1c..f857af361af1 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -1238,6 +1238,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) > cpuid_count(0x80000020, 5, &eax, &ebx, &ecx, &edx); > r->mon.num_mbm_cntrs = (ebx & GENMASK(15, 0)) + 1; > resctrl_file_fflags_init("num_mbm_cntrs", RFTYPE_MON_INFO); > + resctrl_file_fflags_init("available_mbm_cntrs", RFTYPE_MON_INFO); > } > } > > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index 1ee008a63d8b..72518e0ec2ec 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -879,6 +879,47 @@ static int rdtgroup_num_mbm_cntrs_show(struct kernfs_open_file *of, > return 0; > } > > +static int rdtgroup_available_mbm_cntrs_show(struct kernfs_open_file *of, > + struct seq_file *s, void *v) rdtgroup_ > +{ > + struct rdt_resource *r = of->kn->parent->priv; > + struct rdt_mon_domain *dom; > + bool sep = false; > + u32 cntrs, i; > + int ret = 0; > + > + cpus_read_lock(); > + mutex_lock(&rdtgroup_mutex); > + > + if (!resctrl_arch_mbm_cntr_assign_enabled(r)) { > + rdt_last_cmd_puts("mbm_cntr_assign mode is not enabled\n"); > + ret = -EINVAL; > + goto unlock_cntrs_show; > + } > + > + unnecessary empty line > + list_for_each_entry(dom, &r->mon_domains, hdr.list) { > + if (sep) > + seq_puts(s, ";"); > + > + cntrs = 0; > + for (i = 0; i < r->mon.num_mbm_cntrs; i++) { > + if (!dom->cntr_cfg[i].rdtgrp) > + cntrs++; > + } > + > + seq_printf(s, "%d=%d", dom->hdr.id, cntrs); > + sep = true; > + } > + seq_puts(s, "\n"); > + > +unlock_cntrs_show: > + mutex_unlock(&rdtgroup_mutex); > + cpus_read_unlock(); > + > + return ret; > +} > + > #ifdef CONFIG_PROC_CPU_RESCTRL > > /* > @@ -1961,6 +2002,12 @@ static struct rftype res_common_files[] = { > .kf_ops = &rdtgroup_kf_single_ops, > .seq_show = rdtgroup_num_mbm_cntrs_show, > }, > + { > + .name = "available_mbm_cntrs", > + .mode = 0444, > + .kf_ops = &rdtgroup_kf_single_ops, > + .seq_show = rdtgroup_available_mbm_cntrs_show, > + }, > { > .name = "cpus_list", > .mode = 0644, Reinette