x86/resctrl: Add a separate schema list for resctrl
Resctrl exposes schemata to user-space, which allow the control values to be specified for a group of tasks. User-visible properties of the interface, (such as the schemata names and how the values are parsed) are rooted in a struct provided by the architecture code. (struct rdt_hw_resource). Once a second architecture uses resctrl, this would allow user-visible properties to diverge between architectures. These properties should come from the resctrl code that will be common to all architectures. Resctrl has no per-schema structure, only struct rdt_{hw_,}resource. Create a struct resctrl_schema to hold the rdt_resource. Before a second architecture can be supported, this structure will also need to hold the schema name visible to user-space and the type of configuration values for resctrl. 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-4-james.morse@arm.com
This commit is contained in:
parent
792e0f6f78
commit
cdb9ebc917
@ -110,6 +110,7 @@ extern unsigned int resctrl_cqm_threshold;
|
||||
extern bool rdt_alloc_capable;
|
||||
extern bool rdt_mon_capable;
|
||||
extern unsigned int rdt_mon_features;
|
||||
extern struct list_head resctrl_schema_all;
|
||||
|
||||
enum rdt_group_type {
|
||||
RDTCTRL_GROUP = 0,
|
||||
|
@ -39,6 +39,9 @@ static struct kernfs_root *rdt_root;
|
||||
struct rdtgroup rdtgroup_default;
|
||||
LIST_HEAD(rdt_all_groups);
|
||||
|
||||
/* list of entries for the schemata file */
|
||||
LIST_HEAD(resctrl_schema_all);
|
||||
|
||||
/* Kernel fs node for "info" directory under root */
|
||||
static struct kernfs_node *kn_info;
|
||||
|
||||
@ -2109,6 +2112,35 @@ static int rdt_enable_ctx(struct rdt_fs_context *ctx)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int schemata_list_create(void)
|
||||
{
|
||||
struct resctrl_schema *s;
|
||||
struct rdt_resource *r;
|
||||
|
||||
for_each_alloc_enabled_rdt_resource(r) {
|
||||
s = kzalloc(sizeof(*s), GFP_KERNEL);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
s->res = r;
|
||||
|
||||
INIT_LIST_HEAD(&s->list);
|
||||
list_add(&s->list, &resctrl_schema_all);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void schemata_list_destroy(void)
|
||||
{
|
||||
struct resctrl_schema *s, *tmp;
|
||||
|
||||
list_for_each_entry_safe(s, tmp, &resctrl_schema_all, list) {
|
||||
list_del(&s->list);
|
||||
kfree(s);
|
||||
}
|
||||
}
|
||||
|
||||
static int rdt_get_tree(struct fs_context *fc)
|
||||
{
|
||||
struct rdt_fs_context *ctx = rdt_fc2context(fc);
|
||||
@ -2130,11 +2162,17 @@ static int rdt_get_tree(struct fs_context *fc)
|
||||
if (ret < 0)
|
||||
goto out_cdp;
|
||||
|
||||
ret = schemata_list_create();
|
||||
if (ret) {
|
||||
schemata_list_destroy();
|
||||
goto out_mba;
|
||||
}
|
||||
|
||||
closid_init();
|
||||
|
||||
ret = rdtgroup_create_info_dir(rdtgroup_default.kn);
|
||||
if (ret < 0)
|
||||
goto out_mba;
|
||||
goto out_schemata_free;
|
||||
|
||||
if (rdt_mon_capable) {
|
||||
ret = mongroup_create_dir(rdtgroup_default.kn,
|
||||
@ -2184,6 +2222,8 @@ out_mongrp:
|
||||
kernfs_remove(kn_mongrp);
|
||||
out_info:
|
||||
kernfs_remove(kn_info);
|
||||
out_schemata_free:
|
||||
schemata_list_destroy();
|
||||
out_mba:
|
||||
if (ctx->enable_mba_mbps)
|
||||
set_mba_sc(false);
|
||||
@ -2425,6 +2465,7 @@ static void rdt_kill_sb(struct super_block *sb)
|
||||
rmdir_all_sub();
|
||||
rdt_pseudo_lock_release();
|
||||
rdtgroup_default.mode = RDT_MODE_SHAREABLE;
|
||||
schemata_list_destroy();
|
||||
static_branch_disable_cpuslocked(&rdt_alloc_enable_key);
|
||||
static_branch_disable_cpuslocked(&rdt_mon_enable_key);
|
||||
static_branch_disable_cpuslocked(&rdt_enable_key);
|
||||
|
@ -153,4 +153,15 @@ struct rdt_resource {
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* struct resctrl_schema - configuration abilities of a resource presented to
|
||||
* user-space
|
||||
* @list: Member of resctrl_schema_all.
|
||||
* @res: The resource structure exported by the architecture to describe
|
||||
* the hardware that is configured by this schema.
|
||||
*/
|
||||
struct resctrl_schema {
|
||||
struct list_head list;
|
||||
struct rdt_resource *res;
|
||||
};
|
||||
#endif /* _RESCTRL_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user