Skip to content

Commit 939b90b

Browse files
rchatreKAGA-KOKO
authored andcommitted
x86/intel_rdt: Fix exclusive mode handling of MBA resource
It is possible for a resource group to consist out of MBA as well as CAT/CDP resources. The "exclusive" resource mode only applies to the CAT/CDP resources since MBA allocations cannot be specified to overlap or not. When a user requests a resource group to become "exclusive" then it can only be successful if there are CAT/CDP resources in the group and none of their CBMs associated with the group's CLOSID overlaps with any other resource group. Fix the "exclusive" mode setting by failing if there isn't any CAT/CDP resource in the group and ensuring that the CBM checking is only done on CAT/CDP resources. Fixes: 49f7b4e ("x86/intel_rdt: Enable setting of exclusive mode") Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: "H Peter Anvin" <hpa@zytor.com> Cc: "Tony Luck" <tony.luck@intel.com> Cc: "Xiaochen Shen" <xiaochen.shen@intel.com> Cc: "Chen Yu" <yu.c.chen@intel.com> Link: https://lkml.kernel.org/r/1537048707-76280-9-git-send-email-fenghua.yu@intel.com
1 parent f0df4e1 commit 939b90b

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

arch/x86/kernel/cpu/intel_rdt_rdtgroup.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,16 +1031,27 @@ static bool rdtgroup_mode_test_exclusive(struct rdtgroup *rdtgrp)
10311031
{
10321032
int closid = rdtgrp->closid;
10331033
struct rdt_resource *r;
1034+
bool has_cache = false;
10341035
struct rdt_domain *d;
10351036

10361037
for_each_alloc_enabled_rdt_resource(r) {
1038+
if (r->rid == RDT_RESOURCE_MBA)
1039+
continue;
1040+
has_cache = true;
10371041
list_for_each_entry(d, &r->domains, list) {
10381042
if (rdtgroup_cbm_overlaps(r, d, d->ctrl_val[closid],
1039-
rdtgrp->closid, false))
1043+
rdtgrp->closid, false)) {
1044+
rdt_last_cmd_puts("schemata overlaps\n");
10401045
return false;
1046+
}
10411047
}
10421048
}
10431049

1050+
if (!has_cache) {
1051+
rdt_last_cmd_puts("cannot be exclusive without CAT/CDP\n");
1052+
return false;
1053+
}
1054+
10441055
return true;
10451056
}
10461057

@@ -1092,7 +1103,6 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
10921103
rdtgrp->mode = RDT_MODE_SHAREABLE;
10931104
} else if (!strcmp(buf, "exclusive")) {
10941105
if (!rdtgroup_mode_test_exclusive(rdtgrp)) {
1095-
rdt_last_cmd_printf("schemata overlaps\n");
10961106
ret = -EINVAL;
10971107
goto out;
10981108
}

0 commit comments

Comments
 (0)