diff options
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 13 |
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) { } | |||
| 102 | int die(const char *str, struct pt_regs *regs, long err) | 102 | int 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; |
