options WITNESS and locks

Yony Yossef yonyossef.lists at gmail.com
Tue Jul 15 19:48:13 UTC 2008


Problem solved :-)
Thank you very much for your patience Kris..

On Tue, Jul 15, 2008 at 5:14 PM, Kris Kennaway <kris at freebsd.org> wrote:

>  Yony Yossef wrote:
>
>>
>>        Something is still unclear. All my locks are MTX_DEF type, which
>>        means
>>        sleepable, including the one specified in the crash report
>>        (MTNIC state
>>        semaphore).
>>        This crash happens when I try to call bus_resource_alloc_any for
>>        a SYS_REQ
>>        which is trying to obtain the second lock (ACPI root bus). How
>>        come my
>>        MTX_DEF lock is being treated as as non-sleepable?
>>
>>
>>    MTX_DEF locks *are* non-sleepable :-)
>>
>>    Kris
>>
>>   Good news :-)
>> Yet the documentation is confusing me:
>>  man pages say:
>> MTX_DEF        Default mutexes will always allow the current thread to be
>>                    suspended to avoid deadlock conditions against
>> interrupt
>>                    threads.  The implementation of this lock type may spin
>>                    for a while before suspending the current thread.
>> and in mutex.h:
>> /*
>>  * Mutex types and options passed to mtx_init().  MTX_QUIET and MTX_DUPOK
>>  * can also be passed in.
>>  */
>> #define MTX_DEF  0x00000000 /* DEFAULT (sleep) lock */
>> #define MTX_SPIN 0x00000001 /* Spin lock (disables interrupts) */
>> #define MTX_RECURSE 0x00000004 /* Option: lock allowed to recurse */
>> #define MTX_NOWITNESS 0x00000008 /* Don't do any witness checking. */
>> #define MTX_NOPROFILE   0x00000020 /* Don't profile this lock */
>>   What does the "DEFAULT (sleep) lock" comment near MTX_DEF means?
>> And which ones are sleepable?..  I guess I'm missing something here.
>>
>
> "sleep mutex" means that the mutex holder may be put to sleep by the kernel
> while the mutex is held by another process (if the lock holder is running
> then it will spin, though).  It is in contrast to "spin" mutexes that always
> spin forever while the lock is held, even when it might be inefficient for
> them to do so because the lock holder is no longer running after the CPU
> context switched to another process before it released the lock.
>
> This describes the behaviour of the mutex while it is waiting to acquire a
> lock.
>
> "sleepable" vs "non-sleepable" locks means what it is legal for your code
> to do while holding a mutex and doesn't relate to the internal
> implementation of the lock.
>
> This describes what it is legal for your code to do once it has acquired
> the lock.
>
> Kris
>
>


More information about the freebsd-questions mailing list