From: Peter Zijlstra Date: Mon, 6 Jun 2011 10:32:43 +0000 (+0200) Subject: lockdep: Fix lock_is_held() on recursion X-Git-Tag: firefly_0821_release~10164^2~6^2~31 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=eef1d4dd92bcdb285b3ce056d8180e2867b9497c;p=firefly-linux-kernel-4.4.55.git lockdep: Fix lock_is_held() on recursion commit f2513cde93f0957d5dc6c09bc24b0cccd27d8e1d upstream. The main lock_is_held() user is lockdep_assert_held(), avoid false assertions in lockdep_off() sections by unconditionally reporting the lock is taken. [ the reason this is important is a lockdep_assert_held() in ttwu() which triggers a warning under lockdep_off() as in printk() which can trigger another wakeup and lock up due to spinlock recursion, as reported and heroically debugged by Arne Jansen ] Reported-and-tested-by: Arne Jansen Signed-off-by: Peter Zijlstra Cc: Linus Torvalds Link: http://lkml.kernel.org/r/1307398759.2497.966.camel@laptop Signed-off-by: Ingo Molnar Signed-off-by: Greg Kroah-Hartman --- diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 9af56723c096..d86fe8966265 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c @@ -3243,7 +3243,7 @@ int lock_is_held(struct lockdep_map *lock) int ret = 0; if (unlikely(current->lockdep_recursion)) - return ret; + return 1; /* avoid false negative lockdep_assert_held() */ raw_local_irq_save(flags); check_flags(flags);