Re: Linux 3.16-rc6

From: Waiman Long
Date: Mon Jul 28 2014 - 12:37:25 EST


On 07/25/2014 12:10 PM, Peter Zijlstra wrote:
On Thu, Jul 24, 2014 at 04:38:28PM -0400, Waiman Long wrote:
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.



I am planning to take out the check in check_deadlock and only have the test in lock_acquire which change a 3 to 2 when in interrupt context. Now my question is whether to do it as a new patch on top of the existing one in tip or a total replacement. I also intend to use symbolic names for the read states for better readability as suggested by John.

-Longman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/