cvs commit: src/sys/kern kern_rwlock.c src/sys/sys rwlock.h

Attilio Rao attilio at freebsd.org
Tue Apr 1 17:23:25 PDT 2008


2008/4/2, Max Laier <max at love2party.net>:
> On Wednesday 02 April 2008 00:52:45 Jeff Roberson wrote:
>  > On Wed, 2 Apr 2008, Max Laier wrote:
>  > > On Tuesday 01 April 2008 22:31:55 Attilio Rao wrote:
>  > >> attilio     2008-04-01 20:31:55 UTC
>  > >>
>  > >>   FreeBSD src repository
>  > >>
>  > >>   Modified files:
>  > >>     sys/kern             kern_rwlock.c
>  > >>     sys/sys              rwlock.h
>  > >>   Log:
>  > >>   Add rw_try_rlock() and rw_try_wlock() to rwlocks.
>  > >>   These functions try the specified operation (rlocking and
>  > >> wlocking) and true is returned if the operation completes, false
>  > >> otherwise.
>  > >
>  > > hmmm ... I'm certainly missing something here, but what's a possible
>  > > usecase for these?  It seems there is not much you can do if you
>  > > can't obtain a rw_lock.  I can understand the need for sx_try_* where
>  > > you want to avoid sleeping, but I can't figure out the need for it on
>  > > a locking primitive that will only spin or wait (not 100% sure about
>  > > the terminology here).  This is especially strange for rw_try_wlock,
>  > > unless you plan to sleep manually on fail.  But then again you'd have
>  > > a good chance that you have to do it over and over again if timing is
>  > > unfortunate.
>  >
>  > I asked for it.  We have a try operation for mtx already.  I was
>  > experimenting with converting some code to use rwlocks from mtx and it
>  > required it.  The specific case is in the softdep code where it uses
>  > trylock to avoid deadlocking.  With trylock you can violate the
>  > lockorder.
>
>
> Makes sense, thanks!  A little follow-up, though about something I'm
>  wondering about for quite some time now.  Take the following scenario:
>
>  Thread A:  rw_rlock(RW) ... mtx_lock(MTX) ... UNLOCK
>  Thread B:  mtx_lock(MTX) ... rw_rlock(RW) ... UNLOCK
>  Thread C:  rw_wlock(RW) ... UNLOCK

This can't deadlock simply because rw_rlock() is not mutually exclusive.

>  Can this deadlock?  How?
>
>  If thread C did: rw_wlock(RW) ... mtx_lock(MTX) ... UNLOCK or the other
>  way around, I can see that it will[1] deadlock, but with the wlock
>  without a lock order wrt the MTX, I can't see it.  Plus, can we teach
>  WITNESS to keep quite about thread A and B unless we also see a lock
>  order with the wlock and the mutex?

You mean skipping possible LORs for shared instances of double-sided primitives?

Thanks,
Attilio


-- 
Peace can only be achieved by understanding - A. Einstein


More information about the cvs-src mailing list