提交 24e0745c 编写于 作者: W Wang ShaoBo 提交者: Yang Yingliang

arm64/mpam: resctrl: Support cdp on monitoring data

hulk inclusion
category: feature
bugzilla: 34278
CVE: NA

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

commit 43be0de7be8f ("arm64/mpam: Support cdp on allocating monitors")
allows us to allocate two monitor once, we apply this two monitors to
different monitor sysfile under mon_data directory according to its'
closid, as following illustrates.

-- resctrl/
         +-- schemata
             L3CODE:0=xx  # closid
             L3DATA:1=xx  # closid+1
             MB:0=xx      # closid
         +-- mon_data/
                    +-- mon_L3CODE_00 # monitor
                    +-- mon_L3DATA_00 # monitor+1
                    +-- mon_MB_00     # monitor

When monitoring happens, we read the private data of each monitor
sysfile which contains closid, monitor and pmg, this is used for
obtaining monitor data.
Signed-off-by: NWang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-by: NXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: NCheng Jian <cj.chengjian@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NCheng Jian <cj.chengjian@huawei.com>
上级 ad424230
...@@ -338,10 +338,11 @@ struct raw_resctrl_resource { ...@@ -338,10 +338,11 @@ struct raw_resctrl_resource {
struct resctrl_staged_config *cfg, hw_closid_t closid); struct resctrl_staged_config *cfg, hw_closid_t closid);
u16 num_mon; u16 num_mon;
u64 (*mon_read)(struct rdt_domain *d, struct rdtgroup *g); u64 (*mon_read)(struct rdt_domain *d, void *md_priv);
int (*mon_write)(struct rdt_domain *d, struct rdtgroup *g, bool enable); int (*mon_write)(struct rdt_domain *d, void *md_priv, bool enable);
}; };
/* 64bit arm64 specified */
union mon_data_bits { union mon_data_bits {
void *priv; void *priv;
struct { struct {
...@@ -349,6 +350,7 @@ union mon_data_bits { ...@@ -349,6 +350,7 @@ union mon_data_bits {
u8 domid; u8 domid;
u8 partid; u8 partid;
u8 pmg; u8 pmg;
u8 mon;
} u; } u;
}; };
......
...@@ -425,7 +425,7 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg) ...@@ -425,7 +425,7 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg)
goto out; goto out;
} }
usage = rr->mon_read(d, rdtgrp); usage = rr->mon_read(d, md.priv);
seq_printf(m, "%llu\n", usage); seq_printf(m, "%llu\n", usage);
out: out:
...@@ -454,22 +454,31 @@ static int resctrl_group_kn_set_ugid(struct kernfs_node *kn) ...@@ -454,22 +454,31 @@ static int resctrl_group_kn_set_ugid(struct kernfs_node *kn)
} }
static int mkdir_mondata_subdir(struct kernfs_node *parent_kn, static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
struct rdt_domain *d, struct rdt_domain *d, struct resctrl_schema *s,
struct resctrl_resource *r, struct resctrl_group *prgrp) struct resctrl_group *prgrp)
{ {
struct raw_resctrl_resource *rr = (struct raw_resctrl_resource *)r->res; struct resctrl_resource *r;
struct raw_resctrl_resource *rr;
hw_closid_t hw_closid;
hw_monid_t hw_monid;
union mon_data_bits md; union mon_data_bits md;
struct kernfs_node *kn; struct kernfs_node *kn;
char name[32]; char name[32];
int ret = 0; int ret = 0;
r = s->res;
rr = r->res;
md.u.rid = r->rid; md.u.rid = r->rid;
md.u.domid = d->id; md.u.domid = d->id;
md.u.partid = prgrp->closid; resctrl_cdp_map(clos, prgrp->closid, s->conf_type, hw_closid);
md.u.partid = hw_closid_val(hw_closid);
resctrl_cdp_map(mon, prgrp->mon.mon, s->conf_type, hw_monid);
md.u.mon = hw_monid_val(hw_monid);
md.u.pmg = prgrp->mon.rmid; md.u.pmg = prgrp->mon.rmid;
snprintf(name, sizeof(name), "mon_%s_%02d", r->name, d->id); snprintf(name, sizeof(name), "mon_%s_%02d", s->name, d->id);
kn = __kernfs_create_file(parent_kn, name, 0444, kn = __kernfs_create_file(parent_kn, name, 0444,
GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, 0, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, 0,
&kf_mondata_ops, md.priv, NULL, NULL); &kf_mondata_ops, md.priv, NULL, NULL);
...@@ -484,7 +493,7 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn, ...@@ -484,7 +493,7 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
} }
/* Could we remove the MATCH_* param ? */ /* Could we remove the MATCH_* param ? */
rr->mon_write(d, prgrp, true); rr->mon_write(d, md.priv, true);
return ret; return ret;
} }
...@@ -599,14 +608,15 @@ int resctrl_group_ctrlmon_show(struct kernfs_open_file *of, ...@@ -599,14 +608,15 @@ int resctrl_group_ctrlmon_show(struct kernfs_open_file *of,
static int mkdir_mondata_subdir_alldom(struct kernfs_node *parent_kn, static int mkdir_mondata_subdir_alldom(struct kernfs_node *parent_kn,
struct resctrl_resource *r, struct resctrl_schema *s, struct resctrl_group *prgrp)
struct resctrl_group *prgrp)
{ {
struct resctrl_resource *r;
struct rdt_domain *dom; struct rdt_domain *dom;
int ret; int ret;
r = s->res;
list_for_each_entry(dom, &r->domains, list) { list_for_each_entry(dom, &r->domains, list) {
ret = mkdir_mondata_subdir(parent_kn, dom, r, prgrp); ret = mkdir_mondata_subdir(parent_kn, dom, s, prgrp);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -672,7 +682,7 @@ int mkdir_mondata_all(struct kernfs_node *parent_kn, ...@@ -672,7 +682,7 @@ int mkdir_mondata_all(struct kernfs_node *parent_kn,
struct resctrl_group *prgrp, struct resctrl_group *prgrp,
struct kernfs_node **dest_kn) struct kernfs_node **dest_kn)
{ {
struct mpam_resctrl_res *res; struct resctrl_schema *s;
struct resctrl_resource *r; struct resctrl_resource *r;
struct kernfs_node *kn; struct kernfs_node *kn;
int ret; int ret;
...@@ -691,16 +701,23 @@ int mkdir_mondata_all(struct kernfs_node *parent_kn, ...@@ -691,16 +701,23 @@ int mkdir_mondata_all(struct kernfs_node *parent_kn,
* Create the subdirectories for each domain. Note that all events * Create the subdirectories for each domain. Note that all events
* in a domain like L3 are grouped into a resource whose domain is L3 * in a domain like L3 are grouped into a resource whose domain is L3
*/ */
for_each_supported_resctrl_exports(res) { list_for_each_entry(s, &resctrl_all_schema, list) {
r = &res->resctrl_res; r = s->res;
if (r->mon_enabled) { if (r->mon_enabled) {
/* HHA does not support monitor by pmg */ /* HHA does not support monitor by pmg */
struct raw_resctrl_resource *rr;
rr = r->res;
/*
* num pmg of different resources varies, we just
* skip creating those unqualified ones.
*/
if ((prgrp->type == RDTMON_GROUP) && if ((prgrp->type == RDTMON_GROUP) &&
(r->rid == RDT_RESOURCE_MC)) (prgrp->mon.rmid >= rr->num_pmg))
continue; continue;
ret = mkdir_mondata_subdir_alldom(kn, r, prgrp); ret = mkdir_mondata_subdir_alldom(kn, s, prgrp);
if (ret) if (ret)
goto out_destroy; goto out_destroy;
} }
......
...@@ -123,11 +123,10 @@ common_wrmsr(struct resctrl_resource *r, struct rdt_domain *d, ...@@ -123,11 +123,10 @@ common_wrmsr(struct resctrl_resource *r, struct rdt_domain *d,
static u64 cache_rdmsr(struct rdt_domain *d, int partid); static u64 cache_rdmsr(struct rdt_domain *d, int partid);
static u64 mbw_rdmsr(struct rdt_domain *d, int partid); static u64 mbw_rdmsr(struct rdt_domain *d, int partid);
static u64 cache_rdmon(struct rdt_domain *d, struct rdtgroup *g); static u64 cache_rdmon(struct rdt_domain *d, void *md_priv);
static u64 mbw_rdmon(struct rdt_domain *d, struct rdtgroup *g); static u64 mbw_rdmon(struct rdt_domain *d, void *md_priv);
static int common_wrmon(struct rdt_domain *d, struct rdtgroup *g, static int common_wrmon(struct rdt_domain *d, void *md_priv, bool enable);
bool enable);
static inline bool is_mon_dyn(u32 mon) static inline bool is_mon_dyn(u32 mon)
{ {
...@@ -342,22 +341,27 @@ static u64 mbw_rdmsr(struct rdt_domain *d, int partid) ...@@ -342,22 +341,27 @@ static u64 mbw_rdmsr(struct rdt_domain *d, int partid)
* use pmg as monitor id * use pmg as monitor id
* just use match_pardid only. * just use match_pardid only.
*/ */
static u64 cache_rdmon(struct rdt_domain *d, struct rdtgroup *g) static u64 cache_rdmon(struct rdt_domain *d, void *md_priv)
{ {
int err; int err;
u64 result; u64 result;
union mon_data_bits md;
struct sync_args args; struct sync_args args;
struct mpam_resctrl_dom *dom; struct mpam_resctrl_dom *dom;
u32 mon = g->mon.mon; u32 mon;
unsigned long timeout; unsigned long timeout;
md.priv = md_priv;
mon = md.u.mon;
/* Indicates whether allocating a monitor dynamically*/ /* Indicates whether allocating a monitor dynamically*/
if (is_mon_dyn(mon)) if (is_mon_dyn(mon))
mon = alloc_mon(); mon = alloc_mon();
args.partid = g->closid; args.partid = md.u.partid;
args.mon = mon; args.mon = mon;
args.pmg = g->mon.rmid; args.pmg = md.u.pmg;
args.match_pmg = true; args.match_pmg = true;
args.eventid = QOS_L3_OCCUP_EVENT_ID; args.eventid = QOS_L3_OCCUP_EVENT_ID;
...@@ -387,21 +391,26 @@ static u64 cache_rdmon(struct rdt_domain *d, struct rdtgroup *g) ...@@ -387,21 +391,26 @@ static u64 cache_rdmon(struct rdt_domain *d, struct rdtgroup *g)
* use pmg as monitor id * use pmg as monitor id
* just use match_pardid only. * just use match_pardid only.
*/ */
static u64 mbw_rdmon(struct rdt_domain *d, struct rdtgroup *g) static u64 mbw_rdmon(struct rdt_domain *d, void *md_priv)
{ {
int err; int err;
u64 result; u64 result;
union mon_data_bits md;
struct sync_args args; struct sync_args args;
struct mpam_resctrl_dom *dom; struct mpam_resctrl_dom *dom;
u32 mon = g->mon.mon; u32 mon;
unsigned long timeout; unsigned long timeout;
md.priv = md_priv;
mon = md.u.mon;
if (is_mon_dyn(mon)) if (is_mon_dyn(mon))
mon = alloc_mon(); mon = alloc_mon();
args.partid = g->closid; args.partid = md.u.partid;
args.mon = mon; args.mon = mon;
args.pmg = g->mon.rmid; args.pmg = md.u.pmg;
args.match_pmg = true; args.match_pmg = true;
args.eventid = QOS_L3_MBM_LOCAL_EVENT_ID; args.eventid = QOS_L3_MBM_LOCAL_EVENT_ID;
...@@ -427,18 +436,22 @@ static u64 mbw_rdmon(struct rdt_domain *d, struct rdtgroup *g) ...@@ -427,18 +436,22 @@ static u64 mbw_rdmon(struct rdt_domain *d, struct rdtgroup *g)
return result; return result;
} }
static int common_wrmon(struct rdt_domain *d, struct rdtgroup *g, bool enable) static int
common_wrmon(struct rdt_domain *d, void *md_priv, bool enable)
{ {
u64 result; u64 result;
union mon_data_bits md;
struct sync_args args; struct sync_args args;
struct mpam_resctrl_dom *dom; struct mpam_resctrl_dom *dom;
if (!enable) if (!enable)
return -EINVAL; return -EINVAL;
args.partid = g->closid; md.priv = md_priv;
args.mon = g->mon.mon; args.partid = md.u.partid;
args.pmg = g->mon.rmid; args.mon = md.u.mon;
args.pmg = md.u.pmg;
args.match_pmg = true; args.match_pmg = true;
dom = container_of(d, struct mpam_resctrl_dom, resctrl_dom); dom = container_of(d, struct mpam_resctrl_dom, resctrl_dom);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册