[RFC][PATCH 6/7] lockdep: lock protection locks

Previous thread: [RFC][PATCH 2/7] lockdep: lock_set_subclass - reset a held locks subclass by Peter Zijlstra on Monday, August 4, 2008 - 9:03 am. (2 messages)

Next thread: reiser4 for 2.6.27-rc1 by Tim Tassonis on Monday, August 4, 2008 - 8:26 am. (20 messages)
To: Linus Torvalds <torvalds@...>, David Miller <davem@...>, <jeremy@...>, <hugh@...>, <mingo@...>, <akpm@...>, <a.p.zijlstra@...>, <linux-kernel@...>, <davej@...>
Date: Monday, August 4, 2008 - 9:03 am

Do as Linus suggested. The lock protection lock is called nest_lock.

Note that we still have the MAX_LOCK_DEPTH (48) limit to consider, so anything
that spills that it still up shit creek.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
include/linux/lockdep.h | 34 ++++++++++++++++++----------------
include/linux/rcuclassic.h | 2 +-
kernel/lockdep.c | 26 +++++++++++++++++++++-----
3 files changed, 40 insertions(+), 22 deletions(-)

Index: linux-2.6/kernel/lockdep.c
===================================================================
--- linux-2.6.orig/kernel/lockdep.c
+++ linux-2.6/kernel/lockdep.c
@@ -1372,18 +1372,32 @@ check_deadlock(struct task_struct *curr,
struct lockdep_map *next_instance, int read)
{
struct held_lock *prev;
+ struct held_lock *nest = NULL;
int i;

for (i = 0; i < curr->lockdep_depth; i++) {
prev = curr->held_locks + i;
+
+ if (prev->instance == next->nest_lock)
+ nest = prev;
+
if (hlock_class(prev) != hlock_class(next))
continue;
+
/*
* Allow read-after-read recursion of the same
* lock class (i.e. read_lock(lock)+read_lock(lock)):
*/
if ((read == 2) && prev->read)
return 2;
+
+ /*
+ * We're holding the nest_lock, which serializes this lock's
+ * nesting behaviour.
+ */
+ if (nest)
+ return 2;
+
return print_deadlock_bug(curr, prev, next);
}
return 1;
@@ -2507,7 +2521,7 @@ EXPORT_SYMBOL_GPL(lockdep_init_map);
*/
static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
int trylock, int read, int check, int hardirqs_off,
- unsigned long ip)
+ struct lockdep_map *nest_lock, unsigned long ip)
{
struct task_struct *curr = current;
struct lock_class *class = NULL;
@@ -2566,6 +2580,7 @@ static int __lock_acquire(struct lockdep
hlock->class_idx = class - lock_classes + 1;
hlock->acquire_ip = ip;
hlock->instance = lock;
+ hlock->nest_lock = n...

Previous thread: [RFC][PATCH 2/7] lockdep: lock_set_subclass - reset a held locks subclass by Peter Zijlstra on Monday, August 4, 2008 - 9:03 am. (2 messages)

Next thread: reiser4 for 2.6.27-rc1 by Tim Tassonis on Monday, August 4, 2008 - 8:26 am. (20 messages)