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 ff42e975590..5d79781394a 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -171,12 +171,6 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,  		struct thread_info *owner;  		/* -		 * If there are pending waiters, join them. -		 */ -		if (!list_empty(&lock->wait_list)) -			break; - -		/*  		 * If there's an owner, wait for it to either  		 * release the lock or go to sleep.  		 */ @@ -184,6 +178,13 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,  		if (owner && !mutex_spin_on_owner(lock, owner))  			break; +		if (atomic_cmpxchg(&lock->count, 1, 0) == 1) { +			lock_acquired(&lock->dep_map, ip); +			mutex_set_owner(lock); +			preempt_enable(); +			return 0; +		} +  		/*  		 * When there's no owner, we might have preempted between the  		 * 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,  		if (!owner && (need_resched() || rt_task(task)))  			break; -		if (atomic_cmpxchg(&lock->count, 1, 0) == 1) { -			lock_acquired(&lock->dep_map, ip); -			mutex_set_owner(lock); -			preempt_enable(); -			return 0; -		} -  		/*  		 * The cpu_relax() call is a compiler barrier which forces  		 * everything in this loop to be re-loaded. We don't need  |