diff options
Diffstat (limited to 'kernel/mutex.c')
-rw-r--r-- | kernel/mutex.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/kernel/mutex.c b/kernel/mutex.c index ff42e975590c..5d79781394a3 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c | |||
@@ -171,12 +171,6 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | |||
171 | struct thread_info *owner; | 171 | struct thread_info *owner; |
172 | 172 | ||
173 | /* | 173 | /* |
174 | * If there are pending waiters, join them. | ||
175 | */ | ||
176 | if (!list_empty(&lock->wait_list)) | ||
177 | break; | ||
178 | |||
179 | /* | ||
180 | * If there's an owner, wait for it to either | 174 | * If there's an owner, wait for it to either |
181 | * release the lock or go to sleep. | 175 | * release the lock or go to sleep. |
182 | */ | 176 | */ |
@@ -184,6 +178,13 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | |||
184 | if (owner && !mutex_spin_on_owner(lock, owner)) | 178 | if (owner && !mutex_spin_on_owner(lock, owner)) |
185 | break; | 179 | break; |
186 | 180 | ||
181 | if (atomic_cmpxchg(&lock->count, 1, 0) == 1) { | ||
182 | lock_acquired(&lock->dep_map, ip); | ||
183 | mutex_set_owner(lock); | ||
184 | preempt_enable(); | ||
185 | return 0; | ||
186 | } | ||
187 | |||
187 | /* | 188 | /* |
188 | * When there's no owner, we might have preempted between the | 189 | * When there's no owner, we might have preempted between the |
189 | * owner acquiring the lock and setting the owner field. If | 190 | * owner acquiring the lock and setting the owner field. If |
@@ -193,13 +194,6 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | |||
193 | if (!owner && (need_resched() || rt_task(task))) | 194 | if (!owner && (need_resched() || rt_task(task))) |
194 | break; | 195 | break; |
195 | 196 | ||
196 | if (atomic_cmpxchg(&lock->count, 1, 0) == 1) { | ||
197 | lock_acquired(&lock->dep_map, ip); | ||
198 | mutex_set_owner(lock); | ||
199 | preempt_enable(); | ||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | /* | 197 | /* |
204 | * The cpu_relax() call is a compiler barrier which forces | 198 | * The cpu_relax() call is a compiler barrier which forces |
205 | * everything in this loop to be re-loaded. We don't need | 199 | * everything in this loop to be re-loaded. We don't need |