tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Bug in mutex_owned() ?



On Sunday 25 October 2009 14:35:13 Hans Petter Selasky wrote:
> On Sunday 25 October 2009 14:24:47 Mindaugas Rasiukevicius wrote:
> > Hans Petter Selasky <hselasky%c2i.net@localhost> wrote:
> > > I've currently defined a spinlock type of mutex and my I4B driver code
> > > repeatedly crashes due to the fact that mutex_owned() returnes that the
> > > mutex is owned while it is actually not. It looks like a bug to me that
> > > mutex_owned() always returns (1) in the non-adaptive case!
> >
> > That is not a bug.  Please see "FULL" definition.  Perhaps you are using
> > it not for diagnostic purposes?  In such case, it is wrong.
> >
> > >   830 #ifdef FULL
> > >   831         return __SIMPLELOCK_LOCKED_P(&mtx->mtx_lock);
> > >   832 #else
> > >   833         return 1;
> > >   834 #endif
> > >   835 }
>
> A quick search at fxr.watson.org reveals the following for amd64:
>
>    39 static __inline int
>    40 __SIMPLELOCK_LOCKED_P(__cpu_simple_lock_t *__ptr)
>    41 {
>    42         return *__ptr == __SIMPLELOCK_LOCKED;
>    43 }
>
>    72 #define __SIMPLELOCK_LOCKED     1
>    73 #define __SIMPLELOCK_UNLOCKED   0
>
> mutex_owned() == 1 for spin locks ???

I was a little bit too quick.

The problem is that there is a simple value check, but no check regarding 
which CPU that set the simpelock to locked.

If one CPU has the spin lock locked, the mutex_owned() will also return true 
on the other CPU :-( Which is wrong! This is what I am seeing during testing, 
and I have worked it around by not using mutex_owned() at all.

--HPS



Home | Main Index | Thread Index | Old Index