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