x86/intel_rdt: Show bitmask of shareable resource with other executing units
authorFenghua Yu <fenghua.yu@intel.com>
Tue, 25 Jul 2017 22:39:04 +0000 (15:39 -0700)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 1 Aug 2017 20:41:30 +0000 (22:41 +0200)
CPUID.(EAX=0x10, ECX=res#):EBX[31:0] reports a bit mask for a resource.
Each set bit within the length of the CBM indicates the corresponding
unit of the resource allocation may be used by other entities in the
platform (e.g. an integrated graphics engine or hardware units outside
the processor core and have direct access to the resource). Each
cleared bit within the length of the CBM indicates the corresponding
allocation unit can be configured to implement a priority-based
allocation scheme without interference with other hardware agents in
the system. Bits outside the length of the CBM are reserved.

More details on the bit mask are described in x86 Software Developer's
Manual.

The bitmask is shown in "info" directory for each resource. It's
up to user to decide how to use the bitmask within a CBM in a partition
to share or isolate a resource with other executing units.

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: ravi.v.shankar@intel.com
Cc: peterz@infradead.org
Cc: eranian@google.com
Cc: ak@linux.intel.com
Cc: davidcc@google.com
Cc: vikas.shivappa@linux.intel.com
Link: http://lkml.kernel.org/r/20170725223904.12996-1-tony.luck@intel.com
Documentation/x86/intel_rdt_ui.txt
arch/x86/kernel/cpu/intel_rdt.c
arch/x86/kernel/cpu/intel_rdt.h
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c

index 76f21e2ac1761dc09f1a2a0cbc99d29110c53691..4d8848e4e224a8eb8207c8fb7469be57340f1671 100644 (file)
@@ -48,6 +48,13 @@ related to allocation:
 "min_cbm_bits":        The minimum number of consecutive bits which
                        must be set when writing a mask.
 
+"shareable_bits":      Bitmask of shareable resource with other executing
+                       entities (e.g. I/O). User can use this when
+                       setting up exclusive cache partitions. Note that
+                       some platforms support devices that have their
+                       own settings for cache use which can over-ride
+                       these bits.
+
 Memory bandwitdh(MB) subdirectory contains the following files
 with respect to allocation:
 
index de26aa7971d49a030f712d607213ad888ef24bb9..da4f3898d51708821564c126547ffbbff6c6c41e 100644 (file)
@@ -193,6 +193,7 @@ static inline bool cache_alloc_hsw_probe(void)
                r->num_closid = 4;
                r->default_ctrl = max_cbm;
                r->cache.cbm_len = 20;
+               r->cache.shareable_bits = 0xc0000;
                r->cache.min_cbm_bits = 2;
                r->alloc_capable = true;
                r->alloc_enabled = true;
@@ -260,6 +261,7 @@ static void rdt_get_cache_alloc_cfg(int idx, struct rdt_resource *r)
        r->num_closid = edx.split.cos_max + 1;
        r->cache.cbm_len = eax.split.cbm_len + 1;
        r->default_ctrl = BIT_MASK(eax.split.cbm_len + 1) - 1;
+       r->cache.shareable_bits = ebx & r->default_ctrl;
        r->data_width = (r->cache.cbm_len + 3) / 4;
        r->alloc_capable = true;
        r->alloc_enabled = true;
index 94e488af082e7b73eb54ad016943dc0ffe7a0bd5..4040bf1a075cf3b37f31a024be1a7b476020a018 100644 (file)
@@ -227,12 +227,15 @@ struct msr_param {
  * @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
  */
 struct rdt_cache {
        unsigned int    cbm_len;
        unsigned int    min_cbm_bits;
        unsigned int    cbm_idx_mult;
        unsigned int    cbm_idx_offset;
+       unsigned int    shareable_bits;
 };
 
 /**
index c24dd067b9c5a2bde9b948146fcd9f4e1fda40c7..2621ae3f07fcfb931257694abe36780668eaffa6 100644 (file)
@@ -596,6 +596,15 @@ static int rdt_min_cbm_bits_show(struct kernfs_open_file *of,
        return 0;
 }
 
+static int rdt_shareable_bits_show(struct kernfs_open_file *of,
+                                  struct seq_file *seq, void *v)
+{
+       struct rdt_resource *r = of->kn->parent->priv;
+
+       seq_printf(seq, "%x\n", r->cache.shareable_bits);
+       return 0;
+}
+
 static int rdt_min_bw_show(struct kernfs_open_file *of,
                             struct seq_file *seq, void *v)
 {
@@ -711,6 +720,13 @@ static struct rftype res_common_files[] = {
                .seq_show       = rdt_min_cbm_bits_show,
                .fflags         = RF_CTRL_INFO | RFTYPE_RES_CACHE,
        },
+       {
+               .name           = "shareable_bits",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = rdt_shareable_bits_show,
+               .fflags         = RF_CTRL_INFO | RFTYPE_RES_CACHE,
+       },
        {
                .name           = "min_bandwidth",
                .mode           = 0444,