| From 9fe0450785abbc04b0ed5d3cf61fcdb8ab656b4b Mon Sep 17 00:00:00 2001 |
| From: James Morse <james.morse@arm.com> |
| Date: Fri, 21 Feb 2020 16:21:05 +0000 |
| Subject: x86/resctrl: Preserve CDP enable over CPU hotplug |
| |
| From: James Morse <james.morse@arm.com> |
| |
| commit 9fe0450785abbc04b0ed5d3cf61fcdb8ab656b4b upstream. |
| |
| Resctrl assumes that all CPUs are online when the filesystem is mounted, |
| and that CPUs remember their CDP-enabled state over CPU hotplug. |
| |
| This goes wrong when resctrl's CDP-enabled state changes while all the |
| CPUs in a domain are offline. |
| |
| When a domain comes online, enable (or disable!) CDP to match resctrl's |
| current setting. |
| |
| Fixes: 5ff193fbde20 ("x86/intel_rdt: Add basic resctrl filesystem support") |
| Suggested-by: Reinette Chatre <reinette.chatre@intel.com> |
| Signed-off-by: James Morse <james.morse@arm.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lkml.kernel.org/r/20200221162105.154163-1-james.morse@arm.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/cpu/resctrl/core.c | 2 ++ |
| arch/x86/kernel/cpu/resctrl/internal.h | 1 + |
| arch/x86/kernel/cpu/resctrl/rdtgroup.c | 13 +++++++++++++ |
| 3 files changed, 16 insertions(+) |
| |
| --- a/arch/x86/kernel/cpu/resctrl/core.c |
| +++ b/arch/x86/kernel/cpu/resctrl/core.c |
| @@ -578,6 +578,8 @@ static void domain_add_cpu(int cpu, stru |
| d->id = id; |
| cpumask_set_cpu(cpu, &d->cpu_mask); |
| |
| + rdt_domain_reconfigure_cdp(r); |
| + |
| if (r->alloc_capable && domain_setup_ctrlval(r, d)) { |
| kfree(d); |
| return; |
| --- a/arch/x86/kernel/cpu/resctrl/internal.h |
| +++ b/arch/x86/kernel/cpu/resctrl/internal.h |
| @@ -601,5 +601,6 @@ bool has_busy_rmid(struct rdt_resource * |
| void __check_limbo(struct rdt_domain *d, bool force_free); |
| bool cbm_validate_intel(char *buf, u32 *data, struct rdt_resource *r); |
| bool cbm_validate_amd(char *buf, u32 *data, struct rdt_resource *r); |
| +void rdt_domain_reconfigure_cdp(struct rdt_resource *r); |
| |
| #endif /* _ASM_X86_RESCTRL_INTERNAL_H */ |
| --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c |
| +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c |
| @@ -1769,6 +1769,19 @@ static int set_cache_qos_cfg(int level, |
| return 0; |
| } |
| |
| +/* Restore the qos cfg state when a domain comes online */ |
| +void rdt_domain_reconfigure_cdp(struct rdt_resource *r) |
| +{ |
| + if (!r->alloc_capable) |
| + return; |
| + |
| + if (r == &rdt_resources_all[RDT_RESOURCE_L2DATA]) |
| + l2_qos_cfg_update(&r->alloc_enabled); |
| + |
| + if (r == &rdt_resources_all[RDT_RESOURCE_L3DATA]) |
| + l3_qos_cfg_update(&r->alloc_enabled); |
| +} |
| + |
| /* |
| * Enable or disable the MBA software controller |
| * which helps user specify bandwidth in MBps. |