diff options
Diffstat (limited to 'include/linux/lockdep.h')
-rw-r--r-- | include/linux/lockdep.h | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 29aec6e10020..8956daf64abd 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
@@ -73,6 +73,8 @@ struct lock_class_key { | |||
73 | struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; | 73 | struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | #define LOCKSTAT_POINTS 4 | ||
77 | |||
76 | /* | 78 | /* |
77 | * The lock-class itself: | 79 | * The lock-class itself: |
78 | */ | 80 | */ |
@@ -119,7 +121,8 @@ struct lock_class { | |||
119 | int name_version; | 121 | int name_version; |
120 | 122 | ||
121 | #ifdef CONFIG_LOCK_STAT | 123 | #ifdef CONFIG_LOCK_STAT |
122 | unsigned long contention_point[4]; | 124 | unsigned long contention_point[LOCKSTAT_POINTS]; |
125 | unsigned long contending_point[LOCKSTAT_POINTS]; | ||
123 | #endif | 126 | #endif |
124 | }; | 127 | }; |
125 | 128 | ||
@@ -144,6 +147,7 @@ enum bounce_type { | |||
144 | 147 | ||
145 | struct lock_class_stats { | 148 | struct lock_class_stats { |
146 | unsigned long contention_point[4]; | 149 | unsigned long contention_point[4]; |
150 | unsigned long contending_point[4]; | ||
147 | struct lock_time read_waittime; | 151 | struct lock_time read_waittime; |
148 | struct lock_time write_waittime; | 152 | struct lock_time write_waittime; |
149 | struct lock_time read_holdtime; | 153 | struct lock_time read_holdtime; |
@@ -165,6 +169,7 @@ struct lockdep_map { | |||
165 | const char *name; | 169 | const char *name; |
166 | #ifdef CONFIG_LOCK_STAT | 170 | #ifdef CONFIG_LOCK_STAT |
167 | int cpu; | 171 | int cpu; |
172 | unsigned long ip; | ||
168 | #endif | 173 | #endif |
169 | }; | 174 | }; |
170 | 175 | ||
@@ -356,7 +361,7 @@ struct lock_class_key { }; | |||
356 | #ifdef CONFIG_LOCK_STAT | 361 | #ifdef CONFIG_LOCK_STAT |
357 | 362 | ||
358 | extern void lock_contended(struct lockdep_map *lock, unsigned long ip); | 363 | extern void lock_contended(struct lockdep_map *lock, unsigned long ip); |
359 | extern void lock_acquired(struct lockdep_map *lock); | 364 | extern void lock_acquired(struct lockdep_map *lock, unsigned long ip); |
360 | 365 | ||
361 | #define LOCK_CONTENDED(_lock, try, lock) \ | 366 | #define LOCK_CONTENDED(_lock, try, lock) \ |
362 | do { \ | 367 | do { \ |
@@ -364,13 +369,13 @@ do { \ | |||
364 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ | 369 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ |
365 | lock(_lock); \ | 370 | lock(_lock); \ |
366 | } \ | 371 | } \ |
367 | lock_acquired(&(_lock)->dep_map); \ | 372 | lock_acquired(&(_lock)->dep_map, _RET_IP_); \ |
368 | } while (0) | 373 | } while (0) |
369 | 374 | ||
370 | #else /* CONFIG_LOCK_STAT */ | 375 | #else /* CONFIG_LOCK_STAT */ |
371 | 376 | ||
372 | #define lock_contended(lockdep_map, ip) do {} while (0) | 377 | #define lock_contended(lockdep_map, ip) do {} while (0) |
373 | #define lock_acquired(lockdep_map) do {} while (0) | 378 | #define lock_acquired(lockdep_map, ip) do {} while (0) |
374 | 379 | ||
375 | #define LOCK_CONTENDED(_lock, try, lock) \ | 380 | #define LOCK_CONTENDED(_lock, try, lock) \ |
376 | lock(_lock) | 381 | lock(_lock) |
@@ -481,4 +486,22 @@ static inline void print_irqtrace_events(struct task_struct *curr) | |||
481 | # define lock_map_release(l) do { } while (0) | 486 | # define lock_map_release(l) do { } while (0) |
482 | #endif | 487 | #endif |
483 | 488 | ||
489 | #ifdef CONFIG_PROVE_LOCKING | ||
490 | # define might_lock(lock) \ | ||
491 | do { \ | ||
492 | typecheck(struct lockdep_map *, &(lock)->dep_map); \ | ||
493 | lock_acquire(&(lock)->dep_map, 0, 0, 0, 2, NULL, _THIS_IP_); \ | ||
494 | lock_release(&(lock)->dep_map, 0, _THIS_IP_); \ | ||
495 | } while (0) | ||
496 | # define might_lock_read(lock) \ | ||
497 | do { \ | ||
498 | typecheck(struct lockdep_map *, &(lock)->dep_map); \ | ||
499 | lock_acquire(&(lock)->dep_map, 0, 0, 1, 2, NULL, _THIS_IP_); \ | ||
500 | lock_release(&(lock)->dep_map, 0, _THIS_IP_); \ | ||
501 | } while (0) | ||
502 | #else | ||
503 | # define might_lock(lock) do { } while (0) | ||
504 | # define might_lock_read(lock) do { } while (0) | ||
505 | #endif | ||
506 | |||
484 | #endif /* __LINUX_LOCKDEP_H */ | 507 | #endif /* __LINUX_LOCKDEP_H */ |