powerpc: Fix second nested oops hang
authorNicholas Piggin <npiggin@gmail.com>
Tue, 8 Nov 2016 12:14:45 +0000 (23:14 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 18 Nov 2016 11:40:42 +0000 (22:40 +1100)
When ending an oops, don't clear die_owner unless the nest count
went to zero. This prevents a second nested oops from hanging forever
on the die_lock.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/traps.c

index 13ca8b687e8820410255357e676105725f99d629..3eb20d16c67c37b5a24c8dc9fd36b7e0e66731d8 100644 (file)
@@ -147,14 +147,15 @@ static void oops_end(unsigned long flags, struct pt_regs *regs,
                               int signr)
 {
        bust_spinlocks(0);
-       die_owner = -1;
        add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        oops_exit();
        printk("\n");
-       if (!die_nest_count)
+       if (!die_nest_count) {
                /* Nest count reaches zero, release the lock. */
+               die_owner = -1;
                arch_spin_unlock(&die_lock);
+       }
        raw_local_irq_restore(flags);
 
        crash_fadump(regs, "die oops");