Track lock waittime - that is the time spend waiting on lock acquisition.
/proc/lock_waittime - starts with the same three colums as lock_contentions:
<class name> <(write) contentions> <read contentions>
After that come two times four more columns:
<nr> <min> <max> <total>
for both (write) contentions and read contentions. Times are in 1e-9 seconds.
Writing a 0 to the file clears the stats.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
include/linux/lockdep.h | 15 ++++++++
kernel/lockdep.c | 79 +++++++++++++++++++++++++++++++++++++++++++++
kernel/lockdep_proc.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++
kernel/mutex.c | 1
4 files changed, 179 insertions(+)
Index: linux-2.6/include/linux/lockdep.h
===================================================================
--- linux-2.6.orig/include/linux/lockdep.h 2007-05-22 23:46:47.000000000 +0200
+++ linux-2.6/include/linux/lockdep.h 2007-05-22 23:46:53.000000000 +0200
@@ -77,6 +77,13 @@ struct lock_contention_point {
atomic_t count;
};
+struct lock_time {
+ raw_spinlock_t lock;
+ unsigned long long min, max;
+ unsigned long long total;
+ unsigned long nr;
+};
+
/*
* The lock-class itself:
*/
@@ -125,6 +132,8 @@ struct lock_class {
atomic_t read_contentions;
atomic_t write_contentions;
struct lock_contention_point contention_point[4];
+ struct lock_time read_waittime;
+ struct lock_time write_waittime;
#endif
};
@@ -177,6 +186,9 @@ struct held_lock {
unsigned long acquire_ip;
struct lockdep_map *instance;
+#ifdef CONFIG_LOCK_STAT
+ unsigned long long waittime_stamp;
+#endif
/*
* The lock-stack is unified in that the lock chains of interrupt
* contexts nest ontop of process context chains, but we 'separate'
@@ -296,18 +308,21 @@ struct lock_class_key { };
#ifdef CONFIG_LOCK_STAT
extern void lock_contended(struct lockdep_map *lock, unsigned long ip);
+extern void lock_acquired(struct ...