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
This commit is contained in:
James Morse 2021-07-28 17:06:20 +00:00 committed by Borislav Petkov
parent 331ebe4c43
commit 3183e87c1b
3 changed files with 11 additions and 15 deletions

View File

@ -286,14 +286,12 @@ done:
static int rdtgroup_parse_resource(char *resname, char *tok, static int rdtgroup_parse_resource(char *resname, char *tok,
struct rdtgroup *rdtgrp) struct rdtgroup *rdtgrp)
{ {
struct rdt_hw_resource *hw_res;
struct resctrl_schema *s; struct resctrl_schema *s;
struct rdt_resource *r; struct rdt_resource *r;
list_for_each_entry(s, &resctrl_schema_all, list) { list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res; r = s->res;
hw_res = resctrl_to_arch_res(s->res); if (!strcmp(resname, r->name) && rdtgrp->closid < s->num_closid)
if (!strcmp(resname, r->name) && rdtgrp->closid < hw_res->num_closid)
return parse_line(tok, r, rdtgrp); return parse_line(tok, r, rdtgrp);
} }
rdt_last_cmd_printf("Unknown or unsupported resource name '%s'\n", resname); 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, int rdtgroup_schemata_show(struct kernfs_open_file *of,
struct seq_file *s, void *v) struct seq_file *s, void *v)
{ {
struct rdt_hw_resource *hw_res;
struct resctrl_schema *schema; struct resctrl_schema *schema;
struct rdtgroup *rdtgrp; struct rdtgroup *rdtgrp;
struct rdt_resource *r; struct rdt_resource *r;
@ -432,8 +429,8 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
} else { } else {
closid = rdtgrp->closid; closid = rdtgrp->closid;
list_for_each_entry(schema, &resctrl_schema_all, list) { list_for_each_entry(schema, &resctrl_schema_all, list) {
hw_res = resctrl_to_arch_res(schema->res); r = schema->res;
if (closid < hw_res->num_closid) if (closid < schema->num_closid)
show_doms(s, r, closid); show_doms(s, r, closid);
} }
} }

View File

@ -103,15 +103,12 @@ int closids_supported(void)
static void closid_init(void) static void closid_init(void)
{ {
struct rdt_hw_resource *hw_res;
struct resctrl_schema *s; struct resctrl_schema *s;
int rdt_min_closid = 32; int rdt_min_closid = 32;
/* Compute rdt_min_closid across all resources */ /* Compute rdt_min_closid across all resources */
list_for_each_entry(s, &resctrl_schema_all, list) { list_for_each_entry(s, &resctrl_schema_all, list)
hw_res = resctrl_to_arch_res(s->res); rdt_min_closid = min(rdt_min_closid, s->num_closid);
rdt_min_closid = min(rdt_min_closid, hw_res->num_closid);
}
closid_free_map = BIT_MASK(rdt_min_closid) - 1; 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 seq_file *seq, void *v)
{ {
struct resctrl_schema *s = of->kn->parent->priv; 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, "%u\n", s->num_closid);
seq_printf(seq, "%d\n", hw_res->num_closid);
return 0; return 0;
} }
@ -2140,6 +2134,7 @@ static int schemata_list_create(void)
s->res = r; s->res = r;
s->conf_type = resctrl_to_arch_res(r)->conf_type; 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); INIT_LIST_HEAD(&s->list);
list_add(&s->list, &resctrl_schema_all); list_add(&s->list, &resctrl_schema_all);

View File

@ -172,10 +172,14 @@ struct rdt_resource {
* @conf_type: Whether this schema is specific to code/data. * @conf_type: Whether this schema is specific to code/data.
* @res: The resource structure exported by the architecture to describe * @res: The resource structure exported by the architecture to describe
* the hardware that is configured by this schema. * the hardware that is configured by this schema.
* @num_closid: The number of closid that can be used with this schema. When
* features like CDP are enabled, this will be lower than the
* hardware supports for the resource.
*/ */
struct resctrl_schema { struct resctrl_schema {
struct list_head list; struct list_head list;
enum resctrl_conf_type conf_type; enum resctrl_conf_type conf_type;
struct rdt_resource *res; struct rdt_resource *res;
int num_closid;
}; };
#endif /* _RESCTRL_H */ #endif /* _RESCTRL_H */