Messages in this thread | | | Subject | Re: [PATCH v4 11/16] locking/rwsem: Enable readers spinning on writer | From | Waiman Long <> | Date | Wed, 17 Apr 2019 13:45:10 -0400 |
| |
On 04/17/2019 09:58 AM, Peter Zijlstra wrote: > On Sat, Apr 13, 2019 at 01:22:54PM -0400, Waiman Long wrote: >> +/* >> + * Try to acquire read lock before the reader is put on wait queue. >> + * Lock acquisition isn't allowed if the rwsem is locked or a writer handoff >> + * is ongoing. >> + */ >> +static inline bool rwsem_try_read_lock_unqueued(struct rw_semaphore *sem) >> +{ >> + long count = atomic_long_read(&sem->count); >> + >> + if (RWSEM_COUNT_WLOCKED_OR_HANDOFF(count)) >> + return false; >> + >> + count = atomic_long_fetch_add_acquire(RWSEM_READER_BIAS, &sem->count); >> + if (!RWSEM_COUNT_WLOCKED_OR_HANDOFF(count)) { >> + rwsem_set_reader_owned(sem); >> + lockevent_inc(rwsem_opt_rlock); >> + return true; >> + } >> + >> + /* Back out the change */ >> + atomic_long_add(-RWSEM_READER_BIAS, &sem->count); >> + return false; >> +} > Doesn't a cmpxchg 'loop' make more sense here?
Not really. A cmpxchg loop will have one more correctible failure mode - a new reader acquire the lock or a reader owner does an unlock. Failures caused by the setting of the handoff bit or writer acquiring the lock are the same for both cases. I don't see any advantage in using cmpxchg loop.
Cheers, Longman
| |