Commit aeffdf37 authored by Wang ShaoBo's avatar Wang ShaoBo Committed by Zheng Zengkai
Browse files

arm64/mpam: resctrl: Rebuild configuration and monitoring pipeline



hulk inclusion
category: feature
feature: ARM MPAM support
bugzilla: 48265
CVE: NA

--------------------------------

We now bridge resctrl intermediate processing module and mpam devices
module, a large block of code refer to configuration and monitoring
process involved need to be modified.

We change the previous method where straightly writing MSCs' registers,
this jobs are handed over to helpers offered by mpam devices module
instead, when configuration or monitoring action happened, each domains'
ctrlval array changed by resctrl sysfs input would be updated into mpam
config structure live in each mpam component structure, relevant helpers
provided by mpam devices module will soon accomplish the remaining jobs.

Comparasion:
                   configuration or monitoring

                     old               new
                      +                 +
                      |                 |
                      |       +---------+------------+
                      |       | intermediate helpers |
                      |       +---------+------------+
                      |                 |
                      |                 |
                   +--+-----------------+----+
                   | [reading  writing MMIO] |
                   +-------------------------+

So far we nearly accomplish the mission that open up process between
resctrl sysfs and mpam devices module but still incomplete currently,
also some proper actions are needed after.

Also this moves relevant structures such as struct mongroup to suitable
place,.

Signed-off-by: default avatarWang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: default avatarCheng Jian <cj.chengjian@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 3f260048
Loading
Loading
Loading
Loading
+12 −55
Original line number Diff line number Diff line
@@ -118,54 +118,6 @@ DECLARE_STATIC_KEY_FALSE(resctrl_mon_enable_key);
extern bool rdt_alloc_capable;
extern bool rdt_mon_capable;

enum rdt_group_type {
	RDTCTRL_GROUP = 0,
	RDTMON_GROUP,
	RDT_NUM_GROUP,
};

/**
 * struct mongroup - store mon group's data in resctrl fs.
 * @mon_data_kn		kernlfs node for the mon_data directory
 * @parent:			parent rdtgrp
 * @crdtgrp_list:		child rdtgroup node list
 * @rmid:			rmid for this rdtgroup
 * @mon:			monnitor id
 */
struct mongroup {
	struct kernfs_node	*mon_data_kn;
	struct rdtgroup		*parent;
	struct list_head	crdtgrp_list;
	u32			rmid;
	u32			mon;
	int			init;
};

/**
 * struct rdtgroup - store rdtgroup's data in resctrl file system.
 * @kn:				kernfs node
 * @resctrl_group_list:		linked list for all rdtgroups
 * @closid:			closid for this rdtgroup
 * #endif
 * @cpu_mask:			CPUs assigned to this rdtgroup
 * @flags:			status bits
 * @waitcount:			how many cpus expect to find this
 *				group when they acquire resctrl_group_mutex
 * @type:			indicates type of this rdtgroup - either
 *				monitor only or ctrl_mon group
 * @mon:			mongroup related data
 */
struct rdtgroup {
	struct kernfs_node	*kn;
	struct list_head	resctrl_group_list;
	u32			closid;
	struct cpumask		cpu_mask;
	int			flags;
	atomic_t		waitcount;
	enum rdt_group_type	type;
	struct mongroup		mon;
};

extern int max_name_width, max_data_width;

/* rdtgroup.flags */
@@ -284,13 +236,16 @@ struct raw_resctrl_resource {
	u16                 pri_wd;
	u16                 hdl_wd;

	void (*msr_update)	(struct rdt_domain *d, int partid);
	void (*msr_update)(struct resctrl_resource *r, struct rdt_domain *d,
					struct list_head *opt_list, int partid);
	u64 (*msr_read)(struct rdt_domain *d, int partid);

	int			data_width;
	const char		*format_str;
	int (*parse_ctrlval)(char *buf, struct raw_resctrl_resource *r,
				struct rdt_domain *d);
	int			num_mon;

	u16                num_mon;
	u64 (*mon_read)(struct rdt_domain *d, struct rdtgroup *g);
	int (*mon_write)(struct rdt_domain *d, struct rdtgroup *g, bool enable);
};
@@ -321,4 +276,6 @@ int resctrl_mkdir_ctrlmon_mondata(struct kernfs_node *parent_kn,
				  struct rdtgroup *prgrp,
				  struct kernfs_node **dest_kn);

u16 mpam_resctrl_max_mon_num(void);

#endif /* _ASM_ARM64_MPAM_H */
+51 −5
Original line number Diff line number Diff line
@@ -27,6 +27,54 @@ enum rdt_event_id {
	RESCTRL_NUM_EVENT_IDS,
};

