提交 6117a289 编写于 作者: W Wang ShaoBo 提交者: Yang Yingliang

arm64/mpam: Simplify mpamid cdp mapping process

hulk inclusion
category: feature
bugzilla: 34278
CVE: NA

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

MPAM includes partid, pmg, monitor, all of these we collectively call
mpam id, if cdp on, we would allocate a new mpamid_new which equals to
mpamid + 1, and at some places mpamid may not need to be encapsulated
into struct { u16 val; } for simplicity, So we use a simpler macro
resctrl_cdp_mpamid_map_val() to complete this cdp mapping process.
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>
上级 5ac157bf
...@@ -227,29 +227,35 @@ static inline int conf_name_to_conf_type(char *name) ...@@ -227,29 +227,35 @@ static inline int conf_name_to_conf_type(char *name)
#define for_each_conf_type(t) \ #define for_each_conf_type(t) \
for (t = CDP_BOTH; t < CDP_NUM_CONF_TYPE; t++) for (t = CDP_BOTH; t < CDP_NUM_CONF_TYPE; t++)
typedef struct { u16 val; } hw_def_t; typedef struct { u16 val; } hw_mpamid_t;
typedef hw_mpamid_t hw_closid_t;
#define hw_closid_t hw_def_t #define hw_mpamid_val(__x) (__x.val)
#define hw_monid_t hw_def_t
#define hw_closid_val(__x) (__x.val) #define hw_closid_val(__x) (__x.val)
#define hw_monid_val(__x) (__x.val)
#define as_hw_t(__name, __x) \ #define as_hw_mpamid_t(__x) ((hw_mpamid_t){(__x)})
((hw_##__name##id_t){(__x)})
#define hw_val(__name, __x) \
hw_##__name##id_val(__x)
/** /**
* When cdp enabled, give (closid + 1) to Cache LxDATA. * When cdp enabled, give (closid + 1) to Cache LxDATA.
*/ */
#define resctrl_cdp_map(__name, __closid, __type, __result) \ #define resctrl_cdp_mpamid_map(__id, __type, __hw_mpamid) \
do { \ do { \
if (__type == CDP_CODE) \ if (__type == CDP_CODE) \
__result = as_hw_t(__name, __closid); \ __hw_mpamid = as_hw_mpamid_t(__id); \
else if (__type == CDP_DATA) \ else if (__type == CDP_DATA) \
__result = as_hw_t(__name, __closid + 1); \ __hw_mpamid = as_hw_mpamid_t(__id + 1); \
else \ else \
__result = as_hw_t(__name, __closid); \ __hw_mpamid = as_hw_mpamid_t(__id); \
} while (0)
#define resctrl_cdp_mpamid_map_val(__id, __type, __hw_mpamid_val) \
do { \
if (__type == CDP_CODE) \
__hw_mpamid_val = __id; \
else if (__type == CDP_DATA) \
__hw_mpamid_val = __id + 1; \
else \
__hw_mpamid_val = __id; \
} while (0) } while (0)
bool is_resctrl_cdp_enabled(void); bool is_resctrl_cdp_enabled(void);
......
...@@ -182,10 +182,8 @@ resctrl_dom_ctrl_config(bool cdp_both_ctrl, struct resctrl_resource *r, ...@@ -182,10 +182,8 @@ resctrl_dom_ctrl_config(bool cdp_both_ctrl, struct resctrl_resource *r,
rr->msr_update(r, dom, para); rr->msr_update(r, dom, para);
if (cdp_both_ctrl) { if (cdp_both_ctrl) {
hw_closid_t hw_closid; resctrl_cdp_mpamid_map_val(para->closid->reqpartid, CDP_DATA,
para->closid->reqpartid);
resctrl_cdp_map(clos, para->closid->reqpartid, CDP_DATA, hw_closid);
para->closid->reqpartid = hw_closid_val(hw_closid);
rr->msr_update(r, dom, para); rr->msr_update(r, dom, para);
} }
} }
...@@ -196,7 +194,6 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp, ...@@ -196,7 +194,6 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp,
int i; int i;
struct resctrl_staged_config *cfg; struct resctrl_staged_config *cfg;
enum resctrl_ctrl_type type; enum resctrl_ctrl_type type;
hw_closid_t hw_closid;
struct sd_closid closid; struct sd_closid closid;
struct list_head *head; struct list_head *head;
struct rdtgroup *entry; struct rdtgroup *entry;
...@@ -223,9 +220,8 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp, ...@@ -223,9 +220,8 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp,
* duplicate ctrl group's configuration indexed * duplicate ctrl group's configuration indexed
* by intpartid from domain ctrl_val array. * by intpartid from domain ctrl_val array.
*/ */
resctrl_cdp_map(clos, rdtgrp->closid.reqpartid, resctrl_cdp_mpamid_map_val(rdtgrp->closid.reqpartid,
cfg[i].conf_type, hw_closid); cfg[i].conf_type, closid.reqpartid);
closid.reqpartid = hw_closid_val(hw_closid);
dom->ctrl_val[type][closid.intpartid] = dom->ctrl_val[type][closid.intpartid] =
cfg[i].new_ctrl[type]; cfg[i].new_ctrl[type];
...@@ -242,10 +238,8 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp, ...@@ -242,10 +238,8 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp,
*/ */
head = &rdtgrp->mon.crdtgrp_list; head = &rdtgrp->mon.crdtgrp_list;
list_for_each_entry(entry, head, mon.crdtgrp_list) { list_for_each_entry(entry, head, mon.crdtgrp_list) {
resctrl_cdp_map(clos, entry->closid.reqpartid, resctrl_cdp_mpamid_map_val(entry->closid.reqpartid,
cfg[i].conf_type, hw_closid); cfg[i].conf_type, closid.reqpartid);
closid.reqpartid = hw_closid_val(hw_closid);
resctrl_dom_ctrl_config(cdp_both_ctrl, r, dom, &para); resctrl_dom_ctrl_config(cdp_both_ctrl, r, dom, &para);
} }
} }
...@@ -295,7 +289,7 @@ parse_line(char *line, struct resctrl_resource *r, ...@@ -295,7 +289,7 @@ parse_line(char *line, struct resctrl_resource *r,
dom = strim(dom); dom = strim(dom);
list_for_each_entry(d, &r->domains, list) { list_for_each_entry(d, &r->domains, list) {
if (d->id == dom_id) { if (d->id == dom_id) {
resctrl_cdp_map(clos, closid, conf_type, hw_closid); resctrl_cdp_mpamid_map(closid, conf_type, hw_closid);
if (rr->parse_ctrlval(dom, r, if (rr->parse_ctrlval(dom, r,
&d->staged_cfg[conf_type], ctrl_type)) &d->staged_cfg[conf_type], ctrl_type))
return -EINVAL; return -EINVAL;
...@@ -468,7 +462,6 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of, ...@@ -468,7 +462,6 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of,
struct resctrl_resource *r; struct resctrl_resource *r;
struct resctrl_schema *rs; struct resctrl_schema *rs;
int ret = 0; int ret = 0;
hw_closid_t hw_closid;
struct sd_closid closid; struct sd_closid closid;
struct resctrl_schema_ctrl *sc; struct resctrl_schema_ctrl *sc;
...@@ -479,13 +472,11 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of, ...@@ -479,13 +472,11 @@ int resctrl_group_schemata_show(struct kernfs_open_file *of,
if (!r) if (!r)
continue; continue;
if (r->alloc_enabled) { if (r->alloc_enabled) {
resctrl_cdp_map(clos, rdtgrp->closid.intpartid, resctrl_cdp_mpamid_map_val(rdtgrp->closid.intpartid,
rs->conf_type, hw_closid); rs->conf_type, closid.intpartid);
closid.intpartid = hw_closid_val(hw_closid);
resctrl_cdp_map(clos, rdtgrp->closid.reqpartid, resctrl_cdp_mpamid_map_val(rdtgrp->closid.reqpartid,
rs->conf_type, hw_closid); rs->conf_type, closid.reqpartid);
closid.reqpartid = hw_closid_val(hw_closid);
show_doms(s, r, rs->name, SCHEMA_COMM, &closid); show_doms(s, r, rs->name, SCHEMA_COMM, &closid);
list_for_each_entry(sc, &rs->schema_ctrl_list, list) { list_for_each_entry(sc, &rs->schema_ctrl_list, list) {
...@@ -541,10 +532,7 @@ static u64 resctrl_dom_mon_data(struct resctrl_resource *r, ...@@ -541,10 +532,7 @@ static u64 resctrl_dom_mon_data(struct resctrl_resource *r,
rr = r->res; rr = r->res;
ret = rr->mon_read(d, md.priv); ret = rr->mon_read(d, md.priv);
if (md.u.cdp_both_mon) { if (md.u.cdp_both_mon) {
hw_closid_t hw_closid; resctrl_cdp_mpamid_map_val(md.u.partid, CDP_DATA, md.u.partid);
resctrl_cdp_map(clos, md.u.partid, CDP_DATA, hw_closid);
md.u.partid = hw_closid_val(hw_closid);
ret += rr->mon_read(d, md.priv); ret += rr->mon_read(d, md.priv);
} }
...@@ -594,10 +582,9 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg) ...@@ -594,10 +582,9 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg)
struct list_head *head; struct list_head *head;
struct rdtgroup *entry; struct rdtgroup *entry;
hw_closid_t hw_closid; hw_closid_t hw_closid;
hw_monid_t hw_monid;
enum resctrl_conf_type type = CDP_CODE; enum resctrl_conf_type type = CDP_CODE;
resctrl_cdp_map(clos, rdtgrp->closid.reqpartid, resctrl_cdp_mpamid_map(rdtgrp->closid.reqpartid,
CDP_CODE, hw_closid); CDP_CODE, hw_closid);
/* CDP_CODE share the same closid with CDP_BOTH */ /* CDP_CODE share the same closid with CDP_BOTH */
if (md.u.partid != hw_closid_val(hw_closid)) if (md.u.partid != hw_closid_val(hw_closid))
...@@ -605,9 +592,8 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg) ...@@ -605,9 +592,8 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg)
head = &rdtgrp->mon.crdtgrp_list; head = &rdtgrp->mon.crdtgrp_list;
list_for_each_entry(entry, head, mon.crdtgrp_list) { list_for_each_entry(entry, head, mon.crdtgrp_list) {
resctrl_cdp_map(clos, entry->closid.reqpartid, resctrl_cdp_mpamid_map_val(entry->closid.reqpartid,
type, hw_closid); type, md.u.partid);
md.u.partid = hw_closid_val(hw_closid);
ret = mpam_rmid_to_partid_pmg(entry->mon.rmid, ret = mpam_rmid_to_partid_pmg(entry->mon.rmid,
NULL, &pmg); NULL, &pmg);
...@@ -615,9 +601,8 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg) ...@@ -615,9 +601,8 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg)
return ret; return ret;
md.u.pmg = pmg; md.u.pmg = pmg;
resctrl_cdp_map(mon, get_rmid_mon(entry->mon.rmid, resctrl_cdp_mpamid_map_val(get_rmid_mon(entry->mon.rmid,
r->rid), type, hw_monid); r->rid), type, md.u.mon);
md.u.mon = hw_monid_val(hw_monid);
usage += resctrl_dom_mon_data(r, d, md.priv); usage += resctrl_dom_mon_data(r, d, md.priv);
} }
...@@ -657,8 +642,6 @@ static int resctrl_mkdir_mondata_dom(struct kernfs_node *parent_kn, ...@@ -657,8 +642,6 @@ static int resctrl_mkdir_mondata_dom(struct kernfs_node *parent_kn,
{ {
struct resctrl_resource *r; struct resctrl_resource *r;
struct raw_resctrl_resource *rr; 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];
...@@ -671,11 +654,10 @@ static int resctrl_mkdir_mondata_dom(struct kernfs_node *parent_kn, ...@@ -671,11 +654,10 @@ static int resctrl_mkdir_mondata_dom(struct kernfs_node *parent_kn,
md.u.rid = r->rid; md.u.rid = r->rid;
md.u.domid = d->id; md.u.domid = d->id;
/* monitoring use reqpartid (reqpartid) */ /* monitoring use reqpartid (reqpartid) */
resctrl_cdp_map(clos, prgrp->closid.reqpartid, s->conf_type, hw_closid); resctrl_cdp_mpamid_map_val(prgrp->closid.reqpartid, s->conf_type,
md.u.partid = hw_closid_val(hw_closid); md.u.partid);
resctrl_cdp_map(mon, get_rmid_mon(prgrp->mon.rmid, r->rid), resctrl_cdp_mpamid_map_val(get_rmid_mon(prgrp->mon.rmid, r->rid),
s->conf_type, hw_monid); s->conf_type, md.u.mon);
md.u.mon = hw_monid_val(hw_monid);
ret = mpam_rmid_to_partid_pmg(prgrp->mon.rmid, NULL, &pmg); ret = mpam_rmid_to_partid_pmg(prgrp->mon.rmid, NULL, &pmg);
if (ret) if (ret)
...@@ -861,7 +843,7 @@ static void rdtgroup_init_mba(struct resctrl_schema *s, u32 closid) ...@@ -861,7 +843,7 @@ static void rdtgroup_init_mba(struct resctrl_schema *s, u32 closid)
cfg = &d->staged_cfg[CDP_BOTH]; cfg = &d->staged_cfg[CDP_BOTH];
cfg->cdp_both_ctrl = s->cdp_mc_both; cfg->cdp_both_ctrl = s->cdp_mc_both;
cfg->new_ctrl[SCHEMA_COMM] = rr->ctrl_features[SCHEMA_COMM].default_ctrl; cfg->new_ctrl[SCHEMA_COMM] = rr->ctrl_features[SCHEMA_COMM].default_ctrl;
resctrl_cdp_map(clos, closid, CDP_BOTH, cfg->hw_closid); resctrl_cdp_mpamid_map(closid, CDP_BOTH, cfg->hw_closid);
cfg->have_new_ctrl = true; cfg->have_new_ctrl = true;
/* Set extension ctrl default value, e.g. priority/hardlimit */ /* Set extension ctrl default value, e.g. priority/hardlimit */
for_each_extend_ctrl_type(t) { for_each_extend_ctrl_type(t) {
...@@ -917,7 +899,7 @@ static int rdtgroup_init_cat(struct resctrl_schema *s, u32 closid) ...@@ -917,7 +899,7 @@ static int rdtgroup_init_cat(struct resctrl_schema *s, u32 closid)
return -ENOSPC; return -ENOSPC;
} }
resctrl_cdp_map(clos, closid, conf_type, cfg->hw_closid); resctrl_cdp_mpamid_map(closid, conf_type, cfg->hw_closid);
cfg->have_new_ctrl = true; cfg->have_new_ctrl = true;
/* /*
......
...@@ -1965,13 +1965,8 @@ void __mpam_sched_in(void) ...@@ -1965,13 +1965,8 @@ void __mpam_sched_in(void)
resctrl_navie_rmid_partid_pmg(rmid, (int *)&reqpartid, (int *)&pmg); resctrl_navie_rmid_partid_pmg(rmid, (int *)&reqpartid, (int *)&pmg);
if (resctrl_cdp_enabled) { if (resctrl_cdp_enabled) {
hw_closid_t hw_closid; resctrl_cdp_mpamid_map_val(reqpartid, CDP_DATA, partid_d);
resctrl_cdp_mpamid_map_val(reqpartid, CDP_CODE, partid_i);
resctrl_cdp_map(clos, reqpartid, CDP_DATA, hw_closid);
partid_d = hw_closid_val(hw_closid);
resctrl_cdp_map(clos, reqpartid, CDP_CODE, hw_closid);
partid_i = hw_closid_val(hw_closid);
/* set in EL0 */ /* set in EL0 */
reg = mpam_read_sysreg_s(SYS_MPAM0_EL1, "SYS_MPAM0_EL1"); reg = mpam_read_sysreg_s(SYS_MPAM0_EL1, "SYS_MPAM0_EL1");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册