diff options
-rw-r--r-- | arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 19 |
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 | */ |
2461 | static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp) | 2461 | static 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) |