diff options
| author | Ingo Molnar <[email protected]> | 2014-11-12 15:09:01 +0100 | 
|---|---|---|
| committer | Ingo Molnar <[email protected]> | 2014-11-12 15:09:01 +0100 | 
| commit | 890ca861f868a10617029ffc87eae7d48ea6876c (patch) | |
| tree | 713383f4e3bbd94ddb9816a25e6b3911511908f1 /kernel/locking/rwsem-xadd.c | |
| parent | 03452d27c6cd9cebb59a6bb0fb6bd8557916c263 (diff) | |
| parent | 206c5f60a3d902bc4b56dab2de3e88de5eb06108 (diff) | |
Merge tag 'v3.18-rc4' into x86/cleanups, to refresh the tree before pulling new changes.
Signed-off-by: Ingo Molnar <[email protected]>
Diffstat (limited to 'kernel/locking/rwsem-xadd.c')
| -rw-r--r-- | kernel/locking/rwsem-xadd.c | 27 | 
1 files changed, 14 insertions, 13 deletions
| diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index d6203faf2eb1..7628c3fc37ca 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c @@ -246,19 +246,22 @@ struct rw_semaphore __sched *rwsem_down_read_failed(struct rw_semaphore *sem)  	return sem;  } +EXPORT_SYMBOL(rwsem_down_read_failed);  static inline bool rwsem_try_write_lock(long count, struct rw_semaphore *sem)  { -	if (!(count & RWSEM_ACTIVE_MASK)) { -		/* try acquiring the write lock */ -		if (sem->count == RWSEM_WAITING_BIAS && -		    cmpxchg(&sem->count, RWSEM_WAITING_BIAS, -			    RWSEM_ACTIVE_WRITE_BIAS) == RWSEM_WAITING_BIAS) { -			if (!list_is_singular(&sem->wait_list)) -				rwsem_atomic_update(RWSEM_WAITING_BIAS, sem); -			return true; -		} +	/* +	 * Try acquiring the write lock. Check count first in order +	 * to reduce unnecessary expensive cmpxchg() operations. +	 */ +	if (count == RWSEM_WAITING_BIAS && +	    cmpxchg(&sem->count, RWSEM_WAITING_BIAS, +		    RWSEM_ACTIVE_WRITE_BIAS) == RWSEM_WAITING_BIAS) { +		if (!list_is_singular(&sem->wait_list)) +			rwsem_atomic_update(RWSEM_WAITING_BIAS, sem); +		return true;  	} +  	return false;  } @@ -465,6 +468,7 @@ struct rw_semaphore __sched *rwsem_down_write_failed(struct rw_semaphore *sem)  	return sem;  } +EXPORT_SYMBOL(rwsem_down_write_failed);  /*   * handle waking up a waiter on the semaphore @@ -485,6 +489,7 @@ struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem)  	return sem;  } +EXPORT_SYMBOL(rwsem_wake);  /*   * downgrade a write lock into a read lock @@ -506,8 +511,4 @@ struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem)  	return sem;  } - -EXPORT_SYMBOL(rwsem_down_read_failed); -EXPORT_SYMBOL(rwsem_down_write_failed); -EXPORT_SYMBOL(rwsem_wake);  EXPORT_SYMBOL(rwsem_downgrade_wake); |