diff options
-rw-r--r-- | kernel/locking/rwsem-xadd.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index 12166ec9b7e7..7628c3fc37ca 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c | |||
@@ -250,16 +250,18 @@ EXPORT_SYMBOL(rwsem_down_read_failed); | |||
250 | 250 | ||
251 | static inline bool rwsem_try_write_lock(long count, struct rw_semaphore *sem) | 251 | static inline bool rwsem_try_write_lock(long count, struct rw_semaphore *sem) |
252 | { | 252 | { |
253 | if (!(count & RWSEM_ACTIVE_MASK)) { | 253 | /* |
254 | /* try acquiring the write lock */ | 254 | * Try acquiring the write lock. Check count first in order |
255 | if (sem->count == RWSEM_WAITING_BIAS && | 255 | * to reduce unnecessary expensive cmpxchg() operations. |
256 | cmpxchg(&sem->count, RWSEM_WAITING_BIAS, | 256 | */ |
257 | RWSEM_ACTIVE_WRITE_BIAS) == RWSEM_WAITING_BIAS) { | 257 | if (count == RWSEM_WAITING_BIAS && |
258 | if (!list_is_singular(&sem->wait_list)) | 258 | cmpxchg(&sem->count, RWSEM_WAITING_BIAS, |
259 | rwsem_atomic_update(RWSEM_WAITING_BIAS, sem); | 259 | RWSEM_ACTIVE_WRITE_BIAS) == RWSEM_WAITING_BIAS) { |
260 | return true; | 260 | if (!list_is_singular(&sem->wait_list)) |
261 | } | 261 | rwsem_atomic_update(RWSEM_WAITING_BIAS, sem); |
262 | return true; | ||
262 | } | 263 | } |
264 | |||
263 | return false; | 265 | return false; |
264 | } | 266 | } |
265 | 267 | ||