Messages in this thread | ![/](/images/icornerl.gif) | | Date | Thu, 18 Apr 2019 11:11:09 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH v4 11/16] locking/rwsem: Enable readers spinning on writer |
| |
On Wed, Apr 17, 2019 at 01:51:24PM -0400, Waiman Long wrote: > On 04/17/2019 10:05 AM, Peter Zijlstra wrote: > > On Sat, Apr 13, 2019 at 01:22:54PM -0400, Waiman Long wrote: > >> @@ -650,6 +686,33 @@ __rwsem_down_read_failed_common(struct rw_semaphore *sem, int state) > >> struct rwsem_waiter waiter; > >> DEFINE_WAKE_Q(wake_q); > >> > >> + if (!rwsem_can_spin_on_owner(sem)) > >> + goto queue; > >> + > >> + /* > >> + * Undo read bias from down_read() and do optimistic spinning. > >> + */ > >> + atomic_long_add(-RWSEM_READER_BIAS, &sem->count); > >> + adjustment = 0; > >> + if (rwsem_optimistic_spin(sem, false)) { > >> + unsigned long flags; > >> + > >> + /* > >> + * Opportunistically wake up other readers in the wait queue. > >> + * It has another chance of wakeup at unlock time. > >> + */ > >> + if ((atomic_long_read(&sem->count) & RWSEM_FLAG_WAITERS) && > >> + raw_spin_trylock_irqsave(&sem->wait_lock, flags)) { > > why trylock?
> I used trylock to avoid getting stuck in the spinlock while holding a > read lock on the rwsem.
Is that a real concern? I would think that not waking further readers would, esp. under high contention, be a bigger deal.
| ![\](/images/icornerr.gif) |