Understanding the FreeBSD locking mechanism

Yubin Ruan ablacktshirt at gmail.com
Wed Apr 5 09:19:53 UTC 2017


All right seems like that this list is not a right place for this kind
of problem.

Any suggestion on the right mailing list to send?

regards,
yubinr

2017-04-03 0:30 GMT+08:00 Yubin Ruan <ablacktshirt at gmail.com>:
> Hi,
> I am reading the FreeBSD source code related to its locking mechanism. I
> have done some researches but still cannot understand some codes.
>
> Let's take `spinlock' for example. I know there are different kinds of
> mutex in FreeBSD: spin mutex and other kinds of mutex. I try to locate
> the source of spin mutex but what I find all look very weird to me. For
> example, the `spinlock_enter()`
>
>  1816 void
>  1817 spinlock_enter(void)
>  1818 {
>  1819         struct thread *td;
>  1820         register_t flags;
>  1821
>  1822         td = curthread;
>  1823         if (td->td_md.md_spinlock_count == 0) {
>  1824                 flags = intr_disable();
>  1825                 td->td_md.md_spinlock_count = 1;
>  1826                 td->td_md.md_saved_flags = flags;
>  1827         } else
>  1828                 td->td_md.md_spinlock_count++;
>  1829         critical_enter();
>  1830 }
>
> Does this function provides the ordinary "spinlock" functionality? There
> is no special "test-and-set" instruction, and neither any extra locking
> to protect internal data structure manipulation. Isn't this subjected to
> race condition?
>
> I also checked the `mtx_lock()`, but neither can't find a seemingly
> correct implementation.
>
> Do I miss anything? Which is the real implementation of the spin lock in
> FreeBSD?
>
> Thanks
> Yubin Ruan


More information about the freebsd-questions mailing list