Thread (17 messages) 17 messages, 6 authors, 2014-07-28

Re: Linux 3.16-rc6

From: Peter Zijlstra <peterz@infradead.org>
Date: 2014-07-25 16:10:24
Also in: lkml

On Thu, Jul 24, 2014 at 04:38:28PM -0400, Waiman Long wrote:
quoted hunk ↗ jump to hunk
Yes, I think I may have a solution for that.

Borislav, can you apply the following patch on top of the lockdep patch to
see if it can fix the problem?
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index d24e433..507a8ce 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -3595,6 +3595,12 @@ void lock_acquire(struct lockdep_map *lock, unsigned int
        raw_local_irq_save(flags);
        check_flags(flags);

+       /*
+        * An interrupt recursive read in interrupt context can be considered
+        * to be the same as a recursive read from checking perspective.
+        */
+       if ((read == 3) && in_interrupt())
+               read = 2;
        current->lockdep_recursion = 1;
        trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip);
        __lock_acquire(lock, subclass, trylock, read, check,
Just had another look at the initial patch and it cannot be right, even
with the above.

The problem is you cannot use in_interrupt() in check_deadlock().
Check_deadlock() must be context invariant, it should only test the
chain state and not rely on where or when its called.

Attachments

  • (unnamed) [application/pgp-signature] 836 bytes
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help