aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/cpu/intel_rdt_rdtgroup.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
index 49c479822844..dbc7fc98b60a 100644
--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
@@ -2460,14 +2460,16 @@ static void cbm_ensure_valid(u32 *_val, struct rdt_resource *r)
2460 */ 2460 */
2461static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp) 2461static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
2462{ 2462{
2463 struct rdt_resource *r_cdp = NULL;
2464 struct rdt_domain *d_cdp = NULL;
2463 u32 used_b = 0, unused_b = 0; 2465 u32 used_b = 0, unused_b = 0;
2464 u32 closid = rdtgrp->closid; 2466 u32 closid = rdtgrp->closid;
2465 struct rdt_resource *r; 2467 struct rdt_resource *r;
2466 unsigned long tmp_cbm; 2468 unsigned long tmp_cbm;
2467 enum rdtgrp_mode mode; 2469 enum rdtgrp_mode mode;
2468 struct rdt_domain *d; 2470 struct rdt_domain *d;
2471 u32 peer_ctl, *ctrl;
2469 int i, ret; 2472 int i, ret;
2470 u32 *ctrl;
2471 2473
2472 for_each_alloc_enabled_rdt_resource(r) { 2474 for_each_alloc_enabled_rdt_resource(r) {
2473 /* 2475 /*
@@ -2477,6 +2479,7 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
2477 if (r->rid == RDT_RESOURCE_MBA) 2479 if (r->rid == RDT_RESOURCE_MBA)
2478 continue; 2480 continue;
2479 list_for_each_entry(d, &r->domains, list) { 2481 list_for_each_entry(d, &r->domains, list) {
2482 rdt_cdp_peer_get(r, d, &r_cdp, &d_cdp);
2480 d->have_new_ctrl = false; 2483 d->have_new_ctrl = false;
2481 d->new_ctrl = r->cache.shareable_bits; 2484 d->new_ctrl = r->cache.shareable_bits;
2482 used_b = r->cache.shareable_bits; 2485 used_b = r->cache.shareable_bits;
@@ -2486,9 +2489,19 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
2486 mode = rdtgroup_mode_by_closid(i); 2489 mode = rdtgroup_mode_by_closid(i);
2487 if (mode == RDT_MODE_PSEUDO_LOCKSETUP) 2490 if (mode == RDT_MODE_PSEUDO_LOCKSETUP)
2488 break; 2491 break;
2489 used_b |= *ctrl; 2492 /*
2493 * If CDP is active include peer
2494 * domain's usage to ensure there
2495 * is no overlap with an exclusive
2496 * group.
2497 */
2498 if (d_cdp)
2499 peer_ctl = d_cdp->ctrl_val[i];
2500 else
2501 peer_ctl = 0;
2502 used_b |= *ctrl | peer_ctl;
2490 if (mode == RDT_MODE_SHAREABLE) 2503 if (mode == RDT_MODE_SHAREABLE)
2491 d->new_ctrl |= *ctrl; 2504 d->new_ctrl |= *ctrl | peer_ctl;
2492 } 2505 }
2493 } 2506 }
2494 if (d->plr && d->plr->cbm > 0) 2507 if (d->plr && d->plr->cbm > 0)