In ABMC mode, the hardware counter should be assigned to read the MBM events. Report "Unassigned" in case the user attempts to read the events without assigning the counter. Signed-off-by: Babu Moger <babu.moger@xxxxxxx> --- v5: New patch. --- Documentation/arch/x86/resctrl.rst | 4 ++++ arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Documentation/arch/x86/resctrl.rst b/Documentation/arch/x86/resctrl.rst index 4907d0758118..11b7a5f26b40 100644 --- a/Documentation/arch/x86/resctrl.rst +++ b/Documentation/arch/x86/resctrl.rst @@ -284,6 +284,10 @@ with the following files: until the user unassigns it manually. There is no need to worry about counters being reset during this period. + In ABMC mode, the MBM event counters will return "Unassigned" if + the hardware counter is not assigned to the event. Users need to + assign a counter manually to read the events. + Without ABMC enabled, monitoring will work in "legacy" mode without assignment option. diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c index 50fa1fe9a073..e60b469b7d12 100644 --- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c +++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c @@ -562,7 +562,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg) struct rdtgroup *rdtgrp; struct rdt_resource *r; union mon_data_bits md; - int ret = 0; + int ret = 0, index; rdtgrp = rdtgroup_kn_lock_live(of->kn); if (!rdtgrp) { @@ -609,12 +609,21 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg) checkresult: - if (rr.err == -EIO) + if (rr.err == -EIO) { seq_puts(m, "Error\n"); - else if (rr.err == -EINVAL) - seq_puts(m, "Unavailable\n"); - else + } else if (rr.err == -EINVAL) { + if (resctrl_arch_get_abmc_enabled()) { + index = mon_event_config_index_get(evtid); + if (rdtgrp->mon.cntr_id[index] == MON_CNTR_UNSET) + seq_puts(m, "Unassigned\n"); + else + seq_puts(m, "Unavailable\n"); + } else { + seq_puts(m, "Unavailable\n"); + } + } else { seq_printf(m, "%llu\n", rr.val); + } out: rdtgroup_kn_unlock(of->kn); -- 2.34.1