diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c')
-rw-r--r-- | arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c | 24 |
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"); |