Commit 331ebe4c authored by James Morse's avatar James Morse Committed by Borislav Petkov

x86/resctrl: Walk the resctrl schema list instead of an arch list

When parsing a schema configuration value from user-space, resctrl walks
the architectures rdt_resources_all[] array to find a matching struct
rdt_resource.

Once the CDP resources are merged there will be one resource in use
by two schemata. Anything walking rdt_resources_all[] on behalf of a
user-space request should walk the list of struct resctrl_schema
instead.

Change the users of for_each_alloc_enabled_rdt_resource() to walk the
schema instead. Schemata were only created for alloc_enabled resources
so these two lists are currently equivalent.

schemata_list_create() and rdt_kill_sb() are ignored. The first
creates the schema list, and will eventually loop over the resource
indexes using an arch helper to retrieve the resource. rdt_kill_sb()
will eventually make use of an arch 'reset everything' helper.

After the filesystem code is moved, rdtgroup_pseudo_locked_in_hierarchy()
remains part of the x86 specific hooks to support pseudo lock. This
code walks each domain, and still does this after the separate resources
are merged.
Signed-off-by: default avatarJames Morse <james.morse@arm.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarJamie Iles <jamie@nuviainc.com>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Tested-by: default avatarBabu Moger <babu.moger@amd.com>
Link: https://lkml.kernel.org/r/20210728170637.25610-7-james.morse@arm.com
parent 208ab168
...@@ -287,10 +287,12 @@ static int rdtgroup_parse_resource(char *resname, char *tok, ...@@ -287,10 +287,12 @@ static int rdtgroup_parse_resource(char *resname, char *tok,
struct rdtgroup *rdtgrp) struct rdtgroup *rdtgrp)
{ {
struct rdt_hw_resource *hw_res; struct rdt_hw_resource *hw_res;
struct resctrl_schema *s;
struct rdt_resource *r; struct rdt_resource *r;
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(s, &resctrl_schema_all, list) {
hw_res = resctrl_to_arch_res(r); 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 < hw_res->num_closid)
return parse_line(tok, r, rdtgrp); return parse_line(tok, r, rdtgrp);
} }
...@@ -301,6 +303,7 @@ static int rdtgroup_parse_resource(char *resname, char *tok, ...@@ -301,6 +303,7 @@ static int rdtgroup_parse_resource(char *resname, char *tok,
ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
char *buf, size_t nbytes, loff_t off) char *buf, size_t nbytes, loff_t off)
{ {
struct resctrl_schema *s;
struct rdtgroup *rdtgrp; struct rdtgroup *rdtgrp;
struct rdt_domain *dom; struct rdt_domain *dom;
struct rdt_resource *r; struct rdt_resource *r;
...@@ -331,8 +334,8 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, ...@@ -331,8 +334,8 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
goto out; goto out;
} }
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(s, &resctrl_schema_all, list) {
list_for_each_entry(dom, &r->domains, list) list_for_each_entry(dom, &s->res->domains, list)
dom->have_new_ctrl = false; dom->have_new_ctrl = false;
} }
...@@ -353,7 +356,8 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, ...@@ -353,7 +356,8 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
goto out; goto out;
} }
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res;
ret = update_domains(r, rdtgrp->closid); ret = update_domains(r, rdtgrp->closid);
if (ret) if (ret)
goto out; goto out;
...@@ -401,6 +405,7 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of, ...@@ -401,6 +405,7 @@ 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 rdt_hw_resource *hw_res;
struct resctrl_schema *schema;
struct rdtgroup *rdtgrp; struct rdtgroup *rdtgrp;
struct rdt_resource *r; struct rdt_resource *r;
int ret = 0; int ret = 0;
...@@ -409,8 +414,10 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of, ...@@ -409,8 +414,10 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
rdtgrp = rdtgroup_kn_lock_live(of->kn); rdtgrp = rdtgroup_kn_lock_live(of->kn);
if (rdtgrp) { if (rdtgrp) {
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
for_each_alloc_enabled_rdt_resource(r) list_for_each_entry(schema, &resctrl_schema_all, list) {
r = schema->res;
seq_printf(s, "%s:uninitialized\n", r->name); seq_printf(s, "%s:uninitialized\n", r->name);
}
} else if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { } else if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) {
if (!rdtgrp->plr->d) { if (!rdtgrp->plr->d) {
rdt_last_cmd_clear(); rdt_last_cmd_clear();
...@@ -424,8 +431,8 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of, ...@@ -424,8 +431,8 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
} }
} else { } else {
closid = rdtgrp->closid; closid = rdtgrp->closid;
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(schema, &resctrl_schema_all, list) {
hw_res = resctrl_to_arch_res(r); hw_res = resctrl_to_arch_res(schema->res);
if (closid < hw_res->num_closid) if (closid < hw_res->num_closid)
show_doms(s, r, closid); show_doms(s, r, closid);
} }
......
...@@ -104,12 +104,12 @@ int closids_supported(void) ...@@ -104,12 +104,12 @@ int closids_supported(void)
static void closid_init(void) static void closid_init(void)
{ {
struct rdt_hw_resource *hw_res; struct rdt_hw_resource *hw_res;
struct rdt_resource *r; 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 */
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(s, &resctrl_schema_all, list) {
hw_res = resctrl_to_arch_res(r); hw_res = resctrl_to_arch_res(s->res);
rdt_min_closid = min(rdt_min_closid, hw_res->num_closid); rdt_min_closid = min(rdt_min_closid, hw_res->num_closid);
} }
...@@ -1276,11 +1276,13 @@ static bool rdtgroup_mode_test_exclusive(struct rdtgroup *rdtgrp) ...@@ -1276,11 +1276,13 @@ static bool rdtgroup_mode_test_exclusive(struct rdtgroup *rdtgrp)
{ {
struct rdt_hw_domain *hw_dom; struct rdt_hw_domain *hw_dom;
int closid = rdtgrp->closid; int closid = rdtgrp->closid;
struct resctrl_schema *s;
struct rdt_resource *r; struct rdt_resource *r;
bool has_cache = false; bool has_cache = false;
struct rdt_domain *d; struct rdt_domain *d;
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res;
if (r->rid == RDT_RESOURCE_MBA) if (r->rid == RDT_RESOURCE_MBA)
continue; continue;
has_cache = true; has_cache = true;
...@@ -1418,6 +1420,7 @@ unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, ...@@ -1418,6 +1420,7 @@ unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r,
static int rdtgroup_size_show(struct kernfs_open_file *of, static int rdtgroup_size_show(struct kernfs_open_file *of,
struct seq_file *s, void *v) struct seq_file *s, void *v)
{ {
struct resctrl_schema *schema;
struct rdt_hw_domain *hw_dom; struct rdt_hw_domain *hw_dom;
struct rdtgroup *rdtgrp; struct rdtgroup *rdtgrp;
struct rdt_resource *r; struct rdt_resource *r;
...@@ -1449,7 +1452,8 @@ static int rdtgroup_size_show(struct kernfs_open_file *of, ...@@ -1449,7 +1452,8 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
goto out; goto out;
} }
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(schema, &resctrl_schema_all, list) {
r = schema->res;
sep = false; sep = false;
seq_printf(s, "%*s:", max_name_width, r->name); seq_printf(s, "%*s:", max_name_width, r->name);
list_for_each_entry(d, &r->domains, list) { list_for_each_entry(d, &r->domains, list) {
...@@ -2815,10 +2819,12 @@ static void rdtgroup_init_mba(struct rdt_resource *r) ...@@ -2815,10 +2819,12 @@ static void rdtgroup_init_mba(struct rdt_resource *r)
/* Initialize the RDT group's allocations. */ /* Initialize the RDT group's allocations. */
static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp) static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
{ {
struct resctrl_schema *s;
struct rdt_resource *r; struct rdt_resource *r;
int ret; int ret;
for_each_alloc_enabled_rdt_resource(r) { list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res;
if (r->rid == RDT_RESOURCE_MBA) { if (r->rid == RDT_RESOURCE_MBA) {
rdtgroup_init_mba(r); rdtgroup_init_mba(r);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment