diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-07-19 04:49:00 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-19 13:04:49 -0400 |
commit | 96645678cd726e87ce42a0664de71e047e32bca4 (patch) | |
tree | 116f568a090414777b481e8e5d9db55f420e4335 /include | |
parent | 443aef0eddfa44c158d1b94ebb431a70638fcab4 (diff) |
lockstat: measure lock bouncing
__acquire
|
lock _____
| \
| __contended
| |
| wait
| _______/
|/
|
__acquired
|
__release
|
unlock
We measure acquisition and contention bouncing.
This is done by recording a cpu stamp in each lock instance.
Contention bouncing requires the cpu stamp to be set on acquisition. Hence we
move __acquired into the generic path.
__acquired is then used to measure acquisition bouncing by comparing the
current cpu with the old stamp before replacing it.
__contended is used to measure contention bouncing (only useful for preemptable
locks)
[akpm@linux-foundation.org: cleanups]
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/lockdep.h | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 3d3386b88b6a..0e843bf65877 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
@@ -130,12 +130,24 @@ struct lock_time { | |||
130 | unsigned long nr; | 130 | unsigned long nr; |
131 | }; | 131 | }; |
132 | 132 | ||
133 | enum bounce_type { | ||
134 | bounce_acquired_write, | ||
135 | bounce_acquired_read, | ||
136 | bounce_contended_write, | ||
137 | bounce_contended_read, | ||
138 | nr_bounce_types, | ||
139 | |||
140 | bounce_acquired = bounce_acquired_write, | ||
141 | bounce_contended = bounce_contended_write, | ||
142 | }; | ||
143 | |||
133 | struct lock_class_stats { | 144 | struct lock_class_stats { |
134 | unsigned long contention_point[4]; | 145 | unsigned long contention_point[4]; |
135 | struct lock_time read_waittime; | 146 | struct lock_time read_waittime; |
136 | struct lock_time write_waittime; | 147 | struct lock_time write_waittime; |
137 | struct lock_time read_holdtime; | 148 | struct lock_time read_holdtime; |
138 | struct lock_time write_holdtime; | 149 | struct lock_time write_holdtime; |
150 | unsigned long bounces[nr_bounce_types]; | ||
139 | }; | 151 | }; |
140 | 152 | ||
141 | struct lock_class_stats lock_stats(struct lock_class *class); | 153 | struct lock_class_stats lock_stats(struct lock_class *class); |
@@ -150,6 +162,9 @@ struct lockdep_map { | |||
150 | struct lock_class_key *key; | 162 | struct lock_class_key *key; |
151 | struct lock_class *class_cache; | 163 | struct lock_class *class_cache; |
152 | const char *name; | 164 | const char *name; |
165 | #ifdef CONFIG_LOCK_STAT | ||
166 | int cpu; | ||
167 | #endif | ||
153 | }; | 168 | }; |
154 | 169 | ||
155 | /* | 170 | /* |
@@ -321,8 +336,8 @@ do { \ | |||
321 | if (!try(_lock)) { \ | 336 | if (!try(_lock)) { \ |
322 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ | 337 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ |
323 | lock(_lock); \ | 338 | lock(_lock); \ |
324 | lock_acquired(&(_lock)->dep_map); \ | ||
325 | } \ | 339 | } \ |
340 | lock_acquired(&(_lock)->dep_map); \ | ||
326 | } while (0) | 341 | } while (0) |
327 | 342 | ||
328 | #else /* CONFIG_LOCK_STAT */ | 343 | #else /* CONFIG_LOCK_STAT */ |