aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c')
-rw-r--r--arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c24
1 files changed, 19 insertions, 5 deletions
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");