|
@@ -250,16 +250,18 @@ 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;
|
|
|
}
|
|
|
|