Doug Rabson wrote:
> On Sun, 27 Jun 1999, Peter Wemm wrote:
> 
> > Matthew Dillon wrote:
> > >     Ah, yes, some of us were just discussing this in a small mailing list
    .
> > >     Hopefully Kirk will pick up on it soon.  Ah well.. someone else gets 
    to b
> >     e
> > >     the brunt of it for a change :-).  Kirk doesn't have an SMP box so he
> > >     didn't see the bug.
> > > 
> > >     I have tentitively tracked the problem down to the apparent inability
     of
> > >     lockmgr() locks to function from interrupts, even when used in a
> > >     non-blocking manner, due to the simplelock's it uses internally.  The
> > >     new buffer cache code Kirk committed switched from B_BUSY (manually
> > >     implemented locks) to lockmgr() locks.  I think what is going on is
> > >     that mainline code is getting a simplelock and then an interrupt is
> > >     coming along and also trying to get the same lock, but I can't be sur
    e
> > >     because my DDB backtraces are somewhat munged.
> > 
> > In this case, it was just a programming error..  The key to remember is tha
    t
> > the simplelocks are used to protect the state of the complex lock, they are
> > not the lock themselves.  lockmgr() holds the interlock while gaining or
> > removing references etc and then frees the simplelock so that it can sleep
> > if required etc.  The actual implementation of the simplelock routines
> > is interrupt safe (and has to be).
> 
> The simple_lock* macros don't seem to use the interrupt safe versions
> (ss_lock etc). What happens if an interrupt is recieved after gaining
> buftimelock and the interrupt routine also tries to call BUF_LOCK?

Good question, but I'm not sure ss_lock is what's needed either since that
does a cli for the duration of the simplelock being held..

I think the BUF_*() inlines need internal splbio() protection since
a biodone() can be called from the tail end of an interrupt, and that *does*
try and get a simplelock during a BUF_UNLOCK()... (and BUF_REFCNT()).

Cheers,
-Peter
--
Peter Wemm - [EMAIL PROTECTED]; [EMAIL PROTECTED]; [EMAIL PROTECTED]



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to