|
@@ -2460,14 +2460,16 @@ static void cbm_ensure_valid(u32 *_val, struct rdt_resource *r)
|
|
|
*/
|
|
|
static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
|
|
{
|
|
|
+ struct rdt_resource *r_cdp = NULL;
|
|
|
+ struct rdt_domain *d_cdp = NULL;
|
|
|
u32 used_b = 0, unused_b = 0;
|
|
|
u32 closid = rdtgrp->closid;
|
|
|
struct rdt_resource *r;
|
|
|
unsigned long tmp_cbm;
|
|
|
enum rdtgrp_mode mode;
|
|
|
struct rdt_domain *d;
|
|
|
+ u32 peer_ctl, *ctrl;
|
|
|
int i, ret;
|
|
|
- u32 *ctrl;
|
|
|
|
|
|
for_each_alloc_enabled_rdt_resource(r) {
|
|
|
/*
|
|
@@ -2477,6 +2479,7 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
|
|
if (r->rid == RDT_RESOURCE_MBA)
|
|
|
continue;
|
|
|
list_for_each_entry(d, &r->domains, list) {
|
|
|
+ rdt_cdp_peer_get(r, d, &r_cdp, &d_cdp);
|
|
|
d->have_new_ctrl = false;
|
|
|
d->new_ctrl = r->cache.shareable_bits;
|
|
|
used_b = r->cache.shareable_bits;
|
|
@@ -2486,9 +2489,19 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
|
|
mode = rdtgroup_mode_by_closid(i);
|
|
|
if (mode == RDT_MODE_PSEUDO_LOCKSETUP)
|
|
|
break;
|
|
|
- used_b |= *ctrl;
|
|
|
+ /*
|
|
|
+ * If CDP is active include peer
|
|
|
+ * domain's usage to ensure there
|
|
|
+ * is no overlap with an exclusive
|
|
|
+ * group.
|
|
|
+ */
|
|
|
+ if (d_cdp)
|
|
|
+ peer_ctl = d_cdp->ctrl_val[i];
|
|
|
+ else
|
|
|
+ peer_ctl = 0;
|
|
|
+ used_b |= *ctrl | peer_ctl;
|
|
|
if (mode == RDT_MODE_SHAREABLE)
|
|
|
- d->new_ctrl |= *ctrl;
|
|
|
+ d->new_ctrl |= *ctrl | peer_ctl;
|
|
|
}
|
|
|
}
|
|
|
if (d->plr && d->plr->cbm > 0)
|