x86/resctrl: Calculate the index from the configuration type
authorJames Morse <james.morse@arm.com>
Wed, 28 Jul 2021 17:06:33 +0000 (17:06 +0000)
committerBorislav Petkov <bp@suse.de>
Wed, 11 Aug 2021 16:19:06 +0000 (18:19 +0200)
resctrl uses cbm_idx() to map a closid to an index in the configuration
array. This is based on a multiplier and offset that are held in the
resource.

To merge the resources, the resctrl arch code needs to calculate the
index from something else, as there will only be one resource.

Decide based on the staged configuration type. This makes the static
mult and offset parameters redundant.

 [ bp: Remove superfluous brackets in get_config_index() ]

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Jamie Iles <jamie@nuviainc.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lkml.kernel.org/r/20210728170637.25610-21-james.morse@arm.com
arch/x86/kernel/cpu/resctrl/core.c
arch/x86/kernel/cpu/resctrl/ctrlmondata.c
include/linux/resctrl.h

index 990e41661b4aad7757c8cca2aefab31654e474e9..c6b953fe7fdfd62b6f5c5516ccdfd941162dfe0a 100644 (file)
@@ -69,8 +69,6 @@ struct rdt_hw_resource rdt_resources_all[] = {
                        .cache_level            = 3,
                        .cache = {
                                .min_cbm_bits   = 1,
-                               .cbm_idx_mult   = 1,
-                               .cbm_idx_offset = 0,
                        },
                        .domains                = domain_init(RDT_RESOURCE_L3),
                        .parse_ctrlval          = parse_cbm,
@@ -89,8 +87,6 @@ struct rdt_hw_resource rdt_resources_all[] = {
                        .cache_level            = 3,
                        .cache = {
                                .min_cbm_bits   = 1,
-                               .cbm_idx_mult   = 2,
-                               .cbm_idx_offset = 0,
                        },
                        .domains                = domain_init(RDT_RESOURCE_L3DATA),
                        .parse_ctrlval          = parse_cbm,
@@ -109,8 +105,6 @@ struct rdt_hw_resource rdt_resources_all[] = {
                        .cache_level            = 3,
                        .cache = {
                                .min_cbm_bits   = 1,
-                               .cbm_idx_mult   = 2,
-                               .cbm_idx_offset = 1,
                        },
                        .domains                = domain_init(RDT_RESOURCE_L3CODE),
                        .parse_ctrlval          = parse_cbm,
@@ -129,8 +123,6 @@ struct rdt_hw_resource rdt_resources_all[] = {
                        .cache_level            = 2,
                        .cache = {
                                .min_cbm_bits   = 1,
-                               .cbm_idx_mult   = 1,
-                               .cbm_idx_offset = 0,
                        },
                        .domains                = domain_init(RDT_RESOURCE_L2),
                        .parse_ctrlval          = parse_cbm,
@@ -149,8 +141,6 @@ struct rdt_hw_resource rdt_resources_all[] = {
                        .cache_level            = 2,
                        .cache = {
                                .min_cbm_bits   = 1,
-                               .cbm_idx_mult   = 2,
-                               .cbm_idx_offset = 0,
                        },
                        .domains                = domain_init(RDT_RESOURCE_L2DATA),
                        .parse_ctrlval          = parse_cbm,
@@ -169,8 +159,6 @@ struct rdt_hw_resource rdt_resources_all[] = {
                        .cache_level            = 2,
                        .cache = {
                                .min_cbm_bits   = 1,
-                               .cbm_idx_mult   = 2,
-                               .cbm_idx_offset = 1,
                        },
                        .domains                = domain_init(RDT_RESOURCE_L2CODE),
                        .parse_ctrlval          = parse_cbm,
index fdb0e11a78dc9b7342004448eb28b7a3c6822d9d..92d79c88b96548c074c7ffa995f56fed2d5964db 100644 (file)
@@ -246,12 +246,17 @@ next:
        return -EINVAL;
 }
 
-static u32 cbm_idx(struct rdt_resource *r, unsigned int closid)
+static u32 get_config_index(u32 closid, enum resctrl_conf_type type)
 {
-       if (r->rid == RDT_RESOURCE_MBA)
+       switch (type) {
+       default:
+       case CDP_NONE:
                return closid;
-
-       return closid * r->cache.cbm_idx_mult + r->cache.cbm_idx_offset;
+       case CDP_CODE:
+               return closid * 2 + 1;
+       case CDP_DATA:
+               return closid * 2;
+       }
 }
 
 static bool apply_config(struct rdt_hw_domain *hw_dom,
@@ -286,10 +291,6 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid)
        if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL))
                return -ENOMEM;
 
-       msr_param.low = cbm_idx(r, closid);
-       msr_param.high = msr_param.low + 1;
-       msr_param.res = r;
-
        mba_sc = is_mba_sc(r);
        list_for_each_entry(d, &r->domains, list) {
                hw_dom = resctrl_to_arch_dom(d);
@@ -298,9 +299,13 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid)
                        if (!cfg->have_new_ctrl)
                                continue;
 
-                       idx = cbm_idx(r, closid);
+                       idx = get_config_index(closid, t);
                        if (!apply_config(hw_dom, cfg, idx, cpu_mask, mba_sc))
                                continue;
+
+                       msr_param.low = idx;
+                       msr_param.high = msr_param.low + 1;
+                       msr_param.res = r;
                }
        }
 
@@ -420,7 +425,7 @@ void resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d,
                             u32 closid, enum resctrl_conf_type type, u32 *value)
 {
        struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d);
-       u32 idx = cbm_idx(r, closid);
+       u32 idx = get_config_index(closid, type);
 
        if (!is_mba_sc(r))
                *value = hw_dom->ctrl_val[idx];
index 69d7387b7f22ad285f00709bd5debec626a8f9e2..18dd764af0dd6039b27359f1ac28e0737771f8d4 100644 (file)
@@ -73,10 +73,6 @@ struct rdt_domain {
  * struct resctrl_cache - Cache allocation related data
  * @cbm_len:           Length of the cache bit mask
  * @min_cbm_bits:      Minimum number of consecutive bits to be set
- * @cbm_idx_mult:      Multiplier of CBM index
- * @cbm_idx_offset:    Offset of CBM index. CBM index is computed by:
- *                     closid * cbm_idx_multi + cbm_idx_offset
- *                     in a cache bit mask
  * @shareable_bits:    Bitmask of shareable resource with other
  *                     executing entities
  * @arch_has_sparse_bitmaps:   True if a bitmap like f00f is valid.
@@ -87,8 +83,6 @@ struct rdt_domain {
 struct resctrl_cache {
        unsigned int    cbm_len;
        unsigned int    min_cbm_bits;
-       unsigned int    cbm_idx_mult;   // TODO remove this
-       unsigned int    cbm_idx_offset; // TODO remove this
        unsigned int    shareable_bits;
        bool            arch_has_sparse_bitmaps;
        bool            arch_has_empty_bitmaps;