x86/intel_rdt/mba: Add info directory files for Memory Bandwidth Allocation
authorVikas Shivappa <vikas.shivappa@linux.intel.com>
Sat, 8 Apr 2017 00:33:55 +0000 (17:33 -0700)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 14 Apr 2017 14:10:08 +0000 (16:10 +0200)
The files in the info directory for MBA are as follows:

 num_closids
  The maximum number of CLOSids available for MBA

 min_bandwidth
  The minimum memory bandwidth percentage value

 bandwidth_gran
  The granularity of the bandwidth control in percent for the
particular CPU SKU. Intermediate values entered are rounded off
to the previous control step available. Available bandwidth
control steps are minimum_bandwidth + N * bandwidth_gran.

 delay_linear
  When set, the OS writes a linear percentage based value to the
control MSRs ranging from minimum_bandwidth to 100 percent.

This value is informational and has no influence on the values
written to the schemata files. The values written to the
schemata are always bandwidth percentage that is requested.

Signed-off-by: Vikas Shivappa <vikas.shivappa@linux.intel.com>
Cc: ravi.v.shankar@intel.com
Cc: tony.luck@intel.com
Cc: fenghua.yu@intel.com
Cc: vikas.shivappa@intel.com
Link: http://lkml.kernel.org/r/1491611637-20417-7-git-send-email-vikas.shivappa@linux.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/intel_rdt.h
arch/x86/kernel/cpu/intel_rdt.c
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c

index b0f0a600c7391a964b8ca771ed1b11593d27a06a..167fe10f00b928ac3a9090f61c827631a0a9ec06 100644 (file)
@@ -174,6 +174,7 @@ struct rdt_resource {
 };
 
 void rdt_get_cache_infofile(struct rdt_resource *r);
+void rdt_get_mba_infofile(struct rdt_resource *r);
 
 extern struct mutex rdtgroup_mutex;
 
index b387e04885becbb31f152157b97e13fbe6bd9900..438efefd686250ff5a2bfa39e1c3f4afe5c7d1ca 100644 (file)
@@ -203,6 +203,7 @@ static bool rdt_get_mem_config(struct rdt_resource *r)
                        return false;
        }
        r->data_width = 3;
+       rdt_get_mba_infofile(r);
 
        r->capable = true;
        r->enabled = true;
index 65d957b965671a1418002724d488af4b8fc79e6d..f5af0cc7eb0d18bc9f52177c182d73500e7f3e7f 100644 (file)
@@ -515,7 +515,6 @@ static int rdt_num_closids_show(struct kernfs_open_file *of,
        struct rdt_resource *r = of->kn->parent->priv;
 
        seq_printf(seq, "%d\n", r->num_closid);
-
        return 0;
 }
 
@@ -525,7 +524,6 @@ static int rdt_default_ctrl_show(struct kernfs_open_file *of,
        struct rdt_resource *r = of->kn->parent->priv;
 
        seq_printf(seq, "%x\n", r->default_ctrl);
-
        return 0;
 }
 
@@ -535,7 +533,33 @@ static int rdt_min_cbm_bits_show(struct kernfs_open_file *of,
        struct rdt_resource *r = of->kn->parent->priv;
 
        seq_printf(seq, "%u\n", r->cache.min_cbm_bits);
+       return 0;
+}
+
+static int rdt_min_bw_show(struct kernfs_open_file *of,
+                            struct seq_file *seq, void *v)
+{
+       struct rdt_resource *r = of->kn->parent->priv;
 
+       seq_printf(seq, "%u\n", r->membw.min_bw);
+       return 0;
+}
+
+static int rdt_bw_gran_show(struct kernfs_open_file *of,
+                            struct seq_file *seq, void *v)
+{
+       struct rdt_resource *r = of->kn->parent->priv;
+
+       seq_printf(seq, "%u\n", r->membw.bw_gran);
+       return 0;
+}
+
+static int rdt_delay_linear_show(struct kernfs_open_file *of,
+                            struct seq_file *seq, void *v)
+{
+       struct rdt_resource *r = of->kn->parent->priv;
+
+       seq_printf(seq, "%u\n", r->membw.delay_linear);
        return 0;
 }
 
@@ -561,6 +585,40 @@ static struct rftype res_cache_info_files[] = {
        },
 };
 
+/* rdtgroup information files for memory bandwidth. */
+static struct rftype res_mba_info_files[] = {
+       {
+               .name           = "num_closids",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = rdt_num_closids_show,
+       },
+       {
+               .name           = "min_bandwidth",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = rdt_min_bw_show,
+       },
+       {
+               .name           = "bandwidth_gran",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = rdt_bw_gran_show,
+       },
+       {
+               .name           = "delay_linear",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = rdt_delay_linear_show,
+       },
+};
+
+void rdt_get_mba_infofile(struct rdt_resource *r)
+{
+       r->info_files = res_mba_info_files;
+       r->nr_info_files = ARRAY_SIZE(res_mba_info_files);
+}
+
 void rdt_get_cache_infofile(struct rdt_resource *r)
 {
        r->info_files = res_cache_info_files;