summaryrefslogtreecommitdiffstats
path: root/kernel/mutex.c
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2007-07-19 01:48:58 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-19 10:04:49 -0700
commit4fe87745a6722d42ff27a60768c77958fa1fc498 (patch)
treeadb116303fda951e0f7fc997db5de683e1bd8527 /kernel/mutex.c
parentc46261de0d98372112d8edf16f74ce418a268d46 (diff)
downloadlinux-4fe87745a6722d42ff27a60768c77958fa1fc498.tar.gz
linux-4fe87745a6722d42ff27a60768c77958fa1fc498.tar.xz
lockstat: hook into spinlock_t, rwlock_t, rwsem and mutex
Call the new lockstat tracking functions from the various lock primitives. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Ingo Molnar <mingo@elte.hu> Acked-by: Jason Baron <jbaron@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/mutex.c')
-rw-r--r--kernel/mutex.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/mutex.c b/kernel/mutex.c
index 303eab18484b..7a3f32761f26 100644
--- a/kernel/mutex.c
+++ b/kernel/mutex.c
@@ -139,6 +139,12 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass)
list_add_tail(&waiter.list, &lock->wait_list);
waiter.task = task;
+ old_val = atomic_xchg(&lock->count, -1);
+ if (old_val == 1)
+ goto done;
+
+ lock_contended(&lock->dep_map, _RET_IP_);
+
for (;;) {
/*
* Lets try to take the lock again - this is needed even if
@@ -174,6 +180,8 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass)
spin_lock_mutex(&lock->wait_lock, flags);
}
+ lock_acquired(&lock->dep_map);
+done:
/* got the lock - rejoice! */
mutex_remove_waiter(lock, &waiter, task_thread_info(task));
debug_mutex_set_owner(lock, task_thread_info(task));