Hi Reinette, On 10/25/22 18:45, Reinette Chatre wrote: > Hi Babu, > > On 10/17/2022 3:26 PM, Babu Moger wrote: >> Add a new field in mon_evt to support Bandwidth Monitoring Event >> Configuration(BMEC) and also update the "mon_features" display. >> >> The sysfs file "mon_features" will display the monitor configuration >> if supported. >> >> Before the change. >> $cat /sys/fs/resctrl/info/L3_MON/mon_features >> llc_occupancy >> mbm_total_bytes >> mbm_local_bytes >> >> After the change if BMEC is supported. >> $cat /sys/fs/resctrl/info/L3_MON/mon_features >> llc_occupancy >> mbm_total_bytes >> mbm_total_config >> mbm_local_bytes >> mbm_local_config > This does not seem to be what the code in this patch does. You are right. it is # cat /sys/fs/resctrl/info/L3_MON/mon_features llc_occupancy mbm_total_bytes mbm_total_bytes_config mbm_local_bytes mbm_local_bytes_config > >> Signed-off-by: Babu Moger <babu.moger@xxxxxxx> >> --- >> arch/x86/kernel/cpu/resctrl/core.c | 3 ++- >> arch/x86/kernel/cpu/resctrl/internal.h | 4 +++- >> arch/x86/kernel/cpu/resctrl/monitor.c | 7 ++++++- >> arch/x86/kernel/cpu/resctrl/rdtgroup.c | 5 ++++- >> 4 files changed, 15 insertions(+), 4 deletions(-) >> >> diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c >> index d79f494a4e91..46813b1c50c2 100644 >> --- a/arch/x86/kernel/cpu/resctrl/core.c >> +++ b/arch/x86/kernel/cpu/resctrl/core.c >> @@ -814,6 +814,7 @@ static __init bool get_rdt_alloc_resources(void) >> static __init bool get_rdt_mon_resources(void) >> { >> struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; >> + bool mon_configurable = rdt_cpu_has(X86_FEATURE_BMEC); >> >> if (rdt_cpu_has(X86_FEATURE_CQM_OCCUP_LLC)) >> rdt_mon_features |= (1 << QOS_L3_OCCUP_EVENT_ID); >> @@ -825,7 +826,7 @@ static __init bool get_rdt_mon_resources(void) >> if (!rdt_mon_features) >> return false; >> >> - return !rdt_get_mon_l3_config(r); >> + return !rdt_get_mon_l3_config(r, mon_configurable); >> } > This seems to do a portion of configuration in the calling function, pass the > results of to the actual configuration function where the rest of the configuration is > done. Determining "mon_configurable" really looks like it belongs in > rdt_get_mon_l3_config(). Is it availability of rdt_cpu_has() that prevented > that change? Why not make it available internally to all resctrl code? Yes. It is because of rdt_cpu_has availability. Also, it is __init routine. Yes. I can make it available. > > Patch 7's mbm_config_rftype_init() can also be moved to rdt_get_mon_l3_config() > to match how other related configs (thread_throttle_mode_init()) are done. Sure. Will do. > >> >> static __init void __check_quirks_intel(void) >> diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h >> index 16e3c6e03c79..b458f768f30c 100644 >> --- a/arch/x86/kernel/cpu/resctrl/internal.h >> +++ b/arch/x86/kernel/cpu/resctrl/internal.h >> @@ -63,11 +63,13 @@ DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key); >> * struct mon_evt - Entry in the event list of a resource >> * @evtid: event id >> * @name: name of the event >> + * @configurable: true if the event is configurable >> * @list: entry in &rdt_resource->evt_list >> */ >> struct mon_evt { >> enum resctrl_event_id evtid; >> char *name; >> + bool configurable; >> struct list_head list; >> }; >> >> @@ -522,7 +524,7 @@ int closids_supported(void); >> void closid_free(int closid); >> int alloc_rmid(void); >> void free_rmid(u32 rmid); >> -int rdt_get_mon_l3_config(struct rdt_resource *r); >> +int rdt_get_mon_l3_config(struct rdt_resource *r, bool configurable); >> void mon_event_count(void *info); >> int rdtgroup_mondata_show(struct seq_file *m, void *arg); >> void mon_event_read(struct rmid_read *rr, struct rdt_resource *r, >> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c >> index efe0c30d3a12..4b8adb7f1c5c 100644 >> --- a/arch/x86/kernel/cpu/resctrl/monitor.c >> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c >> @@ -746,7 +746,7 @@ static void l3_mon_evt_init(struct rdt_resource *r) >> list_add_tail(&mbm_local_event.list, &r->evt_list); >> } >> >> -int rdt_get_mon_l3_config(struct rdt_resource *r) >> +int rdt_get_mon_l3_config(struct rdt_resource *r, bool configurable) >> { >> unsigned int mbm_offset = boot_cpu_data.x86_cache_mbm_width_offset; >> struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); >> @@ -783,6 +783,11 @@ int rdt_get_mon_l3_config(struct rdt_resource *r) >> if (ret) >> return ret; >> >> + if (configurable) { >> + mbm_total_event.configurable = true; >> + mbm_local_event.configurable = true; >> + } >> + >> l3_mon_evt_init(r); >> >> r->mon_capable = true; >> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> index 1271fd1ae2f3..5f0ef1bf4c78 100644 >> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> @@ -1001,8 +1001,11 @@ static int rdt_mon_features_show(struct kernfs_open_file *of, >> struct rdt_resource *r = of->kn->parent->priv; >> struct mon_evt *mevt; >> >> - list_for_each_entry(mevt, &r->evt_list, list) >> + list_for_each_entry(mevt, &r->evt_list, list) { >> seq_printf(seq, "%s\n", mevt->name); >> + if (mevt->configurable) >> + seq_printf(seq, "%s_config\n", mevt->name); >> + } >> >> return 0; >> } >> > If mevt->name is "mbm_total_bytes", then would this not > print "mbm_total_bytes_config"? This is different from "mbm_total_config" > in the changelog and does not match the actual files created in later > patches.. Sure. Will update the changelog, Thanks Babu