aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/lockdep.h
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2009-07-20 13:15:35 -0400
committerIngo Molnar <mingo@elte.hu>2009-08-02 09:41:35 -0400
commitbb97a91e2549a7f2df9c21d32542582f549ab3ec (patch)
treefdddcb458b74a39e97089e5bcc93234cb50704c6 /include/linux/lockdep.h
parentf607c6685774811b8112e124f10a053d77015485 (diff)
lockdep: Deal with many similar locks
spin_lock_nest_lock() allows to take many instances of the same class, this can easily lead to overflow of MAX_LOCK_DEPTH. To avoid this overflow, we'll stop accounting instances but start reference counting the class in the held_lock structure. [ We could maintain a list of instances, if we'd move the hlock stuff into __lock_acquired(), but that would require significant modifications to the current code. ] We restrict this mode to spin_lock_nest_lock() only, because it degrades the lockdep quality due to lost of instance. For lockstat this means we don't track lock statistics for any but the first lock in the series. Currently nesting is limited to 11 bits because that was the spare space available in held_lock. This yields a 2048 instances maximium. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Marcelo Tosatti <mtosatti@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux/lockdep.h')
-rw-r--r--include/linux/lockdep.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index a6d5e5e4d08..47d42eff612 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -213,10 +213,12 @@ struct held_lock {
213 * interrupt context: 213 * interrupt context:
214 */ 214 */
215 unsigned int irq_context:2; /* bit 0 - soft, bit 1 - hard */ 215 unsigned int irq_context:2; /* bit 0 - soft, bit 1 - hard */
216 unsigned int trylock:1; 216 unsigned int trylock:1; /* 16 bits */
217
217 unsigned int read:2; /* see lock_acquire() comment */ 218 unsigned int read:2; /* see lock_acquire() comment */
218 unsigned int check:2; /* see lock_acquire() comment */ 219 unsigned int check:2; /* see lock_acquire() comment */
219 unsigned int hardirqs_off:1; 220 unsigned int hardirqs_off:1;
221 unsigned int references:11; /* 32 bits */
220}; 222};
221 223
222/* 224/*