FreeBSD spinlock - compatibility layer

John Baldwin jhb at freebsd.org
Mon May 20 20:42:11 UTC 2013


On Tuesday, May 14, 2013 6:04:21 am Orit Moskovich wrote:
> Hi,
> 
> I read about the FreeBSD mutex implementation for spinlock in the 
compatibility layer.
> I might be wrong, but I noticed a code section that might be problematic:
> 
> Taken from 
http://svn.freebsd.org/base/release/9.1.0/sys/ofed/include/linux/spinlock.h:
> 
> static inline void
> spin_lock_init(spinlock_t *lock)
> {
> 
>         memset(&lock->m, 0, sizeof(lock->m));
>         mtx_init(&lock->m, "lnxspin", NULL, MTX_DEF | MTX_NOWITNESS);
> }
> 
> But MTX_DEF initializes mutex as a sleep mutex:
> 
> By default, MTX_DEF mutexes will context switch when they are already
> 
>      held.
> 
> 
> There is a flag MTX_SPIN Which I think is the right one in this case .
> 
> 
> 
> I'd appreciate your take on this issue.

Since FreeBSD uses a different approach to interrupt handlers (they run in
threads, not in the bottom half), a regular mutex may in fact give the closest
match to the same semantics.  Regular mutexes are also cheaper and in general
preferable to spin mutexes whenever possible.

-- 
John Baldwin


More information about the freebsd-arch mailing list