Skip to content

Commit

Permalink
[PATCH] x86: Remove noreplacement option
Browse files Browse the repository at this point in the history
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: Andi Kleen <ak@suse.de>
  • Loading branch information
Andi Kleen authored and Andi Kleen committed Apr 24, 2007
1 parent cf6387d commit 9ce883b
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 23 deletions.
4 changes: 0 additions & 4 deletions Documentation/x86_64/boot-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,3 @@ Debugging
stuck (default)

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.
21 changes: 2 additions & 19 deletions arch/i386/kernel/alternative.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,9 @@
#include <asm/alternative.h>
#include <asm/sections.h>

static int no_replacement = 0;
static int smp_alt_once = 0;
static int debug_alternative = 0;

static int __init noreplacement_setup(char *s)
{
no_replacement = 1;
return 1;
}
static int __init bootonly(char *str)
{
smp_alt_once = 1;
Expand All @@ -25,7 +19,6 @@ static int __init debug_alt(char *str)
return 1;
}

__setup("noreplacement", noreplacement_setup);
__setup("smp-alt-boot", bootonly);
__setup("debug-alternative", debug_alt);

Expand Down Expand Up @@ -252,9 +245,6 @@ void alternatives_smp_module_add(struct module *mod, char *name,
struct smp_alt_module *smp;
unsigned long flags;

if (no_replacement)
return;

if (smp_alt_once) {
if (boot_cpu_has(X86_FEATURE_UP))
alternatives_smp_unlock(locks, locks_end,
Expand Down Expand Up @@ -289,7 +279,7 @@ void alternatives_smp_module_del(struct module *mod)
struct smp_alt_module *item;
unsigned long flags;

if (no_replacement || smp_alt_once)
if (smp_alt_once)
return;

spin_lock_irqsave(&smp_alt, flags);
Expand Down Expand Up @@ -320,7 +310,7 @@ void alternatives_smp_switch(int smp)
return;
#endif

if (no_replacement || smp_alt_once)
if (smp_alt_once)
return;
BUG_ON(!smp && (num_online_cpus() > 1));

Expand Down Expand Up @@ -386,13 +376,6 @@ extern struct paravirt_patch __start_parainstructions[],
void __init alternative_instructions(void)
{
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);
apply_alternatives(__alt_instructions, __alt_instructions_end);
Expand Down

0 comments on commit 9ce883b

Please sign in to comment.