aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Shivappa <vikas.shivappa@linux.intel.com>2018-04-20 18:36:19 -0400
committerThomas Gleixner <tglx@linutronix.de>2018-05-19 07:16:44 -0400
commit8205a078ba7819c23558e31af4b3bda04d9b3bae (patch)
treeb3ff6b5b6c4a909365d215f01588ec0083eaecb8
parent1bd2a63b4f0deefe745aa0fd969c07b2eb9ee99e (diff)
x86/intel_rdt/mba_sc: Add schemata support
Currently when user updates the "schemata" with new MBA percentage values, kernel writes the corresponding bandwidth percentage values to the IA32_MBA_THRTL_MSR. When MBA is expressed in MBps, the schemata format is changed to have the per package memory bandwidth in MBps instead of being specified in percentage. Do not write the IA32_MBA_THRTL_MSRs when the schemata is updated as that is handled separately. Signed-off-by: Vikas Shivappa <vikas.shivappa@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: ravi.v.shankar@intel.com Cc: tony.luck@intel.com Cc: fenghua.yu@intel.com Cc: vikas.shivappa@intel.com Cc: ak@linux.intel.com Cc: hpa@zytor.com Link: https://lkml.kernel.org/r/1524263781-14267-5-git-send-email-vikas.shivappa@linux.intel.com
-rw-r--r--arch/x86/kernel/cpu/intel_rdt.c2
-rw-r--r--arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c24
2 files changed, 20 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c
index 8c09e9db2fc6..ad03d975883e 100644
--- a/arch/x86/kernel/cpu/intel_rdt.c
+++ b/arch/x86/kernel/cpu/intel_rdt.c
@@ -179,7 +179,7 @@ struct rdt_resource rdt_resources_all[] = {
179 .msr_update = mba_wrmsr, 179 .msr_update = mba_wrmsr,
180 .cache_level = 3, 180 .cache_level = 3,
181 .parse_ctrlval = parse_bw, 181 .parse_ctrlval = parse_bw,
182 .format_str = "%d=%*d", 182 .format_str = "%d=%*u",
183 .fflags = RFTYPE_RES_MB, 183 .fflags = RFTYPE_RES_MB,
184 }, 184 },
185}; 185};
diff --git a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c
index 23e1d5c249c6..116d57b248d3 100644
--- a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c
+++ b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c
@@ -53,7 +53,8 @@ static bool bw_validate(char *buf, unsigned long *data, struct rdt_resource *r)
53 return false; 53 return false;
54 } 54 }
55 55
56 if (bw < r->membw.min_bw || bw > r->default_ctrl) { 56 if ((bw < r->membw.min_bw || bw > r->default_ctrl) &&
57 !is_mba_sc(r)) {
57 rdt_last_cmd_printf("MB value %ld out of range [%d,%d]\n", bw, 58 rdt_last_cmd_printf("MB value %ld out of range [%d,%d]\n", bw,
58 r->membw.min_bw, r->default_ctrl); 59 r->membw.min_bw, r->default_ctrl);
59 return false; 60 return false;
@@ -179,6 +180,8 @@ static int update_domains(struct rdt_resource *r, int closid)
179 struct msr_param msr_param; 180 struct msr_param msr_param;
180 cpumask_var_t cpu_mask; 181 cpumask_var_t cpu_mask;
181 struct rdt_domain *d; 182 struct rdt_domain *d;
183 bool mba_sc;
184 u32 *dc;
182 int cpu; 185 int cpu;
183 186
184 if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL)) 187 if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL))
@@ -188,13 +191,20 @@ static int update_domains(struct rdt_resource *r, int closid)
188 msr_param.high = msr_param.low + 1; 191 msr_param.high = msr_param.low + 1;
189 msr_param.res = r; 192 msr_param.res = r;
190 193
194 mba_sc = is_mba_sc(r);
191 list_for_each_entry(d, &r->domains, list) { 195 list_for_each_entry(d, &r->domains, list) {
192 if (d->have_new_ctrl && d->new_ctrl != d->ctrl_val[closid]) { 196 dc = !mba_sc ? d->ctrl_val : d->mbps_val;
197 if (d->have_new_ctrl && d->new_ctrl != dc[closid]) {
193 cpumask_set_cpu(cpumask_any(&d->cpu_mask), cpu_mask); 198 cpumask_set_cpu(cpumask_any(&d->cpu_mask), cpu_mask);
194 d->ctrl_val[closid] = d->new_ctrl; 199 dc[closid] = d->new_ctrl;
195 } 200 }
196 } 201 }
197 if (cpumask_empty(cpu_mask)) 202
203 /*
204 * Avoid writing the control msr with control values when
205 * MBA software controller is enabled
206 */
207 if (cpumask_empty(cpu_mask) || mba_sc)
198 goto done; 208 goto done;
199 cpu = get_cpu(); 209 cpu = get_cpu();
200 /* Update CBM on this cpu if it's in cpu_mask. */ 210 /* Update CBM on this cpu if it's in cpu_mask. */
@@ -282,13 +292,17 @@ static void show_doms(struct seq_file *s, struct rdt_resource *r, int closid)
282{ 292{
283 struct rdt_domain *dom; 293 struct rdt_domain *dom;
284 bool sep = false; 294 bool sep = false;
295 u32 ctrl_val;
285 296
286 seq_printf(s, "%*s:", max_name_width, r->name); 297 seq_printf(s, "%*s:", max_name_width, r->name);
287 list_for_each_entry(dom, &r->domains, list) { 298 list_for_each_entry(dom, &r->domains, list) {
288 if (sep) 299 if (sep)
289 seq_puts(s, ";"); 300 seq_puts(s, ";");
301
302 ctrl_val = (!is_mba_sc(r) ? dom->ctrl_val[closid] :
303 dom->mbps_val[closid]);
290 seq_printf(s, r->format_str, dom->id, max_data_width, 304 seq_printf(s, r->format_str, dom->id, max_data_width,
291 dom->ctrl_val[closid]); 305 ctrl_val);
292 sep = true; 306 sep = true;
293 } 307 }
294 seq_puts(s, "\n"); 308 seq_puts(s, "\n");