Hello,

On Mon, May 09, 2022 at 04:34:00PM +0200, Alexander Bluhm wrote:
> On Sun, May 08, 2022 at 10:54:01PM +0200, Alexandr Nedvedicky wrote:
> >     what bothers me is the situation where there are
> >     more than one reader. The line 350 is executed by
> >     the first reader which drops the lock. So the process
> >     woken up by wakeup(rwl) are going to find out the
> >     lock is still occupied by remaining readers.
> 
> wakeup() activates all sleepers.  They should check and sleep again.
> Maybe a little bit of wasted resources, but I don't see a severe
> problem.

    I came to the same conclusion.

> 
> I did a little digging in history.  In rev 1.3 of kern_rwlock.c
> we had case RW_READ: need_wait = RWLOCK_WRLOCK | RWLOCK_WRWANT;
> and the commet "Let writers through before obtaining read lock."
> 
> The comment
>  * RW_READ      RWLOCK_WRLOCK|RWLOCK_WRWANT may not be set. We increment
>  *              with RWLOCK_READ_INCR. RWLOCK_WAIT while waiting.
> is still there, just the RWLOCK_WRWANT got lost from the condition.
> 
> So I think we should get back the original reader writer priority.
> 
> Regarding the race in rw_do_exit() that sashan@ found I also found
> a comment in rev 1.7.
> 
>         /*
>          * Potential MP race here. If the owner had WRWANT set we cleared
>          * it and a reader can sneak in before a writer. Do we care?
>          */
> 
> I do not want to change anything to that behavior now.  There is
> no easy fix and I did not see the problem during testing.  But we
> can put the comment back to clarify the situation.
> 
> ok?

    this certainly works for me. 

OK sashan

Reply via email to