Hi Babu, On 1/22/25 12:20 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 enabled. "when mbm_cntr_assign is enabled" -> "when mbm_cntr_assign mode is enabled"? > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > --- > --- > Documentation/arch/x86/resctrl.rst | 8 +++++ > arch/x86/kernel/cpu/resctrl/monitor.c | 1 + > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 46 ++++++++++++++++++++++++++ > 3 files changed, 55 insertions(+) > > diff --git a/Documentation/arch/x86/resctrl.rst b/Documentation/arch/x86/resctrl.rst > index 31ff764deeeb..99cae75559b0 100644 > --- a/Documentation/arch/x86/resctrl.rst > +++ b/Documentation/arch/x86/resctrl.rst > @@ -299,6 +299,14 @@ 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 mbm_cntr_assign mode is enabled on the system. > + :: > + Documentation jumps in with some hardcoded values that may cause confusion. It looks to be missing something like (and looking back this also applies to "num_mbm_cntrs"): "For example, on a system with 30 available monitoring/(hardware?) counters in each of its L3 domains:" > + # cat /sys/fs/resctrl/info/L3_MON/available_mbm_cntrs > + 0=30;1=30 > + > "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 6fe9e610e9a0..f2bf5b13465d 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -1234,6 +1234,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 75a3b56996ca..2b86124c336b 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -888,6 +888,46 @@ static int resctrl_num_mbm_cntrs_show(struct kernfs_open_file *of, > return 0; > } > > +static int resctrl_available_mbm_cntrs_show(struct kernfs_open_file *of, > + struct seq_file *s, void *v) > +{ > + 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); > + Missing rdt_last_cmd_clear()? > + 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; > + } > + > + list_for_each_entry(dom, &r->mon_domains, hdr.list) { > + if (sep) > + seq_puts(s, ";"); The one character prints can be simplified with a seq_putc(). > + > + 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); I expect cntrs to need %u? > + sep = true; > + } > + seq_puts(s, "\n"); > + > +unlock_cntrs_show: > + mutex_unlock(&rdtgroup_mutex); > + cpus_read_unlock(); > + > + return ret; > +} > + > #ifdef CONFIG_PROC_CPU_RESCTRL > > /* > @@ -1916,6 +1956,12 @@ static struct rftype res_common_files[] = { > .kf_ops = &rdtgroup_kf_single_ops, > .seq_show = resctrl_num_mbm_cntrs_show, > }, > + { > + .name = "available_mbm_cntrs", > + .mode = 0444, > + .kf_ops = &rdtgroup_kf_single_ops, > + .seq_show = resctrl_available_mbm_cntrs_show, > + }, > { > .name = "cpus", > .mode = 0644, Reinette