提交 9ce883be 编写于 作者: A Andi Kleen 提交者: Andi Kleen

[PATCH] x86: Remove noreplacement option

noreplacement is dangerous on modern systems because it will not replace the
context switch FNSAVE with SSE aware FXSAVE. But other places in the kernel still assume
SSE and do FXSAVE and the CPU will then access FXSAVE information with
FNSAVE and cause corruption.

Easiest way to avoid this is to remove the option. It was mostly for paranoia
reasons anyways and alternative()s have been stable for some time.

Thanks to Jeremy F. for reporting and helping debug it.
Signed-off-by: NAndi Kleen <ak@suse.de>
上级 cf6387da
...@@ -293,7 +293,3 @@ Debugging ...@@ -293,7 +293,3 @@ Debugging
stuck (default) stuck (default)
Miscellaneous Miscellaneous
noreplacement Don't replace instructions with more appropriate ones
for the CPU. This may be useful on asymmetric MP systems
where some CPUs have less capabilities than others.
...@@ -5,15 +5,9 @@ ...@@ -5,15 +5,9 @@
#include <asm/alternative.h> #include <asm/alternative.h>
#include <asm/sections.h> #include <asm/sections.h>
static int no_replacement = 0;
static int smp_alt_once = 0; static int smp_alt_once = 0;
static int debug_alternative = 0; static int debug_alternative = 0;
static int __init noreplacement_setup(char *s)
{
no_replacement = 1;
return 1;
}
static int __init bootonly(char *str) static int __init bootonly(char *str)
{ {
smp_alt_once = 1; smp_alt_once = 1;
...@@ -25,7 +19,6 @@ static int __init debug_alt(char *str) ...@@ -25,7 +19,6 @@ static int __init debug_alt(char *str)
return 1; return 1;
} }
__setup("noreplacement", noreplacement_setup);
__setup("smp-alt-boot", bootonly); __setup("smp-alt-boot", bootonly);
__setup("debug-alternative", debug_alt); __setup("debug-alternative", debug_alt);
...@@ -252,9 +245,6 @@ void alternatives_smp_module_add(struct module *mod, char *name, ...@@ -252,9 +245,6 @@ void alternatives_smp_module_add(struct module *mod, char *name,
struct smp_alt_module *smp; struct smp_alt_module *smp;
unsigned long flags; unsigned long flags;
if (no_replacement)
return;
if (smp_alt_once) { if (smp_alt_once) {
if (boot_cpu_has(X86_FEATURE_UP)) if (boot_cpu_has(X86_FEATURE_UP))
alternatives_smp_unlock(locks, locks_end, alternatives_smp_unlock(locks, locks_end,
...@@ -289,7 +279,7 @@ void alternatives_smp_module_del(struct module *mod) ...@@ -289,7 +279,7 @@ void alternatives_smp_module_del(struct module *mod)
struct smp_alt_module *item; struct smp_alt_module *item;
unsigned long flags; unsigned long flags;
if (no_replacement || smp_alt_once) if (smp_alt_once)
return; return;
spin_lock_irqsave(&smp_alt, flags); spin_lock_irqsave(&smp_alt, flags);
...@@ -320,7 +310,7 @@ void alternatives_smp_switch(int smp) ...@@ -320,7 +310,7 @@ void alternatives_smp_switch(int smp)
return; return;
#endif #endif
if (no_replacement || smp_alt_once) if (smp_alt_once)
return; return;
BUG_ON(!smp && (num_online_cpus() > 1)); BUG_ON(!smp && (num_online_cpus() > 1));
...@@ -386,13 +376,6 @@ extern struct paravirt_patch __start_parainstructions[], ...@@ -386,13 +376,6 @@ extern struct paravirt_patch __start_parainstructions[],
void __init alternative_instructions(void) void __init alternative_instructions(void)
{ {
unsigned long flags; unsigned long flags;
if (no_replacement) {
printk(KERN_INFO "(SMP-)alternatives turned off\n");
free_init_pages("SMP alternatives",
(unsigned long)__smp_alt_begin,
(unsigned long)__smp_alt_end);
return;
}
local_irq_save(flags); local_irq_save(flags);
apply_alternatives(__alt_instructions, __alt_instructions_end); apply_alternatives(__alt_instructions, __alt_instructions_end);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册