enum rdt_group_type {
	RDTCTRL_GROUP = 0,
	RDTMON_GROUP,
	RDT_NUM_GROUP,
};

/**
 * struct mongroup - store mon group's data in resctrl fs.
 * @mon_data_kn     kernlfs node for the mon_data directory
 * @parent:         parent rdtgrp
 * @crdtgrp_list:       child rdtgroup node list
 * @rmid:           rmid for this rdtgroup
 * @mon:            monnitor id
 */
struct mongroup {
	struct kernfs_node  *mon_data_kn;
	struct rdtgroup     *parent;
	struct list_head    crdtgrp_list;
	u32         rmid;
	u32         mon;
	int         init;
};

/**
 * struct rdtgroup - store rdtgroup's data in resctrl file system.
 * @kn:             kernfs node
 * @resctrl_group_list:     linked list for all rdtgroups
 * @closid:         closid for this rdtgroup
 * #endif
 * @cpu_mask:           CPUs assigned to this rdtgroup
 * @flags:          status bits
 * @waitcount:          how many cpus expect to find this
 *              group when they acquire resctrl_group_mutex
 * @type:           indicates type of this rdtgroup - either
 *              monitor only or ctrl_mon group
 * @mon:            mongroup related data
 */
struct rdtgroup {
	struct kernfs_node  *kn;
	struct list_head    resctrl_group_list;
	u32         closid;
	struct cpumask      cpu_mask;
	int         flags;
	atomic_t        waitcount;
	enum rdt_group_type type;
	struct mongroup     mon;
};

