| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Jiri Kosina <jkosina@suse.cz> |
| Date: Fri, 13 Jul 2018 16:23:23 +0200 |
| Subject: cpu/hotplug: Expose SMT control init function |
| |
| From: Jiri Kosina <jkosina@suse.cz> |
| |
| commit 8e1b706b6e819bed215c0db16345568864660393 upstream |
| |
| The L1TF mitigation will gain a commend line parameter which allows to set |
| a combination of hypervisor mitigation and SMT control. |
| |
| Expose cpu_smt_disable() so the command line parser can tweak SMT settings. |
| |
| [ tglx: Split out of larger patch and made it preserve an already existing |
| force off state ] |
| |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| 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.039715135@linutronix.de |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/linux/cpu.h | 2 ++ |
| kernel/cpu.c | 16 +++++++++++++--- |
| 2 files changed, 15 insertions(+), 3 deletions(-) |
| |
| --- a/include/linux/cpu.h |
| +++ b/include/linux/cpu.h |
| @@ -266,8 +266,10 @@ 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); |
| #else |
| # define cpu_smt_control (CPU_SMT_ENABLED) |
| +static inline void cpu_smt_disable(bool force) { } |
| #endif |
| |
| #endif /* _LINUX_CPU_H_ */ |
| --- a/kernel/cpu.c |
| +++ b/kernel/cpu.c |
| @@ -360,13 +360,23 @@ EXPORT_SYMBOL_GPL(cpu_hotplug_enable); |
| enum cpuhp_smt_control cpu_smt_control __read_mostly = CPU_SMT_ENABLED; |
| EXPORT_SYMBOL_GPL(cpu_smt_control); |
| |
| -static int __init smt_cmdline_disable(char *str) |
| +void __init cpu_smt_disable(bool force) |
| { |
| - cpu_smt_control = CPU_SMT_DISABLED; |
| - if (str && !strcmp(str, "force")) { |
| + if (cpu_smt_control == CPU_SMT_FORCE_DISABLED || |
| + cpu_smt_control == CPU_SMT_NOT_SUPPORTED) |
| + return; |
| + |
| + if (force) { |
| pr_info("SMT: Force disabled\n"); |
| cpu_smt_control = CPU_SMT_FORCE_DISABLED; |
| + } else { |
| + cpu_smt_control = CPU_SMT_DISABLED; |
| } |
| +} |
| + |
| +static int __init smt_cmdline_disable(char *str) |
| +{ |
| + cpu_smt_disable(str && !strcmp(str, "force")); |
| return 0; |
| } |
| early_param("nosmt", smt_cmdline_disable); |