SMP question w.r.t. reading kernel variables

Clifton Royston cliftonr at lava.net
Tue Apr 19 17:23:29 UTC 2011


On Tue, Apr 19, 2011 at 12:00:29PM +0000, freebsd-hackers-request at freebsd.org wrote:
> Subject: Re: SMP question w.r.t. reading kernel variables
> To: Rick Macklem <rmacklem at uoguelph.ca>
> Cc: freebsd-hackers at freebsd.org
> Message-ID: <201104181712.14457.jhb at freebsd.org>

[John Baldwin]
> On Monday, April 18, 2011 4:22:37 pm Rick Macklem wrote:
> > > On Sunday, April 17, 2011 3:49:48 pm Rick Macklem wrote:
...
> > All of this makes sense. What I was concerned about was memory cache
> > consistency and whet (if anything) has to be done to make sure a thread
> > doesn't see a stale cached value for the memory location.
> > 
> > Here's a generic example of what I was thinking of:
> > (assume x is a global int and y is a local int on the thread's stack)
> > - time proceeds down the screen
> > thread X on CPU 0                    thread Y on CPU 1
> > x = 0;
> >                                      x = 0; /* 0 for x's location in CPU 1's memory cache */
> > x = 1;
> >                                      y = x;
> > --> now, is "y" guaranteed to be 1 or can it get the stale cached 0 value?
> >     if not, what needs to be done to guarantee it?
> 
> Well, the bigger problem is getting the CPU and compiler to order the
> instructions such that they don't execute out of order, etc.  Because of that,
> even if your code has 'x = 0; x = 1;' as adjacent threads in thread X,
> the 'x = 1' may actually execute a good bit after the 'y = x' on CPU 1.

  Actually, as I recall the rules for C, it's worse than that.  For
this (admittedly simplified scenario), "x=0;" in thread X may never
execute unless it's declared volatile, as the compiler may optimize it
out and emit no code for it.


> Locks force that to sychronize as the CPUs coordinate around the lock cookie
> (e.g. the 'mtx_lock' member of 'struct mutex').
> 
> > Also, I see cases of:
> >      mtx_lock(&np);
> >      np->n_attrstamp = 0;
> >      mtx_unlock(&np);
> > in the regular NFS client. Why is the assignment mutex locked? (I had assumed
> > it was related to the above memory caching issue, but now I'm not so sure.)
> 
> In general I think writes to data that are protected by locks should always be
> protected by locks.  In some cases you may be able to read data using "weaker"
> locking (where "no locking" can be a form of weaker locking, but also a
> read/shared lock is weak, and if a variable is protected by multiple locks,
> then any singe lock is weak, but sufficient for reading while all of the
> associated locks must be held for writing) than writing, but writing generally
> requires "full" locking (write locks, etc.).

  What he said.  In addition to all that, lock operations generate
"atomic" barriers which a compiler or optimizer is prevented from
moving code across.

  -- Clifton

-- 
    Clifton Royston  --  cliftonr at iandicomputing.com / cliftonr at lava.net
       President  - I and I Computing * http://www.iandicomputing.com/
 Custom programming, network design, systems and network consulting services


More information about the freebsd-hackers mailing list