aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2007-07-19 04:49:00 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-19 13:04:49 -0400
commit96645678cd726e87ce42a0664de71e047e32bca4 (patch)
tree116f568a090414777b481e8e5d9db55f420e4335 /include
parent443aef0eddfa44c158d1b94ebb431a70638fcab4 (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.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 3d3386b88b6..0e843bf6587 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
133enum 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
133struct lock_class_stats { 144struct 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
141struct lock_class_stats lock_stats(struct lock_class *class); 153struct 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 */