Hi Reinette, On 7/25/25 13:29, Babu Moger wrote: > Introduce the "available_mbm_cntrs" resctrl file to display the number of > counters available for assignment in each domain when "mbm_event" mode is > enabled. > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > Reviewed-by: Reinette Chatre <reinette.chatre@xxxxxxxxx> > --- > v16: Added Reviewed-by tag. > > v15: Minor changelog text update. > Minor resctrl.rst text update and corrected the error text in > resctrl_available_mbm_cntrs_show(). > Changed the goto label to out_unlock for consistency. > > v14: Minor changelog update. > Changed subject line to fs/resctrl. > > v13: Resolved conflicts caused by the recent FS/ARCH code restructure. > The files monitor.c and rdtgroup.c file has now been split between > the FS and ARCH directories. > > v12: Minor change to change log. > Updated the documentation text with an example. > Replaced seq_puts(s, ";") with seq_putc(s, ';'); > Added missing rdt_last_cmd_clear() in resctrl_available_mbm_cntrs_show(). > > v11: Rename rdtgroup_available_mbm_cntrs_show() to resctrl_available_mbm_cntrs_show(). > Few minor text changes. > > 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/filesystems/resctrl.rst | 11 ++++++ > fs/resctrl/monitor.c | 2 ++ > fs/resctrl/rdtgroup.c | 48 +++++++++++++++++++++++++++ > 3 files changed, 61 insertions(+) > > diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst > index 4eb27530be6f..446736dbd97f 100644 > --- a/Documentation/filesystems/resctrl.rst > +++ b/Documentation/filesystems/resctrl.rst > @@ -299,6 +299,17 @@ with the following files: > # cat /sys/fs/resctrl/info/L3_MON/num_mbm_cntrs > 0=32;1=32 > > +"available_mbm_cntrs": > + The number of counters available for assignment in each domain when mbm_event > + mode is enabled on the system. > + > + For example, on a system with 30 available [hardware] assignable 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/fs/resctrl/monitor.c b/fs/resctrl/monitor.c > index 4539b08db7b9..a0b0ea45c7b4 100644 > --- a/fs/resctrl/monitor.c > +++ b/fs/resctrl/monitor.c > @@ -931,6 +931,8 @@ int resctrl_mon_resource_init(void) > resctrl_enable_mon_event(QOS_L3_MBM_LOCAL_EVENT_ID); > resctrl_file_fflags_init("num_mbm_cntrs", > RFTYPE_MON_INFO | RFTYPE_RES_CACHE); > + resctrl_file_fflags_init("available_mbm_cntrs", > + RFTYPE_MON_INFO | RFTYPE_RES_CACHE); > } > > return 0; > diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c > index a09566720d4f..15d10c346307 100644 > --- a/fs/resctrl/rdtgroup.c > +++ b/fs/resctrl/rdtgroup.c > @@ -1853,6 +1853,48 @@ 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 = rdt_kn_parent_priv(of->kn); > + struct rdt_mon_domain *dom; > + bool sep = false; > + u32 cntrs, i; > + int ret = 0; > + > + cpus_read_lock(); > + mutex_lock(&rdtgroup_mutex); > + > + rdt_last_cmd_clear(); > + > + if (!resctrl_arch_mbm_cntr_assign_enabled(r)) { > + rdt_last_cmd_puts("mbm_event mode is not enabled\n"); > + ret = -EINVAL; > + goto out_unlock; > + } > + > + list_for_each_entry(dom, &r->mon_domains, hdr.list) { > + if (sep) > + seq_putc(s, ';'); > + > + cntrs = 0; > + for (i = 0; i < r->mon.num_mbm_cntrs; i++) { > + if (!dom->cntr_cfg[i].rdtgrp) > + cntrs++; > + } > + > + seq_printf(s, "%d=%u", dom->hdr.id, cntrs); > + sep = true; > + } > + seq_putc(s, '\n'); > + > +out_unlock: > + mutex_unlock(&rdtgroup_mutex); > + cpus_read_unlock(); > + > + return ret; > +} > + This also can be moved to monitor.c. What do you think? > /* rdtgroup information files for one cache resource. */ > static struct rftype res_common_files[] = { > { > @@ -1876,6 +1918,12 @@ static struct rftype res_common_files[] = { > .seq_show = rdt_mon_features_show, > .fflags = RFTYPE_MON_INFO, > }, > + { > + .name = "available_mbm_cntrs", > + .mode = 0444, > + .kf_ops = &rdtgroup_kf_single_ops, > + .seq_show = resctrl_available_mbm_cntrs_show, > + }, > { > .name = "num_rmids", > .mode = 0444, -- Thanks Babu Moger