[PATCH] x86_64: Don't enable interrupt unconditionally in reboot path
authorAndi Kleen <ak@suse.de>
Sat, 5 Nov 2005 16:25:54 +0000 (17:25 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 15 Nov 2005 03:55:16 +0000 (19:55 -0800)
When they were disabled before (e.g. after a panic) it's better
to keep them off, otherwise followon panics can happen from timer
interrupt handlers etc.

Drawback is that pageup in the console won't work anymore though.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/kernel/reboot.c
arch/x86_64/kernel/smp.c

index 47f95687905fd22d417d54632a40b784d186ed82..97804bc2c0a0d9001943ff9b1e4b87628ae28c50 100644 (file)
@@ -77,6 +77,7 @@ static inline void kb_wait(void)
 
 void machine_shutdown(void)
 {
+       unsigned long flags;
        /* Stop the cpus and apics */
 #ifdef CONFIG_SMP
        int reboot_cpu_id;
@@ -98,7 +99,7 @@ void machine_shutdown(void)
        smp_send_stop();
 #endif
 
-       local_irq_disable();
+       local_irq_save(flags);
 
 #ifndef CONFIG_SMP
        disable_local_APIC();
@@ -106,7 +107,7 @@ void machine_shutdown(void)
 
        disable_IO_APIC();
 
-       local_irq_enable();
+       local_irq_restore(flags);
 }
 
 void machine_emergency_restart(void)
index 493a0d1f12791581cabf4f21dd9aca9c41b0c105..cfc3d9dccbd9151d0d7ddc47b0fe87802bf7b003 100644 (file)
@@ -450,13 +450,14 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
 
 void smp_stop_cpu(void)
 {
+       unsigned long flags;
        /*
         * Remove this CPU:
         */
        cpu_clear(smp_processor_id(), cpu_online_map);
-       local_irq_disable();
+       local_irq_save(flags);
        disable_local_APIC();
-       local_irq_enable(); 
+       local_irq_restore(flags);
 }
 
 static void smp_really_stop_cpu(void *dummy)