diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-07-19 10:48:58 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-19 19:04:49 +0200 |
commit | 4fe87745a6722d42ff27a60768c77958fa1fc498 (patch) | |
tree | adb116303fda951e0f7fc997db5de683e1bd8527 /kernel/mutex.c | |
parent | lockstat: human readability tweaks (diff) | |
download | linux-4fe87745a6722d42ff27a60768c77958fa1fc498.tar.xz linux-4fe87745a6722d42ff27a60768c77958fa1fc498.zip |
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.c | 8 |
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)); |