Skip to content

Commit

Permalink
arm64/mpam: Supplement additional useful ctrl features for mount options
Browse files Browse the repository at this point in the history
hulk inclusion
category: feature
bugzilla: 34278
CVE: NA

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

Based on 61fa56e1dd8a ("arm64/mpam: Add resctrl_ctrl_feature structure to manage
ctrl features"), we add several ctrl features and supply corresponding
mount options, including mbPbm, mbMax, mbMin, mbPrio, caMax, caPrio, caPbm,
if MPAM system supports relevant features, we can mount resctrl like this:

e.g.
   > mount -t resctrl resctrl /sys/fs/resctrl -o mbMax,mbMin,caPrio
   > cd /sys/fs/resctrl && cat schemata
     L3:0=0x7fff;1=0x7fff;2=0x7fff;3=0x7fff #default select cpbm as basic ctrl feature
     L3PRI:0=3;1=3;2=3;3=3
     MBMAX:0=100;1=100;2=100;3=100
     MBMIN:0=0;1=0;2=0;3=0

   > mount -t resctrl resctrl /sys/fs/resctrl
   > cd /sys/fs/resctrl && cat schemata
     L3:0=0x7fff;1=0x7fff;2=0x7fff;3=0x7fff #default select cpbm as basic ctrl feature
     MB:0=100;1=100;2=100;3=100  #default select mbw max as basic ctrl feature

   > mount -t resctrl resctrl /sys/fs/resctrl -o caMax
   > cd /sys/fs/resctrl && cat schemata
     L3:0=33554432;1=33554432;2=33554432;3=33554432 #use cmax ctrl feature
     MB:0=100;1=100;2=100;3=100  #default select mbw max as basic ctrl feature

For Cache MSCs, basic ctrl features include cmax(Cache Maximum Capacity)
and cpbm(Cache protion bitmap) partition, if mount options are not specified,
default cpbm will be selected.

For Memory MSCs, basic ctrl features include max(Memory Bandwidth Maximum)
and pbm(Memory Bandwidth Portion Bitmap) partition, if mount options are
not specified, default max will be selected.

Above mount options also can be used accompany with cdp options.

e.g.
   > mount -t resctrl resctrl /sys/fs/resctrl -o caMax,caPrio,cdpl3
   > cd /sys/fs/resctrl && cat schemata
     L3CODE:0=33554432;1=33554432;2=33554432;3=33554432 #code use cmax ctrl feature
     L3DATA:0=33554432;1=33554432;2=33554432;3=33554432 #data use cmax ctrl feature
     L3CODEPRI:0=3;1=3;2=3;3=3 #code use intpriority ctrl feature
     L3DATAPRI:0=3;1=3;2=3;3=3 #data use intpriority ctrl feature
     MB:0=100;1=100;2=100;3=100  #default select mbw max as basic ctrl feature

By combining these mount parameters can we use MPAM more powerfully.

Signed-off-by: Wang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-by: Xiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: Cheng Jian <cj.chengjian@huawei.com>
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Cheng Jian <cj.chengjian@huawei.com>
  • Loading branch information
Wang ShaoBo authored and Yang Yingliang committed Feb 24, 2021
1 parent 897f544 commit 8139268
Show file tree
Hide file tree
Showing 5 changed files with 218 additions and 40 deletions.
18 changes: 12 additions & 6 deletions arch/arm64/include/asm/resctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,15 @@ enum rdt_event_id {
QOS_L3_MBM_LOCAL_EVENT_ID = 0x03,

QOS_CAT_CPBM_EVENT_ID = 0x04,
QOS_CAT_INTPRI_EVENT_ID = 0x05,
QOS_CAT_DSPRI_EVENT_ID = 0x06,
QOS_MBA_MAX_EVENT_ID = 0x07,
QOS_MBA_INTPRI_EVENT_ID = 0x08,
QOS_MBA_DSPRI_EVENT_ID = 0x09,
QOS_MBA_HDL_EVENT_ID = 0x0a,
QOS_CAT_CMAX_EVENT_ID = 0x05,
QOS_CAT_INTPRI_EVENT_ID = 0x06,
QOS_CAT_DSPRI_EVENT_ID = 0x07,
QOS_MBA_MAX_EVENT_ID = 0x08,
QOS_MBA_MIN_EVENT_ID = 0x09,
QOS_MBA_PBM_EVENT_ID = 0x0a,
QOS_MBA_INTPRI_EVENT_ID = 0x0b,
QOS_MBA_DSPRI_EVENT_ID = 0x0c,
QOS_MBA_HDL_EVENT_ID = 0x0d,
/* Must be the last */
RESCTRL_NUM_EVENT_IDS,
};
Expand Down Expand Up @@ -165,6 +168,9 @@ enum resctrl_ctrl_type {
SCHEMA_COMM = 0,
SCHEMA_PRI,
SCHEMA_HDL,
SCHEMA_PBM,
SCHEMA_MAX,
SCHEMA_MIN,
SCHEMA_NUM_CTRL_TYPE
};

Expand Down
33 changes: 32 additions & 1 deletion arch/arm64/kernel/mpam/mpam_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,11 @@ u16 mpam_sysprops_num_pmg(void)
return mpam_sysprops.max_pmg + 1;
}

