|
@@ -974,9 +974,10 @@ bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
ctrl = d->ctrl_val;
|
|
|
for (i = 0; i < r->num_closid; i++, ctrl++) {
|
|
|
ctrl_b = (unsigned long *)ctrl;
|
|
|
- if (closid_allocated(i) && i != closid) {
|
|
|
+ mode = rdtgroup_mode_by_closid(i);
|
|
|
+ if (closid_allocated(i) && i != closid &&
|
|
|
+ mode != RDT_MODE_PSEUDO_LOCKSETUP) {
|
|
|
if (bitmap_intersects(cbm, ctrl_b, r->cache.cbm_len)) {
|
|
|
- mode = rdtgroup_mode_by_closid(i);
|
|
|
if (exclusive) {
|
|
|
if (mode == RDT_MODE_EXCLUSIVE)
|
|
|
return true;
|
|
@@ -1046,10 +1047,24 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
|
|
|
mode = rdtgrp->mode;
|
|
|
|
|
|
if ((!strcmp(buf, "shareable") && mode == RDT_MODE_SHAREABLE) ||
|
|
|
- (!strcmp(buf, "exclusive") && mode == RDT_MODE_EXCLUSIVE))
|
|
|
+ (!strcmp(buf, "exclusive") && mode == RDT_MODE_EXCLUSIVE) ||
|
|
|
+ (!strcmp(buf, "pseudo-locksetup") &&
|
|
|
+ mode == RDT_MODE_PSEUDO_LOCKSETUP) ||
|
|
|
+ (!strcmp(buf, "pseudo-locked") && mode == RDT_MODE_PSEUDO_LOCKED))
|
|
|
goto out;
|
|
|
|
|
|
+ if (mode == RDT_MODE_PSEUDO_LOCKED) {
|
|
|
+ rdt_last_cmd_printf("cannot change pseudo-locked group\n");
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
if (!strcmp(buf, "shareable")) {
|
|
|
+ if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
|
|
+ ret = rdtgroup_locksetup_exit(rdtgrp);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
rdtgrp->mode = RDT_MODE_SHAREABLE;
|
|
|
} else if (!strcmp(buf, "exclusive")) {
|
|
|
if (!rdtgroup_mode_test_exclusive(rdtgrp)) {
|
|
@@ -1057,7 +1072,17 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
|
+ if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
|
|
+ ret = rdtgroup_locksetup_exit(rdtgrp);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
rdtgrp->mode = RDT_MODE_EXCLUSIVE;
|
|
|
+ } else if (!strcmp(buf, "pseudo-locksetup")) {
|
|
|
+ ret = rdtgroup_locksetup_enter(rdtgrp);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ rdtgrp->mode = RDT_MODE_PSEUDO_LOCKSETUP;
|
|
|
} else {
|
|
|
rdt_last_cmd_printf("unknown/unsupported mode\n");
|
|
|
ret = -EINVAL;
|
|
@@ -1127,8 +1152,12 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
|
|
|
list_for_each_entry(d, &r->domains, list) {
|
|
|
if (sep)
|
|
|
seq_putc(s, ';');
|
|
|
- cbm = d->ctrl_val[rdtgrp->closid];
|
|
|
- size = rdtgroup_cbm_to_size(r, d, cbm);
|
|
|
+ if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
|
|
+ size = 0;
|
|
|
+ } else {
|
|
|
+ cbm = d->ctrl_val[rdtgrp->closid];
|
|
|
+ size = rdtgroup_cbm_to_size(r, d, cbm);
|
|
|
+ }
|
|
|
seq_printf(s, "%d=%u", d->id, size);
|
|
|
sep = true;
|
|
|
}
|
|
@@ -2277,6 +2306,8 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
|
|
for (i = 0; i < r->num_closid; i++, ctrl++) {
|
|
|
if (closid_allocated(i) && i != closid) {
|
|
|
mode = rdtgroup_mode_by_closid(i);
|
|
|
+ if (mode == RDT_MODE_PSEUDO_LOCKSETUP)
|
|
|
+ break;
|
|
|
used_b |= *ctrl;
|
|
|
if (mode == RDT_MODE_SHAREABLE)
|
|
|
d->new_ctrl |= *ctrl;
|