| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Fri, 13 Jul 2018 16:23:24 +0200 |
| Subject: cpu/hotplug: Set CPU_SMT_NOT_SUPPORTED early |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit fee0aede6f4739c87179eca76136f83210953b86 upstream |
| |
| The CPU_SMT_NOT_SUPPORTED state is set (if the processor does not support |
| SMT) when the sysfs SMT control file is initialized. |
| |
| That was fine so far as this was only required to make the output of the |
| control file correct and to prevent writes in that case. |
| |
| With the upcoming l1tf command line parameter, this needs to be set up |
| before the L1TF mitigation selection and command line parsing happens. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Jiri Kosina <jkosina@suse.cz> |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Link: https://lkml.kernel.org/r/20180713142323.121795971@linutronix.de |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kernel/cpu/bugs.c | 6 ++++++ |
| include/linux/cpu.h | 2 ++ |
| kernel/cpu.c | 13 ++++++++++--- |
| 3 files changed, 18 insertions(+), 3 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/bugs.c |
| +++ b/arch/x86/kernel/cpu/bugs.c |
| @@ -57,6 +57,12 @@ void __init check_bugs(void) |
| { |
| identify_boot_cpu(); |
| |
| + /* |
| + * identify_boot_cpu() initialized SMT support information, let the |
| + * core code know. |
| + */ |
| + cpu_smt_check_topology(); |
| + |
| if (!IS_ENABLED(CONFIG_SMP)) { |
| pr_info("CPU: "); |
| print_cpu_info(&boot_cpu_data); |
| --- a/include/linux/cpu.h |
| +++ b/include/linux/cpu.h |
| @@ -267,9 +267,11 @@ enum cpuhp_smt_control { |
| #if defined(CONFIG_SMP) && defined(CONFIG_HOTPLUG_SMT) |
| extern enum cpuhp_smt_control cpu_smt_control; |
| extern void cpu_smt_disable(bool force); |
| +extern void cpu_smt_check_topology(void); |
| #else |
| # define cpu_smt_control (CPU_SMT_ENABLED) |
| static inline void cpu_smt_disable(bool force) { } |
| +static inline void cpu_smt_check_topology(void) { } |
| #endif |
| |
| #endif /* _LINUX_CPU_H_ */ |
| --- a/kernel/cpu.c |
| +++ b/kernel/cpu.c |
| @@ -374,6 +374,16 @@ void __init cpu_smt_disable(bool force) |
| } |
| } |
| |
| +/* |
| + * The decision whether SMT is supported can only be done after the full |
| + * CPU identification. Called from architecture code. |
| + */ |
| +void __init cpu_smt_check_topology(void) |
| +{ |
| + if (!topology_smt_supported()) |
| + cpu_smt_control = CPU_SMT_NOT_SUPPORTED; |
| +} |
| + |
| static int __init smt_cmdline_disable(char *str) |
| { |
| cpu_smt_disable(str && !strcmp(str, "force")); |
| @@ -2053,9 +2063,6 @@ static const struct attribute_group cpuh |
| |
| static int __init cpu_smt_state_init(void) |
| { |
| - if (!topology_smt_supported()) |
| - cpu_smt_control = CPU_SMT_NOT_SUPPORTED; |
| - |
| return sysfs_create_group(&cpu_subsys.dev_root->kobj, |
| &cpuhp_smt_attr_group); |
| } |