diff options
| -rw-r--r-- | arch/x86/kernel/cpu/resctrl/internal.h | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/resctrl/rdtgroup.c | 43 | ||||
| -rw-r--r-- | include/linux/resctrl.h | 11 | 
3 files changed, 54 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index 02c85c795113..2cc4b37bc128 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -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, diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index d190a21845ce..3e0b6aa94571 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -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); diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h index a4c89dafd7fa..5a21d483da6a 100644 --- a/include/linux/resctrl.h +++ b/include/linux/resctrl.h @@ -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 */  | 
