diff options
author | James Morse <james.morse@arm.com> | 2021-07-28 20:06:37 +0300 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2021-08-11 19:39:42 +0300 |
commit | 5c3b63cdba441c6a530b974ff73b14161d96a0c3 (patch) | |
tree | 464801a2901ad0b692870ed811cc4708519b455c /arch/x86/kernel/cpu/resctrl/core.c | |
parent | 327364d5b6b6f8c89d2d6253a986d80323512890 (diff) | |
download | linux-5c3b63cdba441c6a530b974ff73b14161d96a0c3.tar.xz |
x86/resctrl: Merge the CDP resources
resctrl uses struct rdt_resource to describe the available hardware
resources. The domains of the CDP aliases share a single ctrl_val[]
array. The only differences between the struct rdt_hw_resource aliases
is the name and conf_type.
The name from struct rdt_hw_resource is visible to user-space. To
support another architecture, as many user-visible details should be
handled in the filesystem parts of the code that is common to all
architectures. The name and conf_type go together.
Remove conf_type and the CDP aliases. When CDP is supported and enabled,
schemata_list_create() can create two schemata using the single
resource, generating the CODE/DATA suffix to the schema name itself.
This allows the alloc_ctrlval_array() and complications around free()ing
the ctrl_val arrays to be removed.
Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Jamie Iles <jamie@nuviainc.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lkml.kernel.org/r/20210728170637.25610-25-james.morse@arm.com
Diffstat (limited to 'arch/x86/kernel/cpu/resctrl/core.c')
-rw-r--r-- | arch/x86/kernel/cpu/resctrl/core.c | 178 |
1 files changed, 12 insertions, 166 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index 4c0b1265ffd4..4b8813bafffd 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -62,7 +62,6 @@ mba_wrmsr_amd(struct rdt_domain *d, struct msr_param *m, struct rdt_hw_resource rdt_resources_all[] = { [RDT_RESOURCE_L3] = { - .conf_type = CDP_NONE, .r_resctrl = { .rid = RDT_RESOURCE_L3, .name = "L3", @@ -78,45 +77,8 @@ struct rdt_hw_resource rdt_resources_all[] = { .msr_base = MSR_IA32_L3_CBM_BASE, .msr_update = cat_wrmsr, }, - [RDT_RESOURCE_L3DATA] = - { - .conf_type = CDP_DATA, - .r_resctrl = { - .rid = RDT_RESOURCE_L3DATA, - .name = "L3DATA", - .cache_level = 3, - .cache = { - .min_cbm_bits = 1, - }, - .domains = domain_init(RDT_RESOURCE_L3DATA), - .parse_ctrlval = parse_cbm, - .format_str = "%d=%0*x", - .fflags = RFTYPE_RES_CACHE, - }, - .msr_base = MSR_IA32_L3_CBM_BASE, - .msr_update = cat_wrmsr, - }, - [RDT_RESOURCE_L3CODE] = - { - .conf_type = CDP_CODE, - .r_resctrl = { - .rid = RDT_RESOURCE_L3CODE, - .name = "L3CODE", - .cache_level = 3, - .cache = { - .min_cbm_bits = 1, - }, - .domains = domain_init(RDT_RESOURCE_L3CODE), - .parse_ctrlval = parse_cbm, - .format_str = "%d=%0*x", - .fflags = RFTYPE_RES_CACHE, - }, - .msr_base = MSR_IA32_L3_CBM_BASE, - .msr_update = cat_wrmsr, - }, [RDT_RESOURCE_L2] = { - .conf_type = CDP_NONE, .r_resctrl = { .rid = RDT_RESOURCE_L2, .name = "L2", @@ -132,45 +94,8 @@ struct rdt_hw_resource rdt_resources_all[] = { .msr_base = MSR_IA32_L2_CBM_BASE, .msr_update = cat_wrmsr, }, - [RDT_RESOURCE_L2DATA] = - { - .conf_type = CDP_DATA, - .r_resctrl = { - .rid = RDT_RESOURCE_L2DATA, - .name = "L2DATA", - .cache_level = 2, - .cache = { - .min_cbm_bits = 1, - }, - .domains = domain_init(RDT_RESOURCE_L2DATA), - .parse_ctrlval = parse_cbm, - .format_str = "%d=%0*x", - .fflags = RFTYPE_RES_CACHE, - }, - .msr_base = MSR_IA32_L2_CBM_BASE, - .msr_update = cat_wrmsr, - }, - [RDT_RESOURCE_L2CODE] = - { - .conf_type = CDP_CODE, - .r_resctrl = { - .rid = RDT_RESOURCE_L2CODE, - .name = "L2CODE", - .cache_level = 2, - .cache = { - .min_cbm_bits = 1, - }, - .domains = domain_init(RDT_RESOURCE_L2CODE), - .parse_ctrlval = parse_cbm, - .format_str = "%d=%0*x", - .fflags = RFTYPE_RES_CACHE, - }, - .msr_base = MSR_IA32_L2_CBM_BASE, - .msr_update = cat_wrmsr, - }, [RDT_RESOURCE_MBA] = { - .conf_type = CDP_NONE, .r_resctrl = { .rid = RDT_RESOURCE_MBA, .name = "MB", @@ -339,40 +264,24 @@ static void rdt_get_cache_alloc_cfg(int idx, struct rdt_resource *r) r->alloc_enabled = true; } -static void rdt_get_cdp_config(int level, int type) +static void rdt_get_cdp_config(int level) { - struct rdt_resource *r_l = &rdt_resources_all[level].r_resctrl; - struct rdt_hw_resource *hw_res_l = resctrl_to_arch_res(r_l); - struct rdt_resource *r = &rdt_resources_all[type].r_resctrl; - struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); - - hw_res->num_closid = hw_res_l->num_closid; - r->cache.cbm_len = r_l->cache.cbm_len; - r->default_ctrl = r_l->default_ctrl; - r->cache.shareable_bits = r_l->cache.shareable_bits; - r->data_width = (r->cache.cbm_len + 3) / 4; - r->alloc_capable = true; /* * By default, CDP is disabled. CDP can be enabled by mount parameter * "cdp" during resctrl file system mount time. */ - r->alloc_enabled = false; rdt_resources_all[level].cdp_enabled = false; - rdt_resources_all[type].cdp_enabled = false; - r_l->cdp_capable = true; - r->cdp_capable = true; + rdt_resources_all[level].r_resctrl.cdp_capable = true; } static void rdt_get_cdp_l3_config(void) { - rdt_get_cdp_config(RDT_RESOURCE_L3, RDT_RESOURCE_L3DATA); - rdt_get_cdp_config(RDT_RESOURCE_L3, RDT_RESOURCE_L3CODE); + rdt_get_cdp_config(RDT_RESOURCE_L3); } static void rdt_get_cdp_l2_config(void) { - rdt_get_cdp_config(RDT_RESOURCE_L2, RDT_RESOURCE_L2DATA); - rdt_get_cdp_config(RDT_RESOURCE_L2, RDT_RESOURCE_L2CODE); + rdt_get_cdp_config(RDT_RESOURCE_L2); } static void @@ -509,57 +418,6 @@ void setup_default_ctrlval(struct rdt_resource *r, u32 *dc, u32 *dm) } } -static u32 *alloc_ctrlval_array(struct rdt_resource *r, struct rdt_domain *d, - bool mba_sc) -{ - /* these are for the underlying hardware, they may not match r/d */ - struct rdt_domain *underlying_domain; - struct rdt_hw_resource *hw_res; - struct rdt_hw_domain *hw_dom; - bool remapped; - - switch (r->rid) { - case RDT_RESOURCE_L3DATA: - case RDT_RESOURCE_L3CODE: - hw_res = &rdt_resources_all[RDT_RESOURCE_L3]; - remapped = true; - break; - case RDT_RESOURCE_L2DATA: - case RDT_RESOURCE_L2CODE: - hw_res = &rdt_resources_all[RDT_RESOURCE_L2]; - remapped = true; - break; - default: - hw_res = resctrl_to_arch_res(r); - remapped = false; - } - - /* - * If we changed the resource, we need to search for the underlying - * domain. Doing this for all resources would make it tricky to add the - * first resource, as domains aren't added to a resource list until - * after the ctrlval arrays have been allocated. - */ - if (remapped) - underlying_domain = rdt_find_domain(&hw_res->r_resctrl, d->id, - NULL); - else - underlying_domain = d; - hw_dom = resctrl_to_arch_dom(underlying_domain); - - if (mba_sc) { - if (hw_dom->mbps_val) - return hw_dom->mbps_val; - return kmalloc_array(hw_res->num_closid, - sizeof(*hw_dom->mbps_val), GFP_KERNEL); - } else { - if (hw_dom->ctrl_val) - return hw_dom->ctrl_val; - return kmalloc_array(hw_res->num_closid, - sizeof(*hw_dom->ctrl_val), GFP_KERNEL); - } -} - static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d) { struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); @@ -567,11 +425,13 @@ static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d) struct msr_param m; u32 *dc, *dm; - dc = alloc_ctrlval_array(r, d, false); + dc = kmalloc_array(hw_res->num_closid, sizeof(*hw_dom->ctrl_val), + GFP_KERNEL); if (!dc) return -ENOMEM; - dm = alloc_ctrlval_array(r, d, true); + dm = kmalloc_array(hw_res->num_closid, sizeof(*hw_dom->mbps_val), + GFP_KERNEL); if (!dm) { kfree(dc); return -ENOMEM; @@ -730,14 +590,8 @@ static void domain_remove_cpu(int cpu, struct rdt_resource *r) if (d->plr) d->plr->d = NULL; - /* temporary: these four don't have a unique ctrlval array */ - if (r->rid != RDT_RESOURCE_L3CODE && - r->rid != RDT_RESOURCE_L3DATA && - r->rid != RDT_RESOURCE_L2CODE && - r->rid != RDT_RESOURCE_L2DATA) { - kfree(hw_dom->ctrl_val); - kfree(hw_dom->mbps_val); - } + kfree(hw_dom->ctrl_val); + kfree(hw_dom->mbps_val); bitmap_free(d->rmid_busy_llc); kfree(d->mbm_total); kfree(d->mbm_local); @@ -1017,11 +871,7 @@ static __init void rdt_init_res_defs_intel(void) hw_res = resctrl_to_arch_res(r); if (r->rid == RDT_RESOURCE_L3 || - r->rid == RDT_RESOURCE_L3DATA || - r->rid == RDT_RESOURCE_L3CODE || - r->rid == RDT_RESOURCE_L2 || - r->rid == RDT_RESOURCE_L2DATA || - r->rid == RDT_RESOURCE_L2CODE) { + r->rid == RDT_RESOURCE_L2) { r->cache.arch_has_sparse_bitmaps = false; r->cache.arch_has_empty_bitmaps = false; r->cache.arch_has_per_cpu_cfg = false; @@ -1041,11 +891,7 @@ static __init void rdt_init_res_defs_amd(void) hw_res = resctrl_to_arch_res(r); if (r->rid == RDT_RESOURCE_L3 || - r->rid == RDT_RESOURCE_L3DATA || - r->rid == RDT_RESOURCE_L3CODE || - r->rid == RDT_RESOURCE_L2 || - r->rid == RDT_RESOURCE_L2DATA || - r->rid == RDT_RESOURCE_L2CODE) { + r->rid == RDT_RESOURCE_L2) { r->cache.arch_has_sparse_bitmaps = true; r->cache.arch_has_empty_bitmaps = true; r->cache.arch_has_per_cpu_cfg = true; |