[PATCH 06/24] x86/resctrl: Store the effective num_closid in the schema

From: James Morse
Date: Fri Oct 30 2020 - 12:12:36 EST


resctrl_schema holds properties that vary with the style of configuration
that resctrl applies to a resource.

Once the arch code has a single resource per cache that can be configured,
resctrl will need to keep track of the num_closid itself.

Add num_closid to resctrl_schema. Change callers like
rdtgroup_schemata_show() to walk the schema instead.

Signed-off-by: James Morse <james.morse@xxxxxxx>
---
arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 13 ++++++++-----
arch/x86/kernel/cpu/resctrl/rdtgroup.c | 11 +++++------
include/linux/resctrl.h | 2 ++
3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
index 14ea6a40993f..8ac104c634fe 100644
--- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
+++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
@@ -286,11 +286,12 @@ int update_domains(struct rdt_resource *r, int closid)
static int rdtgroup_parse_resource(char *resname, char *tok,
struct rdtgroup *rdtgrp)
{
+ struct resctrl_schema *s;
struct rdt_resource *r;

- for_each_alloc_enabled_rdt_resource(r) {
- if (!strcmp(resname, r->name) &&
- rdtgrp->closid < resctrl_arch_get_num_closid(r))
+ list_for_each_entry(s, &resctrl_all_schema, list) {
+ r = s->res;
+ 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);
@@ -399,6 +400,7 @@ 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 resctrl_schema *schema;
struct rdtgroup *rdtgrp;
struct rdt_resource *r;
int ret = 0;
@@ -422,8 +424,9 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
}
} else {
closid = rdtgrp->closid;
- for_each_alloc_enabled_rdt_resource(r) {
- if (closid < resctrl_arch_get_num_closid(r))
+ list_for_each_entry(schema, &resctrl_all_schema, list) {
+ 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 cb16454a6b0e..1bd785b1920c 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -103,13 +103,12 @@ int closids_supported(void)

static void closid_init(void)
{
+ struct resctrl_schema *s;
u32 rdt_min_closid = 32;
- struct rdt_resource *r;

/* Compute rdt_min_closid across all resources */
- for_each_alloc_enabled_rdt_resource(r)
- rdt_min_closid = min(rdt_min_closid,
- resctrl_arch_get_num_closid(r));
+ list_for_each_entry(s, &resctrl_all_schema, list)
+ rdt_min_closid = min(rdt_min_closid, s->num_closid);

closid_free_map = BIT_MASK(rdt_min_closid) - 1;

@@ -848,9 +847,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;

- seq_printf(seq, "%d\n", resctrl_arch_get_num_closid(r));
+ seq_printf(seq, "%d\n", s->num_closid);
return 0;
}

@@ -2142,6 +2140,7 @@ static int create_schemata_list(void)
return -ENOMEM;

s->res = r;
+ s->num_closid = resctrl_arch_get_num_closid(r);

INIT_LIST_HEAD(&s->list);
list_add(&s->list, &resctrl_all_schema);
diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
index de6cbc725753..b32152968bca 100644
--- a/include/linux/resctrl.h
+++ b/include/linux/resctrl.h
@@ -166,10 +166,12 @@ struct rdt_resource {
/**
* @list: Member of resctrl's schema list
* @res: The rdt_resource for this entry
+ * @num_closid Number of CLOSIDs available for this resource
*/
struct resctrl_schema {
struct list_head list;
struct rdt_resource *res;
+ u32 num_closid;
};

/* The number of closid supported by this resource regardless of CDP */
--
2.28.0