u32 mpam_sysprops_llc_size(void)
{
return mpam_sysprops.mpam_llc_size;
}

static u32 mpam_device_read_csu_mon(struct mpam_device *dev,
struct sync_args *args)
{
Expand Down Expand Up @@ -1317,7 +1322,7 @@ mpam_device_config(struct mpam_device *dev, struct sd_closid *closid,
u16 cmax = GENMASK(dev->cmax_wd, 0);
u32 pri_val = 0;
u16 intpri, dspri, max_intpri, max_dspri;
u32 mbw_pbm, mbw_max;
u32 mbw_pbm, mbw_max, mbw_min;
/*
* if dev supports narrowing, narrowing first and then apply this slave's
* configuration.
Expand Down Expand Up @@ -1366,6 +1371,13 @@ mpam_device_config(struct mpam_device *dev, struct sd_closid *closid,
}
}

if (mpam_has_feature(mpam_feat_mbw_min, dev->features)) {
if (cfg && mpam_has_feature(mpam_feat_mbw_min, cfg->valid)) {
mbw_min = MBW_MAX_SET(cfg->mbw_min, dev->bwa_wd);
mpam_write_reg(dev, MPAMCFG_MBW_MIN, mbw_min);
}
}

if (mpam_has_feature(mpam_feat_intpri_part, dev->features) ||
mpam_has_feature(mpam_feat_dspri_part, dev->features)) {
if (mpam_has_feature(mpam_feat_intpri_part, cfg->valid) &&
Expand Down Expand Up @@ -1596,13 +1608,32 @@ static void mpam_component_read_mpamcfg(void *_ctx)
break;
val = mpam_read_reg(dev, MPAMCFG_CPBM);
break;
case QOS_CAT_CMAX_EVENT_ID:
if (!mpam_has_feature(mpam_feat_ccap_part, dev->features))
break;
val = mpam_read_reg(dev, MPAMCFG_CMAX);
break;
case QOS_MBA_MAX_EVENT_ID:
if (!mpam_has_feature(mpam_feat_mbw_max, dev->features))
break;
val = mpam_read_reg(dev, MPAMCFG_MBW_MAX);
range = MBW_MAX_BWA_FRACT(dev->bwa_wd);
val = MBW_MAX_GET(val, dev->bwa_wd) * (MAX_MBA_BW - 1) / range;
break;
case QOS_MBA_MIN_EVENT_ID:
if (!mpam_has_feature(mpam_feat_mbw_min, dev->features))
break;
val = mpam_read_reg(dev, MPAMCFG_MBW_MIN);
range = MBW_MAX_BWA_FRACT(dev->bwa_wd);
val = MBW_MAX_GET(val, dev->bwa_wd) * (MAX_MBA_BW - 1) / range;
break;
case QOS_MBA_PBM_EVENT_ID:
if (!mpam_has_feature(mpam_feat_mbw_part, dev->features))
break;
val = mpam_read_reg(dev, MPAMCFG_MBW_PBM);
range = dev->mbw_pbm_bits;
val = val * MAX_MBA_BW / range;
break;
case QOS_MBA_HDL_EVENT_ID:
if (!mpam_has_feature(mpam_feat_mbw_max, dev->features))
break;
Expand Down
3 changes: 3 additions & 0 deletions arch/arm64/kernel/mpam/mpam_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,10 @@ struct mpam_config {
mpam_features_t valid;

u32 cpbm;
u32 cmax;
u32 mbw_pbm;
u16 mbw_max;
u16 mbw_min;

/*
* dspri is downstream priority, intpri is internal priority.
Expand Down Expand Up @@ -311,6 +313,7 @@ void mpam_component_get_config(struct mpam_component *comp,

u16 mpam_sysprops_num_partid(void);
u16 mpam_sysprops_num_pmg(void);
u32 mpam_sysprops_llc_size(void);

void mpam_class_list_lock_held(void);

Expand Down
120 changes: 109 additions & 11 deletions arch/arm64/kernel/mpam/mpam_resctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,13 +146,31 @@ struct raw_resctrl_resource raw_resctrl_resources_all[] = {
.base = 16,
.evt = QOS_CAT_CPBM_EVENT_ID,
.capable = 1,
.ctrl_suffix = "",
},
[SCHEMA_PRI] = {
.type = SCHEMA_PRI,
.flags = SCHEMA_PRI,
.name = "caPrio",
.base = 10,
.evt = QOS_CAT_INTPRI_EVENT_ID,
.ctrl_suffix = "PRI",
},
[SCHEMA_PBM] = {
.type = SCHEMA_PBM,
.flags = SCHEMA_COMM,
.name = "caPbm",
.base = 16,
.evt = QOS_CAT_CPBM_EVENT_ID,
.ctrl_suffix = "PBM",
},
[SCHEMA_MAX] = {
.type = SCHEMA_MAX,
.flags = SCHEMA_COMM,
.name = "caMax",
.base = 10,
.evt = QOS_CAT_CMAX_EVENT_ID,
.ctrl_suffix = "MAX",
},
},
},
Expand All @@ -172,13 +190,31 @@ struct raw_resctrl_resource raw_resctrl_resources_all[] = {
.base = 16,
.evt = QOS_CAT_CPBM_EVENT_ID,
.capable = 1,
.ctrl_suffix = "",
},
[SCHEMA_PRI] = {
.type = SCHEMA_PRI,
.flags = SCHEMA_PRI,
.name = "caPrio",
.base = 10,
.evt = QOS_CAT_INTPRI_EVENT_ID,
.ctrl_suffix = "PRI",
},
[SCHEMA_PBM] = {
.type = SCHEMA_PBM,
.flags = SCHEMA_COMM,
.name = "caPbm",
.base = 16,
.evt = QOS_CAT_CPBM_EVENT_ID,
.ctrl_suffix = "PBM",
},
[SCHEMA_MAX] = {
.type = SCHEMA_MAX,
.flags = SCHEMA_COMM,
.name = "caMax",
.base = 10,
.evt = QOS_CAT_CMAX_EVENT_ID,
.ctrl_suffix = "MAX",
},
},
},
Expand All @@ -198,20 +234,47 @@ struct raw_resctrl_resource raw_resctrl_resources_all[] = {
.base = 10,
.evt = QOS_MBA_MAX_EVENT_ID,
.capable = 1,
.ctrl_suffix = "",
},
[SCHEMA_PRI] = {
.type = SCHEMA_PRI,
.flags = SCHEMA_PRI,
.name = "mbPrio",
.base = 10,
.evt = QOS_MBA_INTPRI_EVENT_ID,
.ctrl_suffix = "PRI",
},
[SCHEMA_HDL] = {
.type = SCHEMA_HDL,
.flags = SCHEMA_HDL,
.name = "mbHdl",
.base = 10,
.evt = QOS_MBA_HDL_EVENT_ID,
.ctrl_suffix = "HDL",
},
[SCHEMA_PBM] = {
.type = SCHEMA_PBM,
.flags = SCHEMA_COMM,
.name = "mbPbm",
.base = 16,
.evt = QOS_MBA_PBM_EVENT_ID,
.ctrl_suffix = "PBM",
},
[SCHEMA_MAX] = {
.type = SCHEMA_MAX,
.flags = SCHEMA_COMM,
.name = "mbMax",
.base = 10,
.evt = QOS_MBA_MAX_EVENT_ID,
.ctrl_suffix = "MAX",
},
[SCHEMA_MIN] = {
.type = SCHEMA_MIN,
.flags = SCHEMA_COMM,
.name = "mbMin",
.base = 10,
.evt = QOS_MBA_MIN_EVENT_ID,
.ctrl_suffix = "MIN",
},
},
},
Expand Down Expand Up @@ -270,6 +333,8 @@ parse_bw(char *buf, struct resctrl_resource *r,

switch (rr->ctrl_features[type].evt) {
case QOS_MBA_MAX_EVENT_ID:
case QOS_MBA_MIN_EVENT_ID:
case QOS_MBA_PBM_EVENT_ID:
if (kstrtoul(buf, rr->ctrl_features[type].base, &data))
return -EINVAL;
data = (data < r->mbw.min_bw) ? r->mbw.min_bw : data;
Expand Down Expand Up @@ -342,6 +407,8 @@ static u64 mbw_rdmsr(struct resctrl_resource *r, struct rdt_domain *d,

switch (rr->ctrl_features[para->type].evt) {
case QOS_MBA_MAX_EVENT_ID:
case QOS_MBA_MIN_EVENT_ID:
case QOS_MBA_PBM_EVENT_ID:
result = roundup(result, r->mbw.bw_gran);
break;
default:
Expand Down Expand Up @@ -1067,14 +1134,21 @@ static int extend_ctrl_enable(char *tok)
if (!r->alloc_capable)
continue;
rr = r->res;
for_each_ctrl_type(type) {
for_each_extend_ctrl_type(type) {
feature = &rr->ctrl_features[type];
if (!feature->capable || !feature->name)
continue;
if (strcmp(feature->name, tok))
continue;
if (rr->ctrl_features[type].capable) {
rr->ctrl_features[type].enabled = true;
match = true;
}

rr->ctrl_features[type].enabled = true;
/*
* If we chose to enable a feature also embraces
* SCHEMA_COMM, SCHEMA_COMM will not be selected.
*/
if (feature->flags == SCHEMA_COMM)
rr->ctrl_features[SCHEMA_COMM].enabled = false;;
match = true;
}
}

