[PATCH] fix i386 interrupt re-enabling in die()

From: Jan Beulich
Date: Thu Sep 08 2005 - 10:14:08 EST


(Note: Patch also attached because the inline version is certain to get
line wrapped.)

Rather than blindly re-enabling interrupts in die(), save their state
upon
entry and then restore that state.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

diff -Npru 2.6.13/arch/i386/kernel/traps.c
2.6.13-i386-die-irq/arch/i386/kernel/traps.c
--- 2.6.13/arch/i386/kernel/traps.c 2005-08-29 01:41:01.000000000
+0200
+++ 2.6.13-i386-die-irq/arch/i386/kernel/traps.c 2005-09-07
11:39:40.000000000 +0200
@@ -304,6 +304,7 @@ void die(const char * str, struct pt_reg
spinlock_t lock;
u32 lock_owner;
int lock_owner_depth;
+ unsigned long flags;
} die = {
.lock = SPIN_LOCK_UNLOCKED,
.lock_owner = -1,
@@ -313,7 +314,7 @@ void die(const char * str, struct pt_reg

if (die.lock_owner != raw_smp_processor_id()) {
console_verbose();
- spin_lock_irq(&die.lock);
+ spin_lock_irqsave(&die.lock, die.flags);
die.lock_owner = smp_processor_id();
die.lock_owner_depth = 0;
bust_spinlocks(1);
@@ -344,7 +345,7 @@ void die(const char * str, struct pt_reg

bust_spinlocks(0);
die.lock_owner = -1;
- spin_unlock_irq(&die.lock);
+ spin_unlock_irqrestore(&die.lock, die.flags);

if (kexec_should_crash(current))
crash_kexec(regs);

Attachment: linux-2.6.13-i386-die-irq.patch
Description: Binary data