]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/resctrl: Create mba_sc configuration in the rdt_domain
authorJames Morse <james.morse@arm.com>
Fri, 2 Sep 2022 15:48:16 +0000 (15:48 +0000)
committerBorislav Petkov <bp@suse.de>
Thu, 22 Sep 2022 15:17:59 +0000 (17:17 +0200)
To support resctrl's MBA software controller, the architecture must provide
a second configuration array to hold the mbps_val[] from user-space.

This complicates the interface between the architecture specific code and
the filesystem portions of resctrl that will move to /fs/, to allow
multiple architectures to support resctrl.

Make the filesystem parts of resctrl create an array for the mba_sc
values. The software controller can be changed to use this, allowing
the architecture code to only consider the values configured in hardware.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Jamie Iles <quic_jiles@quicinc.com>
Reviewed-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Xin Hao <xhao@linux.alibaba.com>
Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Tested-by: Cristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20220902154829.30399-9-james.morse@arm.com
arch/x86/kernel/cpu/resctrl/internal.h
arch/x86/kernel/cpu/resctrl/rdtgroup.c
include/linux/resctrl.h

index e12b55f815bfda5a963596d20b3ec05215675500..a7e2cbce29d5f8619e0a5b7295df8cf8fd2ff3c7 100644 (file)
@@ -36,7 +36,6 @@
 #define MBM_OVERFLOW_INTERVAL          1000
 #define MAX_MBA_BW                     100u
 #define MBA_IS_LINEAR                  0x4
-#define MBA_MAX_MBPS                   U32_MAX
 #define MAX_MBA_BW_AMD                 0x800
 #define MBM_CNTR_WIDTH_OFFSET_AMD      20
 
index 4ee26264ecfcd1f2493414f8471d56322d11702a..f7ebd019e7a51710756e28951474a402681b8dca 100644 (file)
@@ -1889,6 +1889,30 @@ void rdt_domain_reconfigure_cdp(struct rdt_resource *r)
                l3_qos_cfg_update(&hw_res->cdp_enabled);
 }
 
+static int mba_sc_domain_allocate(struct rdt_resource *r, struct rdt_domain *d)
+{
+       u32 num_closid = resctrl_arch_get_num_closid(r);
+       int cpu = cpumask_any(&d->cpu_mask);
+       int i;
+
+       d->mbps_val = kcalloc_node(num_closid, sizeof(*d->mbps_val),
+                                  GFP_KERNEL, cpu_to_node(cpu));
+       if (!d->mbps_val)
+               return -ENOMEM;
+
+       for (i = 0; i < num_closid; i++)
+               d->mbps_val[i] = MBA_MAX_MBPS;
+
+       return 0;
+}
+
+static void mba_sc_domain_destroy(struct rdt_resource *r,
+                                 struct rdt_domain *d)
+{
+       kfree(d->mbps_val);
+       d->mbps_val = NULL;
+}
+
 /*
  * MBA software controller is supported only if
  * MBM is supported and MBA is in linear scale.
@@ -1908,12 +1932,20 @@ static bool supports_mba_mbps(void)
 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_domain *d;
+       int i;
 
        if (!supports_mba_mbps() || mba_sc == is_mba_sc(r))
                return -EINVAL;
 
        r->membw.mba_sc = mba_sc;
 
+       list_for_each_entry(d, &r->domains, list) {
+               for (i = 0; i < num_closid; i++)
+                       d->mbps_val[i] = MBA_MAX_MBPS;
+       }
+
        return 0;
 }
 
@@ -3247,6 +3279,9 @@ void resctrl_offline_domain(struct rdt_resource *r, struct rdt_domain *d)
 {
        lockdep_assert_held(&rdtgroup_mutex);
 
+       if (supports_mba_mbps() && r->rid == RDT_RESOURCE_MBA)
+               mba_sc_domain_destroy(r, d);
+
        if (!r->mon_capable)
                return;
 
@@ -3311,6 +3346,10 @@ int resctrl_online_domain(struct rdt_resource *r, struct rdt_domain *d)
 
        lockdep_assert_held(&rdtgroup_mutex);
 
+       if (supports_mba_mbps() && r->rid == RDT_RESOURCE_MBA)
+               /* RDT_RESOURCE_MBA is never mon_capable */
+               return mba_sc_domain_allocate(r, d);
+
        if (!r->mon_capable)
                return 0;
 
index 5d283bdd616254a7085848e7c87adbb29157eed9..93dfe553b36493c76504e9583b666cb1bee0ffe0 100644 (file)
@@ -15,6 +15,9 @@ int proc_resctrl_show(struct seq_file *m,
 
 #endif
 
+/* max value for struct rdt_domain's mbps_val */
+#define MBA_MAX_MBPS   U32_MAX
+
 /**
  * enum resctrl_conf_type - The type of configuration.
  * @CDP_NONE:  No prioritisation, both code and data are controlled or monitored.
@@ -53,6 +56,9 @@ struct resctrl_staged_config {
  * @cqm_work_cpu:      worker CPU for CQM h/w counters
  * @plr:               pseudo-locked region (if any) associated with domain
  * @staged_config:     parsed configuration to be applied
+ * @mbps_val:          When mba_sc is enabled, this holds the array of user
+ *                     specified control values for mba_sc in MBps, indexed
+ *                     by closid
  */
 struct rdt_domain {
        struct list_head                list;
@@ -67,6 +73,7 @@ struct rdt_domain {
        int                             cqm_work_cpu;
        struct pseudo_lock_region       *plr;
        struct resctrl_staged_config    staged_config[CDP_NUM_TYPES];
+       u32                             *mbps_val;
 };
 
 /**