Re: [PATCH v4] lib/spinlock_debug.c: prevent a recursive cycle in the debug code

From: Sergey Senozhatsky
Date: Thu Jan 28 2016 - 10:45:01 EST


On (01/28/16 19:53), Sergey Senozhatsky wrote:
> > ah... silly me... you mean the first CPU that triggers the spin_dump() will
> ^^^ this, of course, is true for
> console_sem->lock and logbuf_lock
> only.
>
> > deadlock itself, so the rest of CPUs will see endless recursive
> > spin_lock()->spin_dump()->spin_lock()->spin_dump() calls?
[..]
> > Can you please update your bug description in the commit message?
> > It's the deadlock that is causing the recursion on other CPUs in the
> > first place.

no, don't update anything. I was completely wrong. it's not a deadlock
that is the root cause here.

even if at some level of recursion (nested printk calls)
spin_dump()->__spin_lock_debug()->arch_spin_trylock() acquires the
lock, it returns back with the spin lock unlocked anyway.

vprintk_emit()
console_trylock()
spin_lock()
spin_dump()
vprintk_emit()
console_trylock()
spin_lock()
spin_dump()
vprintk_emit()
console_trylock()
spin_lock() << OK, got the lock finally
sem->count--
spin_unlock() << unlock, return
arch_spin_lock() << got the lock, return
sem->count--
spin_unlock() << unlock, return
arch_spin_lock() << got the lock, return
sem->count--
spin_unlock() << unlock, return


...um


> But I found there's a possiblity in the debug code *itself* to cause a
> lockup.

please explain.

-ss