Skip to content

Commit

Permalink
x86/resctrl: Move the schemata names into struct resctrl_schema
Browse files Browse the repository at this point in the history
resctrl 'info' directories and schema parsing use the schema name.
This lives in the struct rdt_resource, and is specified by the
architecture code.

Once the CDP resources are merged, there will only be one resource (and
one name) in use by two schemata. To allow the CDP CODE/DATA property to
be the type of configuration the schema uses, the name should also be
per-schema.

Add a name field to struct resctrl_schema, and use this wherever
the schema name is exposed (or read from) user-space. Calculating
max_name_width for padding the schemata file also moves as this is
visible to user-space. As the names in struct rdt_resource already
include the CDP information, schemata_list_create() copies them.

schemata_list_create() includes the length of the CDP suffix when
calculating max_name_width in preparation for CDP resources being
merged.

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-13-james.morse@arm.com
  • Loading branch information
James Morse authored and Borislav Petkov committed Aug 11, 2021
1 parent c091e90 commit e198fde
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 16 deletions.
5 changes: 0 additions & 5 deletions arch/x86/kernel/cpu/resctrl/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -782,13 +782,8 @@ static int resctrl_offline_cpu(unsigned int cpu)
static __init void rdt_init_padding(void)
{
struct rdt_resource *r;
int cl;

for_each_alloc_capable_rdt_resource(r) {
cl = strlen(r->name);
if (cl > max_name_width)
max_name_width = cl;

if (r->data_width > max_data_width)
max_data_width = r->data_width;
}
Expand Down
10 changes: 3 additions & 7 deletions arch/x86/kernel/cpu/resctrl/ctrlmondata.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,11 +290,9 @@ static int rdtgroup_parse_resource(char *resname, char *tok,
struct rdtgroup *rdtgrp)
{
struct resctrl_schema *s;
struct rdt_resource *r;

list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res;
if (!strcmp(resname, r->name) && rdtgrp->closid < s->num_closid)
if (!strcmp(resname, s->name) && rdtgrp->closid < s->num_closid)
return parse_line(tok, s, rdtgrp);
}
rdt_last_cmd_printf("Unknown or unsupported resource name '%s'\n", resname);
Expand Down Expand Up @@ -388,7 +386,7 @@ static void show_doms(struct seq_file *s, struct resctrl_schema *schema, int clo
bool sep = false;
u32 ctrl_val;

seq_printf(s, "%*s:", max_name_width, r->name);
seq_printf(s, "%*s:", max_name_width, schema->name);
list_for_each_entry(dom, &r->domains, list) {
hw_dom = resctrl_to_arch_dom(dom);
if (sep)
Expand All @@ -408,16 +406,14 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
{
struct resctrl_schema *schema;
struct rdtgroup *rdtgrp;
struct rdt_resource *r;
int ret = 0;
u32 closid;

rdtgrp = rdtgroup_kn_lock_live(of->kn);
if (rdtgrp) {
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
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", schema->name);
}
} else if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) {
if (!rdtgrp->plr->d) {
Expand Down
29 changes: 25 additions & 4 deletions arch/x86/kernel/cpu/resctrl/rdtgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1439,7 +1439,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
ret = -ENODEV;
} else {
seq_printf(s, "%*s:", max_name_width,
rdtgrp->plr->s->res->name);
rdtgrp->plr->s->name);
size = rdtgroup_cbm_to_size(rdtgrp->plr->s->res,
rdtgrp->plr->d,
rdtgrp->plr->cbm);
Expand All @@ -1451,7 +1451,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
list_for_each_entry(schema, &resctrl_schema_all, list) {
r = schema->res;
sep = false;
seq_printf(s, "%*s:", max_name_width, r->name);
seq_printf(s, "%*s:", max_name_width, schema->name);
list_for_each_entry(d, &r->domains, list) {
hw_dom = resctrl_to_arch_dom(d);
if (sep)
Expand Down Expand Up @@ -1823,7 +1823,7 @@ static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn)
list_for_each_entry(s, &resctrl_schema_all, list) {
r = s->res;
fflags = r->fflags | RF_CTRL_INFO;
ret = rdtgroup_mkdir_info_resdir(s, r->name, fflags);
ret = rdtgroup_mkdir_info_resdir(s, s->name, fflags);
if (ret)
goto out_destroy;
}
Expand Down Expand Up @@ -2141,6 +2141,7 @@ static int schemata_list_create(void)
{
struct resctrl_schema *s;
struct rdt_resource *r;
int ret, cl;

for_each_alloc_enabled_rdt_resource(r) {
s = kzalloc(sizeof(*s), GFP_KERNEL);
Expand All @@ -2151,6 +2152,26 @@ static int schemata_list_create(void)
s->conf_type = resctrl_to_arch_res(r)->conf_type;
s->num_closid = resctrl_arch_get_num_closid(r);

ret = snprintf(s->name, sizeof(s->name), r->name);
if (ret >= sizeof(s->name)) {
kfree(s);
return -EINVAL;
}

cl = strlen(s->name);

/*
* If CDP is supported by this resource, but not enabled,
* include the suffix. This ensures the tabular format of the
* schemata file does not change between mounts of the
* filesystem.
*/
if (r->cdp_capable && !resctrl_arch_get_cdp_enabled(r->rid))
cl += 4;

if (cl > max_name_width)
max_name_width = cl;

INIT_LIST_HEAD(&s->list);
list_add(&s->list, &resctrl_schema_all);
}
Expand Down Expand Up @@ -2784,7 +2805,7 @@ static int __init_one_rdt_domain(struct rdt_domain *d, struct resctrl_schema *s,
*/
tmp_cbm = d->new_ctrl;
if (bitmap_weight(&tmp_cbm, r->cache.cbm_len) < r->cache.min_cbm_bits) {
rdt_last_cmd_printf("No space on %s:%d\n", r->name, d->id);
rdt_last_cmd_printf("No space on %s:%d\n", s->name, d->id);
return -ENOSPC;
}
d->have_new_ctrl = true;
Expand Down
2 changes: 2 additions & 0 deletions include/linux/resctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ struct rdt_resource {
* struct resctrl_schema - configuration abilities of a resource presented to
* user-space
* @list: Member of resctrl_schema_all.
* @name: The name to use in the "schemata" file.
* @conf_type: Whether this schema is specific to code/data.
* @res: The resource structure exported by the architecture to describe
* the hardware that is configured by this schema.
Expand All @@ -180,6 +181,7 @@ struct rdt_resource {
*/
struct resctrl_schema {
struct list_head list;
char name[8];
enum resctrl_conf_type conf_type;
struct rdt_resource *res;
u32 num_closid;
Expand Down

0 comments on commit e198fde

Please sign in to comment.