hulk inclusion category: feature bugzilla: https://atomgit.com/openeuler/kernel/issues/8420 ------------------ Signed-off-by: Zeng Heng <zengheng4@huawei.com> --- drivers/platform/mpam/mpam_resctrl.c | 64 ++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/drivers/platform/mpam/mpam_resctrl.c b/drivers/platform/mpam/mpam_resctrl.c index e277934e8138..a49411da3368 100644 --- a/drivers/platform/mpam/mpam_resctrl.c +++ b/drivers/platform/mpam/mpam_resctrl.c @@ -1247,10 +1247,47 @@ void update_rmid_entries_for_reqpartid(u32 reqpartid) req_pmg2rmid(reqpartid, pmg)); } +static bool check_narrow_mkdir_limit(u32 closid) +{ + struct rdt_domain *d; + struct mpam_props *cprops; + struct mpam_resctrl_res *res; + struct mpam_resctrl_dom *dom; + struct rdt_resource *r = resctrl_arch_get_resource(RDT_RESOURCE_MBA); + struct rdt_resource *r_min = resctrl_arch_get_resource(RDT_RESOURCE_MB_MIN); + + res = container_of(r, struct mpam_resctrl_res, resctrl_res); + cprops = &res->class->props; + + if (mpam_has_feature(mpam_feat_partid_nrw, cprops)) + return false; + + if (get_num_reqpartid() == resctrl_arch_get_num_closid(NULL)) + return false; + + /* Config has changed */ + list_for_each_entry(d, &r->domains, list) { + dom = container_of(d, struct mpam_resctrl_dom, resctrl_dom); + + if (dom->comp->cfg[closid].mbw_max != + percent_to_mbw_max(r->default_ctrl, cprops->bwa_wd)) + return true; + + if (dom->comp->cfg[closid].mbw_min != + percent_to_mbw_max(r_min->default_ctrl, cprops->bwa_wd)) + return true; + } + + return false; +} + int resctrl_arch_expand_rmid(u32 intpartid) { int i; + if (check_narrow_mkdir_limit(intpartid)) + return -ENOSPC; + for (i = resctrl_arch_get_num_closid(NULL); i < get_num_reqpartid(); i++) { if (reqpartid_map[i] == U32_MAX) { @@ -1458,6 +1495,27 @@ u32 resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d, } } +static bool check_narrow_config_limit(u32 closid, struct mpam_props *cprops) +{ + int reqpartid; + int req_num = get_num_reqpartid(); + int closid_num = resctrl_arch_get_num_closid(NULL); + + if (mpam_has_feature(mpam_feat_partid_nrw, cprops)) + return false; + + if (req_num == closid_num) + return false; + + /* Already deploys reqPartid */ + for (reqpartid = closid_num; reqpartid < req_num; reqpartid++) { + if (req2intpartid(reqpartid) == closid) + return true; + } + + return false; +} + int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_domain *d, u32 closid, enum resctrl_conf_type t, u32 cfg_val) { @@ -1514,12 +1572,18 @@ int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_domain *d, mpam_set_feature(mpam_feat_mbw_part, &cfg); break; } else if (mpam_has_feature(mpam_feat_mbw_max, cprops)) { + if (check_narrow_config_limit(closid, cprops)) + return -EINVAL; + cfg.mbw_max = percent_to_mbw_max(cfg_val, cprops->bwa_wd); mpam_set_feature(mpam_feat_mbw_max, &cfg); break; } return -EINVAL; case RDT_RESOURCE_MB_MIN: + if (check_narrow_config_limit(closid, cprops)) + return -EINVAL; + cfg.mbw_min = percent_to_mbw_max(cfg_val, cprops->bwa_wd); mpam_set_feature(mpam_feat_mbw_min, &cfg); break; -- 2.25.1