diff options
Diffstat (limited to 'include/linux/lockdep.h')
| -rw-r--r-- | include/linux/lockdep.h | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 331e5f1c2d8e..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 | ||
| @@ -331,10 +336,11 @@ static inline void lockdep_on(void) | |||
| 331 | # define lock_set_subclass(l, s, i) do { } while (0) | 336 | # define lock_set_subclass(l, s, i) do { } while (0) |
| 332 | # define lockdep_init() do { } while (0) | 337 | # define lockdep_init() do { } while (0) |
| 333 | # define lockdep_info() do { } while (0) | 338 | # define lockdep_info() do { } while (0) |
| 334 | # define lockdep_init_map(lock, name, key, sub) do { (void)(key); } while (0) | 339 | # define lockdep_init_map(lock, name, key, sub) \ |
| 340 | do { (void)(name); (void)(key); } while (0) | ||
| 335 | # define lockdep_set_class(lock, key) do { (void)(key); } while (0) | 341 | # define lockdep_set_class(lock, key) do { (void)(key); } while (0) |
| 336 | # define lockdep_set_class_and_name(lock, key, name) \ | 342 | # define lockdep_set_class_and_name(lock, key, name) \ |
| 337 | do { (void)(key); } while (0) | 343 | do { (void)(key); (void)(name); } while (0) |
| 338 | #define lockdep_set_class_and_subclass(lock, key, sub) \ | 344 | #define lockdep_set_class_and_subclass(lock, key, sub) \ |
| 339 | do { (void)(key); } while (0) | 345 | do { (void)(key); } while (0) |
| 340 | #define lockdep_set_subclass(lock, sub) do { } while (0) | 346 | #define lockdep_set_subclass(lock, sub) do { } while (0) |
| @@ -355,7 +361,7 @@ struct lock_class_key { }; | |||
| 355 | #ifdef CONFIG_LOCK_STAT | 361 | #ifdef CONFIG_LOCK_STAT |
| 356 | 362 | ||
| 357 | extern void lock_contended(struct lockdep_map *lock, unsigned long ip); | 363 | extern void lock_contended(struct lockdep_map *lock, unsigned long ip); |
| 358 | extern void lock_acquired(struct lockdep_map *lock); | 364 | extern void lock_acquired(struct lockdep_map *lock, unsigned long ip); |
| 359 | 365 | ||
| 360 | #define LOCK_CONTENDED(_lock, try, lock) \ | 366 | #define LOCK_CONTENDED(_lock, try, lock) \ |
| 361 | do { \ | 367 | do { \ |
| @@ -363,13 +369,13 @@ do { \ | |||
| 363 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ | 369 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ |
| 364 | lock(_lock); \ | 370 | lock(_lock); \ |
| 365 | } \ | 371 | } \ |
| 366 | lock_acquired(&(_lock)->dep_map); \ | 372 | lock_acquired(&(_lock)->dep_map, _RET_IP_); \ |
| 367 | } while (0) | 373 | } while (0) |
| 368 | 374 | ||
| 369 | #else /* CONFIG_LOCK_STAT */ | 375 | #else /* CONFIG_LOCK_STAT */ |
| 370 | 376 | ||
| 371 | #define lock_contended(lockdep_map, ip) do {} while (0) | 377 | #define lock_contended(lockdep_map, ip) do {} while (0) |
| 372 | #define lock_acquired(lockdep_map) do {} while (0) | 378 | #define lock_acquired(lockdep_map, ip) do {} while (0) |
| 373 | 379 | ||
| 374 | #define LOCK_CONTENDED(_lock, try, lock) \ | 380 | #define LOCK_CONTENDED(_lock, try, lock) \ |
| 375 | lock(_lock) | 381 | lock(_lock) |
| @@ -480,4 +486,22 @@ static inline void print_irqtrace_events(struct task_struct *curr) | |||
| 480 | # define lock_map_release(l) do { } while (0) | 486 | # define lock_map_release(l) do { } while (0) |
| 481 | #endif | 487 | #endif |
| 482 | 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 | |||
| 483 | #endif /* __LINUX_LOCKDEP_H */ | 507 | #endif /* __LINUX_LOCKDEP_H */ |
