aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/admin-guide/kernel-parameters.txt24
-rw-r--r--include/linux/cpu.h24
-rw-r--r--kernel/cpu.c15
3 files changed, 63 insertions, 0 deletions
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 858b6c0b9a15..720ffa9c4e04 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2513,6 +2513,30 @@
2513 in the "bleeding edge" mini2440 support kernel at 2513 in the "bleeding edge" mini2440 support kernel at
2514 http://repo.or.cz/w/linux-2.6/mini2440.git 2514 http://repo.or.cz/w/linux-2.6/mini2440.git
2515 2515
2516 mitigations=
2517 Control optional mitigations for CPU vulnerabilities.
2518 This is a set of curated, arch-independent options, each
2519 of which is an aggregation of existing arch-specific
2520 options.
2521
2522 off
2523 Disable all optional CPU mitigations. This
2524 improves system performance, but it may also
2525 expose users to several CPU vulnerabilities.
2526
2527 auto (default)
2528 Mitigate all CPU vulnerabilities, but leave SMT
2529 enabled, even if it's vulnerable. This is for
2530 users who don't want to be surprised by SMT
2531 getting disabled across kernel upgrades, or who
2532 have other ways of avoiding SMT-based attacks.
2533 This is the default behavior.
2534
2535 auto,nosmt
2536 Mitigate all CPU vulnerabilities, disabling SMT
2537 if needed. This is for users who always want to
2538 be fully mitigated, even if it means losing SMT.
2539
2516 mminit_loglevel= 2540 mminit_loglevel=
2517 [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this 2541 [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this
2518 parameter allows control of the logging verbosity for 2542 parameter allows control of the logging verbosity for
diff --git a/include/linux/cpu.h b/include/linux/cpu.h
index 5041357d0297..2d9c6f4b78f5 100644
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -187,4 +187,28 @@ static inline void cpu_smt_disable(bool force) { }
187static inline void cpu_smt_check_topology(void) { } 187static inline void cpu_smt_check_topology(void) { }
188#endif 188#endif
189 189
190/*
191 * These are used for a global "mitigations=" cmdline option for toggling
192 * optional CPU mitigations.
193 */
194enum cpu_mitigations {
195 CPU_MITIGATIONS_OFF,
196 CPU_MITIGATIONS_AUTO,
197 CPU_MITIGATIONS_AUTO_NOSMT,
198};
199
200extern enum cpu_mitigations cpu_mitigations;
201
202/* mitigations=off */
203static inline bool cpu_mitigations_off(void)
204{
205 return cpu_mitigations == CPU_MITIGATIONS_OFF;
206}
207
208/* mitigations=auto,nosmt */
209static inline bool cpu_mitigations_auto_nosmt(void)
210{
211 return cpu_mitigations == CPU_MITIGATIONS_AUTO_NOSMT;
212}
213
190#endif /* _LINUX_CPU_H_ */ 214#endif /* _LINUX_CPU_H_ */
diff --git a/kernel/cpu.c b/kernel/cpu.c
index d1c6d152da89..e70a90634b41 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -2279,3 +2279,18 @@ void __init boot_cpu_hotplug_init(void)
2279#endif 2279#endif
2280 this_cpu_write(cpuhp_state.state, CPUHP_ONLINE); 2280 this_cpu_write(cpuhp_state.state, CPUHP_ONLINE);
2281} 2281}
2282
2283enum cpu_mitigations cpu_mitigations __ro_after_init = CPU_MITIGATIONS_AUTO;
2284
2285static int __init mitigations_parse_cmdline(char *arg)
2286{
2287 if (!strcmp(arg, "off"))
2288 cpu_mitigations = CPU_MITIGATIONS_OFF;
2289 else if (!strcmp(arg, "auto"))
2290 cpu_mitigations = CPU_MITIGATIONS_AUTO;
2291 else if (!strcmp(arg, "auto,nosmt"))
2292 cpu_mitigations = CPU_MITIGATIONS_AUTO_NOSMT;
2293
2294 return 0;
2295}
2296early_param("mitigations", mitigations_parse_cmdline);