diff options
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) | |||
| 139 | list_add_tail(&waiter.list, &lock->wait_list); | 139 | list_add_tail(&waiter.list, &lock->wait_list); |
| 140 | waiter.task = task; | 140 | waiter.task = task; |
| 141 | 141 | ||
| 142 | old_val = atomic_xchg(&lock->count, -1); | ||
| 143 | if (old_val == 1) | ||
| 144 | goto done; | ||
| 145 | |||
| 146 | lock_contended(&lock->dep_map, _RET_IP_); | ||
| 147 | |||
| 142 | for (;;) { | 148 | for (;;) { |
| 143 | /* | 149 | /* |
| 144 | * Lets try to take the lock again - this is needed even if | 150 | * 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) | |||
| 174 | spin_lock_mutex(&lock->wait_lock, flags); | 180 | spin_lock_mutex(&lock->wait_lock, flags); |
| 175 | } | 181 | } |
| 176 | 182 | ||
| 183 | lock_acquired(&lock->dep_map); | ||
| 184 | done: | ||
| 177 | /* got the lock - rejoice! */ | 185 | /* got the lock - rejoice! */ |
| 178 | mutex_remove_waiter(lock, &waiter, task_thread_info(task)); | 186 | mutex_remove_waiter(lock, &waiter, task_thread_info(task)); |
| 179 | debug_mutex_set_owner(lock, task_thread_info(task)); | 187 | debug_mutex_set_owner(lock, task_thread_info(task)); |
