Questions about mutex implementation in kern/kern_mutex.c
Benjamin Kaduk
kaduk at MIT.EDU
Fri Sep 17 03:24:34 UTC 2010
On Thu, 16 Sep 2010, John Baldwin wrote:
> On Thursday, September 16, 2010 1:33:07 pm Andrey Simonenko wrote:
>
>> The mtx_owned(9) macro uses this property, mtx_owned() does not use anything
>> special to compare the value of m->mtx_lock (volatile) with current thread
>> pointer, all other functions that update m->mtx_lock of unowned mutex use
>> compare-and-set instruction. Also I cannot find anything special in
>> generated Assembler code for volatile variables (except for ia64 where
>> acquire loads and release stores are used).
>
> No, mtx_owned() is just not harmed by the races it loses. You can certainly
> read a stale value of mtx_lock in mtx_owned() if some other thread owns the
> lock or has just released the lock. However, we don't care, because in both
> of those cases, mtx_owned() returns false. What does matter is that
> mtx_owned() can only return true if we currently hold the mutex. This works
> because 1) the same thread cannot call mtx_unlock() and mtx_owned() at the
> same time, and 2) even CPUs that hold writes in store buffers will snoop their
> store buffer for local reads on that CPU. That is, a given CPU will never
> read a stale value of a memory word that is "older" than a write it has
> performed to that word.
Sorry for the naive question, but would you mind expounding a bit on what
keeps the thread from migrating to a different CPU and getting a stale
value there? (I can imagine a couple possible mechanisms, but don't know
enough to know which one(s) are the real ones.)
Thanks,
Ben Kaduk
More information about the freebsd-hackers
mailing list