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.