aboutsummaryrefslogtreecommitdiff
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorJames Morse2021-07-28 17:06:20 +0000
committerBorislav Petkov2021-08-11 15:24:27 +0200
commit3183e87c1b797caaeb208b01c99bea8140273a16 (patch)
treeca8c7c1adcaea62aa75c237dd36c9c020bf3b2df /arch/x86/kernel
parent331ebe4c43496cdc7f8d9a32d4ef59300b748435 (diff)
x86/resctrl: Store the effective num_closid in the schema
Struct resctrl_schema holds properties that vary with the style of configuration that resctrl applies to a resource. There are already two values for the hardware's num_closid, depending on whether the architecture presents the L3 or L3CODE/L3DATA resources. As the way CDP changes the number of control groups that resctrl can create is part of the user-space interface, it should be managed by the filesystem parts of resctrl. This allows the architecture code to only describe the value the hardware supports. Add num_closid to resctrl_schema. This is the value seen by the filesystem, which may be different to the maximum value described by the arch code when CDP is enabled. These functions operate on the num_closid value that is exposed to user-space: * rdtgroup_parse_resource() * rdtgroup_schemata_show() * rdt_num_closids_show() * closid_init() Change them to use the schema value instead. schemata_list_create() sets this value, and reaches into the architecture-specific structure to get the value. This will eventually be replaced with a helper. Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Jamie Iles <jamie@nuviainc.com> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Tested-by: Babu Moger <babu.moger@amd.com> Link: https://lkml.kernel.org/r/20210728170637.25610-8-james.morse@arm.com
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/cpu/resctrl/ctrlmondata.c9
-rw-r--r--arch/x86/kernel/cpu/resctrl/rdtgroup.c13
2 files changed, 7 insertions, 15 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
index 405b99d31ef9..d10fddaef5f4 100644
--- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
+++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
@@ -286,14 +286,12 @@ done:
static int rdtgroup_parse_resource(char *resname, char *tok,
struct rdtgroup *rdtgrp)
{
- struct rdt_hw_resource *hw_res;
struct resctrl_schema *s;
struct rdt_resource *r;
list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res;
- hw_res = resctrl_to_arch_res(s->res);
- if (!strcmp(resname, r->name) && rdtgrp->closid < hw_res->num_closid)
+ if (!strcmp(resname, r->name) && rdtgrp->closid < s->num_closid)
return parse_line(tok, r, rdtgrp);
}
rdt_last_cmd_printf("Unknown or unsupported resource name '%s'\n", resname);
@@ -404,7 +402,6 @@ static void show_doms(struct seq_file *s, struct rdt_resource *r, int closid)
int rdtgroup_schemata_show(struct kernfs_open_file *of,
struct seq_file *s, void *v)
{
- struct rdt_hw_resource *hw_res;
struct resctrl_schema *schema;
struct rdtgroup *rdtgrp;
struct rdt_resource *r;
@@ -432,8 +429,8 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
} else {
closid = rdtgrp->closid;
list_for_each_entry(schema, &resctrl_schema_all, list) {
- hw_res = resctrl_to_arch_res(schema->res);
- if (closid < hw_res->num_closid)
+ r = schema->res;
+ if (closid < schema->num_closid)
show_doms(s, r, closid);
}
}
diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index 7502b7de3916..2f29b7d7d602 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -103,15 +103,12 @@ int closids_supported(void)
static void closid_init(void)
{
- struct rdt_hw_resource *hw_res;
struct resctrl_schema *s;
int rdt_min_closid = 32;
/* Compute rdt_min_closid across all resources */
- list_for_each_entry(s, &resctrl_schema_all, list) {
- hw_res = resctrl_to_arch_res(s->res);
- rdt_min_closid = min(rdt_min_closid, hw_res->num_closid);
- }
+ list_for_each_entry(s, &resctrl_schema_all, list)
+ rdt_min_closid = min(rdt_min_closid, s->num_closid);
closid_free_map = BIT_MASK(rdt_min_closid) - 1;
@@ -849,11 +846,8 @@ static int rdt_num_closids_show(struct kernfs_open_file *of,
struct seq_file *seq, void *v)
{
struct resctrl_schema *s = of->kn->parent->priv;
- struct rdt_resource *r = s->res;
- struct rdt_hw_resource *hw_res;
- hw_res = resctrl_to_arch_res(r);
- seq_printf(seq, "%d\n", hw_res->num_closid);
+ seq_printf(seq, "%u\n", s->num_closid);
return 0;
}
@@ -2140,6 +2134,7 @@ static int schemata_list_create(void)
s->res = r;
s->conf_type = resctrl_to_arch_res(r)->conf_type;
+ s->num_closid = resctrl_to_arch_res(r)->num_closid;
INIT_LIST_HEAD(&s->list);
list_add(&s->list, &resctrl_schema_all);