diff --git a/arch/arm64/kernel/mpam/mpam_ctrlmon.c b/arch/arm64/kernel/mpam/mpam_ctrlmon.c index 0aab9f8c9a9675010181abfd3cc4735cb14e85e9..12e188f0b788c8be77a22854ae57d589ef87c34c 100644 --- a/arch/arm64/kernel/mpam/mpam_ctrlmon.c +++ b/arch/arm64/kernel/mpam/mpam_ctrlmon.c @@ -216,11 +216,9 @@ static void resctrl_group_resync_domain_ctrls(struct rdtgroup *rdtgrp, for (i = staged_start; i <= staged_end; i++) { cdp_both_ctrl = cfg[i].cdp_both_ctrl; - /* - * for ctrl group configuration, hw_closid of cfg[i] equals - * to rdtgrp->closid.intpartid. - */ - closid.intpartid = hw_closid_val(cfg[i].hw_closid); + + resctrl_cdp_mpamid_map_val(rdtgrp->closid.intpartid, + cfg[i].conf_type, closid.intpartid); resctrl_cdp_mpamid_map_val(rdtgrp->closid.reqpartid, cfg[i].conf_type, closid.reqpartid); resctrl_dom_ctrl_config(cdp_both_ctrl, r, dom, ¶); @@ -229,8 +227,6 @@ static void resctrl_group_resync_domain_ctrls(struct rdtgroup *rdtgrp, * we should synchronize all child mon groups' * configuration from this ctrl rdtgrp */ - resctrl_cdp_mpamid_map_val(rdtgrp->closid.intpartid, - cfg[i].conf_type, closid.intpartid); head = &rdtgrp->mon.crdtgrp_list; list_for_each_entry(entry, head, mon.crdtgrp_list) { resctrl_cdp_mpamid_map_val(entry->closid.reqpartid, @@ -260,11 +256,9 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp, continue; update_on = false; cdp_both_ctrl = cfg[i].cdp_both_ctrl; - /* - * for ctrl group configuration, hw_closid of cfg[i] equals - * to rdtgrp->closid.intpartid. - */ - closid.intpartid = hw_closid_val(cfg[i].hw_closid); + + resctrl_cdp_mpamid_map_val(rdtgrp->closid.intpartid, + cfg[i].conf_type, closid.intpartid); for_each_ctrl_type(type) { /* if ctrl group's config has changed, refresh it first. */ if (dom->ctrl_val[type][closid.intpartid] != cfg[i].new_ctrl[type] && @@ -279,6 +273,7 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp, dom->ctrl_val[type][closid.intpartid] = cfg[i].new_ctrl[type]; dom->have_new_ctrl = true; + cfg[i].ctrl_updated[type] = false; update_on = true; } } @@ -289,8 +284,6 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp, * we should synchronize all child mon groups' * configuration from this ctrl rdtgrp */ - resctrl_cdp_mpamid_map_val(rdtgrp->closid.intpartid, - cfg[i].conf_type, closid.intpartid); head = &rdtgrp->mon.crdtgrp_list; list_for_each_entry(entry, head, mon.crdtgrp_list) { resctrl_cdp_mpamid_map_val(entry->closid.reqpartid, diff --git a/fs/resctrlfs.c b/fs/resctrlfs.c index bdb095f16f135205d2110090c7b24e97b1acaf27..56f2a63ea43be49ddee2df94fd473c46c2afb8e9 100644 --- a/fs/resctrlfs.c +++ b/fs/resctrlfs.c @@ -549,31 +549,38 @@ static int find_rdtgrp_allocable_rmid(struct resctrl_group *rdtgrp) prgrp = rdtgrp->mon.parent; - do { - rmid = rmid_alloc(prgrp->closid.reqpartid); - if (rmid >= 0) - break; + /* + * Create ctrl group under root group, just allocate new partid + */ + if (rdtgrp->type == RDTCTRL_GROUP) + goto rmid_realloc; - head = &prgrp->mon.crdtgrp_list; - list_for_each_entry(entry, head, mon.crdtgrp_list) { - if (entry == rdtgrp) - continue; + rmid = rmid_alloc(prgrp->closid.reqpartid); + if (rmid >= 0) + goto rmid_attach; - rmid = rmid_alloc(entry->closid.reqpartid); - if (rmid >= 0) - break; - } - } while (0); + head = &prgrp->mon.crdtgrp_list; + list_for_each_entry(entry, head, mon.crdtgrp_list) { + if (entry == rdtgrp) + continue; + rmid = rmid_alloc(entry->closid.reqpartid); + if (rmid >= 0) + goto rmid_attach; + } + +rmid_realloc: + rmid = rmid_alloc(-1); if (rmid < 0) - rmid = rmid_alloc(-1); + return rmid; +rmid_attach: ret = mpam_rmid_to_partid_pmg(rmid, &reqpartid, NULL); if (ret) return ret; + rdtgrp->mon.rmid = rmid; rdtgrp->closid.reqpartid = reqpartid; - return rmid; }