]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
[PATCH] Fix potential interrupts during alternative patching
authorZachary Amsden <zach@vmware.com>
Fri, 20 Oct 2006 21:18:51 +0000 (14:18 -0700)
committerChris Wright <chrisw@sous-sol.org>
Sat, 4 Nov 2006 01:33:47 +0000 (17:33 -0800)
Interrupts must be disabled during alternative instruction patching.
On systems with high timer IRQ rates, or when running in an emulator,
timing differences can result in random kernel panics because of
running partially patched instructions.  This doesn't yet fix NMIs,
which requires extricating the patch code from the late bug checking
and is logically separate (and also less likely to cause problems).

Signed-off-by: Zachary Amsden <zach@vmware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
arch/i386/kernel/alternative.c

index 28ab8064976421ffab42ed3ba07b3063f8fee86b..583c238e17fb2e9550fbbcb490ba1a41288b97dc 100644 (file)
@@ -344,6 +344,7 @@ void alternatives_smp_switch(int smp)
 
 void __init alternative_instructions(void)
 {
+       unsigned long flags;
        if (no_replacement) {
                printk(KERN_INFO "(SMP-)alternatives turned off\n");
                free_init_pages("SMP alternatives",
@@ -351,6 +352,8 @@ void __init alternative_instructions(void)
                                (unsigned long)__smp_alt_end);
                return;
        }
+
+       local_irq_save(flags);
        apply_alternatives(__alt_instructions, __alt_instructions_end);
 
        /* switch to patch-once-at-boottime-only mode and free the
@@ -386,4 +389,5 @@ void __init alternative_instructions(void)
                alternatives_smp_switch(0);
        }
 #endif
+       local_irq_restore(flags);
 }