aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
-rw-r--r--arch/powerpc/kernel/traps.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index d069ff8a7e03..4f99a3a04c65 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -102,11 +102,11 @@ static inline void pmac_backlight_unblank(void) { }
102int die(const char *str, struct pt_regs *regs, long err) 102int die(const char *str, struct pt_regs *regs, long err)
103{ 103{
104 static struct { 104 static struct {
105 spinlock_t lock; 105 raw_spinlock_t lock;
106 u32 lock_owner; 106 u32 lock_owner;
107 int lock_owner_depth; 107 int lock_owner_depth;
108 } die = { 108 } die = {
109 .lock = __SPIN_LOCK_UNLOCKED(die.lock), 109 .lock = __RAW_SPIN_LOCK_UNLOCKED(die.lock),
110 .lock_owner = -1, 110 .lock_owner = -1,
111 .lock_owner_depth = 0 111 .lock_owner_depth = 0
112 }; 112 };
@@ -120,7 +120,7 @@ int die(const char *str, struct pt_regs *regs, long err)
120 120
121 if (die.lock_owner != raw_smp_processor_id()) { 121 if (die.lock_owner != raw_smp_processor_id()) {
122 console_verbose(); 122 console_verbose();
123 spin_lock_irqsave(&die.lock, flags); 123 raw_spin_lock_irqsave(&die.lock, flags);
124 die.lock_owner = smp_processor_id(); 124 die.lock_owner = smp_processor_id();
125 die.lock_owner_depth = 0; 125 die.lock_owner_depth = 0;
126 bust_spinlocks(1); 126 bust_spinlocks(1);
@@ -155,7 +155,7 @@ int die(const char *str, struct pt_regs *regs, long err)
155 bust_spinlocks(0); 155 bust_spinlocks(0);
156 die.lock_owner = -1; 156 die.lock_owner = -1;
157 add_taint(TAINT_DIE); 157 add_taint(TAINT_DIE);
158 spin_unlock_irqrestore(&die.lock, flags); 158 raw_spin_unlock_irqrestore(&die.lock, flags);
159 159
160 if (kexec_should_crash(current) || 160 if (kexec_should_crash(current) ||
161 kexec_sr_activated(smp_processor_id())) 161 kexec_sr_activated(smp_processor_id()))
@@ -202,6 +202,11 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
202 addr, regs->nip, regs->link, code); 202 addr, regs->nip, regs->link, code);
203 } 203 }
204 204
205#ifdef CONFIG_PREEMPT_RT
206 local_irq_enable();
207 preempt_check_resched();
208#endif
209
205 memset(&info, 0, sizeof(info)); 210 memset(&info, 0, sizeof(info));
206 info.si_signo = signr; 211 info.si_signo = signr;
207 info.si_code = code; 212 info.si_code = code;