static inline int alloc_mon_id(void)
{

@@ -69,11 +117,6 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of,
#define release_resctrl_group_fs_options release_rdtgroupfs_options
#define parse_resctrl_group_fs_options parse_rdtgroupfs_options

#define for_each_resctrl_resource(r)					\
	for (r = resctrl_resources_all;					\
	     r < resctrl_resources_all + RDT_NUM_RESOURCES;		\
	     r++)							\

int mpam_get_mon_config(struct resctrl_resource *r);

int mkdir_mondata_all(struct kernfs_node *parent_kn,
@@ -86,4 +129,7 @@ mongroup_create_dir(struct kernfs_node *parent_kn, struct resctrl_group *prgrp,

int rdtgroup_init_alloc(struct rdtgroup *rdtgrp);

struct resctrl_resource *
mpam_resctrl_get_resource(enum resctrl_resource_level level);

#endif /* _ASM_ARM64_RESCTRL_H */
+28 −10
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#include <asm/mpam.h>
#include <asm/mpam_resource.h>
#include <asm/resctrl.h>
#include "mpam_internal.h"

/*
 * Check whether a cache bit mask is valid. The SDM says:
@@ -184,7 +185,7 @@ static int update_domains(struct resctrl_resource *r, struct rdtgroup *g)
	list_for_each_entry(d, &r->domains, list) {
		if (d->have_new_ctrl && d->new_ctrl != d->ctrl_val[partid]) {
			d->ctrl_val[partid] = d->new_ctrl;
			rr->msr_update(d, partid);
			rr->msr_update(r, d, NULL, partid);
		}
	}

@@ -193,13 +194,17 @@ static int update_domains(struct resctrl_resource *r, struct rdtgroup *g)

static int resctrl_group_parse_resource(char *resname, char *tok, int closid)
{
	struct mpam_resctrl_res *res;
	struct resctrl_resource *r;
	struct raw_resctrl_resource *rr;

	for_each_resctrl_resource(r) {
	for_each_supported_resctrl_exports(res) {
		r = &res->resctrl_res;

		if (r->alloc_enabled) {
			rr = (struct raw_resctrl_resource *)r->res;
			if (!strcmp(resname, r->name) && closid < rr->num_partid)
			if (!strcmp(resname, r->name) && closid <
				mpam_sysprops_num_partid())
				return parse_line(tok, r);
		}
	}
@@ -212,6 +217,7 @@ ssize_t resctrl_group_schemata_write(struct kernfs_open_file *of,
{
	struct rdtgroup *rdtgrp;
	struct rdt_domain *dom;
	struct mpam_resctrl_res *res;
	struct resctrl_resource *r;
	char *tok, *resname;
	int closid, ret = 0;
@@ -230,7 +236,9 @@ ssize_t resctrl_group_schemata_write(struct kernfs_open_file *of,

	closid = rdtgrp->closid;

	for_each_resctrl_resource(r) {
	for_each_supported_resctrl_exports(res) {
		r = &res->resctrl_res;

		if (r->alloc_enabled) {
			list_for_each_entry(dom, &r->domains, list)
				dom->have_new_ctrl = false;
@@ -254,7 +262,9 @@ ssize_t resctrl_group_schemata_write(struct kernfs_open_file *of,
			goto out;
	}

	for_each_resctrl_resource(r) {
	for_each_supported_resctrl_exports(res) {
		r = &res->resctrl_res;

		if (r->alloc_enabled) {
			ret = update_domains(r, rdtgrp);
			if (ret)
@@ -288,6 +298,7 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of,
			   struct seq_file *s, void *v)
{
	struct rdtgroup *rdtgrp;
	struct mpam_resctrl_res *res;
	struct resctrl_resource *r;
	struct raw_resctrl_resource *rr;
	int ret = 0;
@@ -296,10 +307,11 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of,
	rdtgrp = resctrl_group_kn_lock_live(of->kn);
	if (rdtgrp) {
		partid = rdtgrp->closid;
		for_each_resctrl_resource(r) {
		for_each_supported_resctrl_exports(res) {
			r = &res->resctrl_res;
			if (r->alloc_enabled) {
				rr = (struct raw_resctrl_resource *)r->res;
				if (partid < rr->num_partid)
				if (partid < mpam_sysprops_num_partid())
					show_doms(s, r, partid);
			}
		}
@@ -363,7 +375,7 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg)

	md.priv = of->kn->priv;

	r = &resctrl_resources_all[md.u.rid];
	r = mpam_resctrl_get_resource(md.u.rid);
	rr = r->res;

	/* show monitor data */
@@ -512,6 +524,7 @@ int mkdir_mondata_all(struct kernfs_node *parent_kn,
			     struct resctrl_group *prgrp,
			     struct kernfs_node **dest_kn)
{
	struct mpam_resctrl_res *res;
	struct resctrl_resource *r;
	struct kernfs_node *kn;
	int ret;
@@ -530,7 +543,9 @@ int mkdir_mondata_all(struct kernfs_node *parent_kn,
	 * Create the subdirectories for each domain. Note that all events
	 * in a domain like L3 are grouped into a resource whose domain is L3
	 */
	for_each_resctrl_resource(r) {
	for_each_supported_resctrl_exports(res) {
		r = &res->resctrl_res;

		if (r->mon_enabled) {
			/* HHA does not support monitor by pmg */
			if ((prgrp->type == RDTMON_GROUP) &&
@@ -589,11 +604,14 @@ int resctrl_mkdir_ctrlmon_mondata(struct kernfs_node *parent_kn,
/* Initialize the RDT group's allocations. */
int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
{
	struct mpam_resctrl_res *res;
	struct resctrl_resource *r;
	struct rdt_domain *d;
	int ret;

	for_each_resctrl_resource(r) {
	for_each_supported_resctrl_exports(res) {
		r = &res->resctrl_res;

		if (!r->alloc_enabled)
			continue;

+3 −0
Original line number Diff line number Diff line
@@ -170,6 +170,9 @@ u16 mpam_sysprops_num_pmg(void);

void mpam_class_list_lock_held(void);

extern struct mpam_resctrl_res mpam_resctrl_exports[RDT_NUM_RESOURCES];
extern struct mpam_resctrl_res mpam_resctrl_events[RESCTRL_NUM_EVENT_IDS];

int mpam_resctrl_cpu_online(unsigned int cpu);

int mpam_resctrl_cpu_offline(unsigned int cpu);
+13 −13
Original line number Diff line number Diff line
@@ -40,10 +40,17 @@ static int pmg_free_map;
void mon_init(void);
void pmg_init(void)
{
	/* use L3's num_pmg as system num_pmg */
	struct raw_resctrl_resource *rr =
		resctrl_resources_all[RDT_RESOURCE_L3].res;
	int num_pmg = rr->num_pmg;
	u16 num_pmg = USHRT_MAX;
	struct mpam_resctrl_res *res;
	struct resctrl_resource *r;
	struct raw_resctrl_resource *rr;

	/* Use the max num_pmg among all resources */
	for_each_supported_resctrl_exports(res) {
		r = &res->resctrl_res;
		rr = r->res;
		num_pmg = min(num_pmg, rr->num_pmg);
	}

	mon_init();

@@ -74,16 +81,9 @@ void free_pmg(u32 pmg)
static int mon_free_map;
void mon_init(void)
{
	struct resctrl_resource *r;
	struct raw_resctrl_resource *rr;
	int num_mon = INT_MAX;
	int num_mon;

	for_each_resctrl_resource(r) {
		if (r->mon_enabled) {
			rr = r->res;
			num_mon = min(num_mon, rr->num_mon);
		}
	}
	num_mon = mpam_resctrl_max_mon_num();

	mon_free_map = BIT_MASK(num_mon) - 1;
}
Loading