]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/resctrl: Add "mba_MBps_event" file to CTRL_MON directories
authorTony Luck <tony.luck@intel.com>
Fri, 6 Dec 2024 16:31:46 +0000 (08:31 -0800)
committerBorislav Petkov (AMD) <bp@alien8.de>
Thu, 12 Dec 2024 10:27:28 +0000 (11:27 +0100)
The "mba_MBps" mount option provides an alternate method to control memory
bandwidth. Instead of specifying allowable bandwidth as a percentage of
maximum possible, the user provides a MiB/s limit value.

In preparation to allow the user to pick the memory bandwidth monitoring event
used as input to the feedback loop, provide a file in each CTRL_MON group
directory that shows the event currently in use. Note that this file is only
visible when the "mba_MBps" mount option is in use.

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lore.kernel.org/r/20241206163148.83828-7-tony.luck@intel.com
arch/x86/kernel/cpu/resctrl/ctrlmondata.c
arch/x86/kernel/cpu/resctrl/internal.h
arch/x86/kernel/cpu/resctrl/rdtgroup.c

index 200d89a6402708066bf165487577e142c73b057b..5fa37b4ecc7a44d94653446d20ef2ca5da9a9f61 100644 (file)
@@ -518,6 +518,36 @@ static int smp_mon_event_count(void *arg)
        return 0;
 }
 
+int rdtgroup_mba_mbps_event_show(struct kernfs_open_file *of,
+                                struct seq_file *s, void *v)
+{
+       struct rdtgroup *rdtgrp;
+       int ret = 0;
+
+       rdtgrp = rdtgroup_kn_lock_live(of->kn);
+
+       if (rdtgrp) {
+               switch (rdtgrp->mba_mbps_event) {
+               case QOS_L3_MBM_LOCAL_EVENT_ID:
+                       seq_puts(s, "mbm_local_bytes\n");
+                       break;
+               case QOS_L3_MBM_TOTAL_EVENT_ID:
+                       seq_puts(s, "mbm_total_bytes\n");
+                       break;
+               default:
+                       pr_warn_once("Bad event %d\n", rdtgrp->mba_mbps_event);
+                       ret = -EINVAL;
+                       break;
+               }
+       } else {
+               ret = -ENOENT;
+       }
+
+       rdtgroup_kn_unlock(of->kn);
+
+       return ret;
+}
+
 void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
                    struct rdt_mon_domain *d, struct rdtgroup *rdtgrp,
                    cpumask_t *cpumask, int evtid, int first)
index 542d01c055aa0f6d711ba7ce3d0acc8ebb5eb686..1bd61edbaf12d1749a8a19e27d2eb97023eee132 100644 (file)
@@ -610,6 +610,8 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
                                char *buf, size_t nbytes, loff_t off);
 int rdtgroup_schemata_show(struct kernfs_open_file *of,
                           struct seq_file *s, void *v);
+int rdtgroup_mba_mbps_event_show(struct kernfs_open_file *of,
+                                struct seq_file *s, void *v);
 bool rdtgroup_cbm_overlaps(struct resctrl_schema *s, struct rdt_ctrl_domain *d,
                           unsigned long cbm, int closid, bool exclusive);
 unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct rdt_ctrl_domain *d,
index 0659b8e2a71b51a0f31918d55ff24879e5290472..6eb930b8bdfd9918ba6d3b1d31e7d60ba23a512a 100644 (file)
@@ -1950,6 +1950,12 @@ static struct rftype res_common_files[] = {
                .seq_show       = rdtgroup_schemata_show,
                .fflags         = RFTYPE_CTRL_BASE,
        },
+       {
+               .name           = "mba_MBps_event",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = rdtgroup_mba_mbps_event_show,
+       },
        {
                .name           = "mode",
                .mode           = 0644,
@@ -2355,6 +2361,7 @@ static int set_mba_sc(bool mba_sc)
        struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_MBA].r_resctrl;
        u32 num_closid = resctrl_arch_get_num_closid(r);
        struct rdt_ctrl_domain *d;
+       unsigned long fflags;
        int i;
 
        if (!supports_mba_mbps() || mba_sc == is_mba_sc(r))
@@ -2369,6 +2376,9 @@ static int set_mba_sc(bool mba_sc)
                        d->mbps_val[i] = MBA_MAX_MBPS;
        }
 
+       fflags = mba_sc ? RFTYPE_CTRL_BASE | RFTYPE_MON_BASE : 0;
+       resctrl_file_fflags_init("mba_MBps_event", fflags);
+
        return 0;
 }