Expand All @@ -1088,11 +1162,15 @@ static void extend_ctrl_disable(void)
{
struct raw_resctrl_resource *rr;
struct mpam_resctrl_res *res;
struct resctrl_ctrl_feature *feature;
enum resctrl_ctrl_type type;

for_each_supported_resctrl_exports(res) {
rr = res->resctrl_res.res;
rr->ctrl_features[SCHEMA_PRI].enabled = false;
rr->ctrl_features[SCHEMA_HDL].enabled = false;
for_each_extend_ctrl_type(type) {
feature = &rr->ctrl_features[type];
feature->enabled = false;
}
}
}

Expand All @@ -1104,6 +1182,7 @@ int parse_rdtgroupfs_options(char *data)

disable_cdp();
extend_ctrl_disable();
basic_ctrl_enable();

while ((token = strsep(&o, ",")) != NULL) {
if (!*token) {
Expand All @@ -1126,8 +1205,6 @@ int parse_rdtgroupfs_options(char *data)
}
}

basic_ctrl_enable();

return 0;

out:
Expand Down Expand Up @@ -2008,22 +2085,43 @@ mpam_update_from_resctrl_cfg(struct mpam_resctrl_res *res,
u64 range;

switch (evt) {
case QOS_MBA_PBM_EVENT_ID:
/* .. the number of bits we can set */
range = res->class->mbw_pbm_bits;
mpam_cfg->mbw_pbm =
(resctrl_cfg * range) / MAX_MBA_BW;
mpam_set_feature(mpam_feat_mbw_part, &mpam_cfg->valid);
break;
case QOS_MBA_MAX_EVENT_ID:
/* .. the number of fractions we can represent */
range = MBW_MAX_BWA_FRACT(res->class->bwa_wd);
mpam_cfg->mbw_max = (resctrl_cfg * range) / (MAX_MBA_BW - 1);
mpam_cfg->mbw_max =
(mpam_cfg->mbw_max > range) ? range : mpam_cfg->mbw_max;
mpam_set_feature(mpam_feat_mbw_max, &mpam_cfg->valid);
break;
case QOS_MBA_MIN_EVENT_ID:
range = MBW_MAX_BWA_FRACT(res->class->bwa_wd);
mpam_cfg->mbw_min = (resctrl_cfg * range) / (MAX_MBA_BW - 1);
mpam_cfg->mbw_min =
(mpam_cfg->mbw_min > range) ? range : mpam_cfg->mbw_min;
mpam_set_feature(mpam_feat_mbw_min, &mpam_cfg->valid);
break;
case QOS_MBA_HDL_EVENT_ID:
mpam_cfg->hdl = resctrl_cfg;
mpam_set_feature(mpam_feat_part_hdl, &mpam_cfg->valid);
break;
case QOS_MBA_INTPRI_EVENT_ID:
mpam_cfg->intpri = resctrl_cfg;
mpam_set_feature(mpam_feat_intpri_part, &mpam_cfg->valid);
break;
case QOS_CAT_CPBM_EVENT_ID:
mpam_cfg->cpbm = resctrl_cfg;
mpam_set_feature(mpam_feat_cpor_part, &mpam_cfg->valid);
break;
case QOS_CAT_CMAX_EVENT_ID:
mpam_cfg->cmax = resctrl_cfg;
mpam_set_feature(mpam_feat_ccap_part, &mpam_cfg->valid);
break;
case QOS_CAT_INTPRI_EVENT_ID:
mpam_cfg->intpri = resctrl_cfg;
mpam_set_feature(mpam_feat_intpri_part, &mpam_cfg->valid);
Expand Down Expand Up @@ -2079,7 +2177,7 @@ mpam_resctrl_update_component_cfg(struct resctrl_resource *r,

resctrl_cfg = d->ctrl_val[type][intpartid];
mpam_update_from_resctrl_cfg(res, resctrl_cfg,
type, slave_mpam_cfg);
rr->ctrl_features[type].evt, slave_mpam_cfg);
}
}

Expand Down
Loading

0 comments on commit 8139268

Please sign in to comment.