|
@@ -97,6 +97,12 @@ void rdt_last_cmd_printf(const char *fmt, ...)
|
|
|
* limited as the number of resources grows.
|
|
|
*/
|
|
|
static int closid_free_map;
|
|
|
+static int closid_free_map_len;
|
|
|
+
|
|
|
+int closids_supported(void)
|
|
|
+{
|
|
|
+ return closid_free_map_len;
|
|
|
+}
|
|
|
|
|
|
static void closid_init(void)
|
|
|
{
|
|
@@ -111,6 +117,7 @@ static void closid_init(void)
|
|
|
|
|
|
/* CLOSID 0 is always reserved for the default group */
|
|
|
closid_free_map &= ~1;
|
|
|
+ closid_free_map_len = rdt_min_closid;
|
|
|
}
|
|
|
|
|
|
static int closid_alloc(void)
|
|
@@ -802,7 +809,7 @@ static int rdt_bit_usage_show(struct kernfs_open_file *of,
|
|
|
sw_shareable = 0;
|
|
|
exclusive = 0;
|
|
|
seq_printf(seq, "%d=", dom->id);
|
|
|
- for (i = 0; i < r->num_closid; i++, ctrl++) {
|
|
|
+ for (i = 0; i < closids_supported(); i++, ctrl++) {
|
|
|
if (!closid_allocated(i))
|
|
|
continue;
|
|
|
mode = rdtgroup_mode_by_closid(i);
|
|
@@ -989,7 +996,7 @@ bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
|
|
|
/* Check for overlap with other resource groups */
|
|
|
ctrl = d->ctrl_val;
|
|
|
- for (i = 0; i < r->num_closid; i++, ctrl++) {
|
|
|
+ for (i = 0; i < closids_supported(); i++, ctrl++) {
|
|
|
ctrl_b = (unsigned long *)ctrl;
|
|
|
mode = rdtgroup_mode_by_closid(i);
|
|
|
if (closid_allocated(i) && i != closid &&
|
|
@@ -1024,16 +1031,27 @@ static bool rdtgroup_mode_test_exclusive(struct rdtgroup *rdtgrp)
|
|
|
{
|
|
|
int closid = rdtgrp->closid;
|
|
|
struct rdt_resource *r;
|
|
|
+ bool has_cache = false;
|
|
|
struct rdt_domain *d;
|
|
|
|
|
|
for_each_alloc_enabled_rdt_resource(r) {
|
|
|
+ if (r->rid == RDT_RESOURCE_MBA)
|
|
|
+ continue;
|
|
|
+ has_cache = true;
|
|
|
list_for_each_entry(d, &r->domains, list) {
|
|
|
if (rdtgroup_cbm_overlaps(r, d, d->ctrl_val[closid],
|
|
|
- rdtgrp->closid, false))
|
|
|
+ rdtgrp->closid, false)) {
|
|
|
+ rdt_last_cmd_puts("schemata overlaps\n");
|
|
|
return false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!has_cache) {
|
|
|
+ rdt_last_cmd_puts("cannot be exclusive without CAT/CDP\n");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1085,7 +1103,6 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
|
|
|
rdtgrp->mode = RDT_MODE_SHAREABLE;
|
|
|
} else if (!strcmp(buf, "exclusive")) {
|
|
|
if (!rdtgroup_mode_test_exclusive(rdtgrp)) {
|
|
|
- rdt_last_cmd_printf("schemata overlaps\n");
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
@@ -1155,8 +1172,8 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
|
|
|
struct rdt_resource *r;
|
|
|
struct rdt_domain *d;
|
|
|
unsigned int size;
|
|
|
- bool sep = false;
|
|
|
- u32 cbm;
|
|
|
+ bool sep;
|
|
|
+ u32 ctrl;
|
|
|
|
|
|
rdtgrp = rdtgroup_kn_lock_live(of->kn);
|
|
|
if (!rdtgrp) {
|
|
@@ -1174,6 +1191,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
|
|
|
}
|
|
|
|
|
|
for_each_alloc_enabled_rdt_resource(r) {
|
|
|
+ sep = false;
|
|
|
seq_printf(s, "%*s:", max_name_width, r->name);
|
|
|
list_for_each_entry(d, &r->domains, list) {
|
|
|
if (sep)
|
|
@@ -1181,8 +1199,13 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
|
|
|
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
|
|
size = 0;
|
|
|
} else {
|
|
|
- cbm = d->ctrl_val[rdtgrp->closid];
|
|
|
- size = rdtgroup_cbm_to_size(r, d, cbm);
|
|
|
+ ctrl = (!is_mba_sc(r) ?
|
|
|
+ d->ctrl_val[rdtgrp->closid] :
|
|
|
+ d->mbps_val[rdtgrp->closid]);
|
|
|
+ if (r->rid == RDT_RESOURCE_MBA)
|
|
|
+ size = ctrl;
|
|
|
+ else
|
|
|
+ size = rdtgroup_cbm_to_size(r, d, ctrl);
|
|
|
}
|
|
|
seq_printf(s, "%d=%u", d->id, size);
|
|
|
sep = true;
|
|
@@ -2336,12 +2359,18 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
|
|
u32 *ctrl;
|
|
|
|
|
|
for_each_alloc_enabled_rdt_resource(r) {
|
|
|
+ /*
|
|
|
+ * Only initialize default allocations for CBM cache
|
|
|
+ * resources
|
|
|
+ */
|
|
|
+ if (r->rid == RDT_RESOURCE_MBA)
|
|
|
+ continue;
|
|
|
list_for_each_entry(d, &r->domains, list) {
|
|
|
d->have_new_ctrl = false;
|
|
|
d->new_ctrl = r->cache.shareable_bits;
|
|
|
used_b = r->cache.shareable_bits;
|
|
|
ctrl = d->ctrl_val;
|
|
|
- for (i = 0; i < r->num_closid; i++, ctrl++) {
|
|
|
+ for (i = 0; i < closids_supported(); i++, ctrl++) {
|
|
|
if (closid_allocated(i) && i != closid) {
|
|
|
mode = rdtgroup_mode_by_closid(i);
|
|
|
if (mode == RDT_MODE_PSEUDO_LOCKSETUP)
|
|
@@ -2373,6 +2402,12 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
|
|
}
|
|
|
|
|
|
for_each_alloc_enabled_rdt_resource(r) {
|
|
|
+ /*
|
|
|
+ * Only initialize default allocations for CBM cache
|
|
|
+ * resources
|
|
|
+ */
|
|
|
+ if (r->rid == RDT_RESOURCE_MBA)
|
|
|
+ continue;
|
|
|
ret = update_domains(r, rdtgrp->closid);
|
|
|
if (ret < 0) {
|
|
|
rdt_last_cmd_puts("failed to initialize allocations\n");
|