The following commit has been merged into the locking/core branch of tip: Commit-ID: a0855d24fc22d49cdc25664fb224caee16998683 Gitweb: https://git.kernel.org/tip/a0855d24fc22d49cdc25664fb224caee16998683 Author: Davidlohr Bueso <dave@xxxxxxxxxxxx> AuthorDate: Thu, 24 Oct 2019 20:36:34 -07:00 Committer: Ingo Molnar <mingo@xxxxxxxxxx> CommitterDate: Tue, 29 Oct 2019 12:22:52 +01:00 locking/mutex: Complain upon mutex API misuse in IRQ contexts Add warning checks if mutex_trylock() or mutex_unlock() are used in IRQ contexts, under CONFIG_DEBUG_MUTEXES=y. While the mutex rules and semantics are explicitly documented, this allows to expose any abusers and robustifies the whole thing. While trylock and unlock are non-blocking, calling from IRQ context is still forbidden (lock must be within the same context as unlock). Signed-off-by: Davidlohr Bueso <dbueso@xxxxxxx> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: dave@xxxxxxxxxxxx Link: https://lkml.kernel.org/r/20191025033634.3330-1-dave@xxxxxxxxxxxx Signed-off-by: Ingo Molnar <mingo@xxxxxxxxxx> --- kernel/locking/mutex.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 5352ce5..54cc5f9 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -733,6 +733,9 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne */ void __sched mutex_unlock(struct mutex *lock) { +#ifdef CONFIG_DEBUG_MUTEXES + WARN_ON(in_interrupt()); +#endif #ifndef CONFIG_DEBUG_LOCK_ALLOC if (__mutex_unlock_fast(lock)) return; @@ -1413,6 +1416,7 @@ int __sched mutex_trylock(struct mutex *lock) #ifdef CONFIG_DEBUG_MUTEXES DEBUG_LOCKS_WARN_ON(lock->magic != lock); + WARN_ON(in_interrupt()); #endif locked = __mutex_trylock(lock);
![]() |