Messages in this thread | | | Date | Fri, 5 Mar 2010 18:15:48 -0800 | From | Josh Triplett <> | Subject | Re: [PATCH tip/core/rcu 1/3] ftrace: replace read_barrier_depends() with rcu_dereference_raw() |
| |
On Fri, Mar 05, 2010 at 08:57:49PM -0500, Steven Rostedt wrote: > On Fri, 2010-03-05 at 17:45 -0800, Josh Triplett wrote: > > > > #define rcu_assign_pointer(p, v) \ > > > ({ \ > > > if (!__builtin_constant_p(v) || \ > > > ((v) != NULL)) \ > > > smp_wmb(); \ > > > (p) = (v); \ > > > }) > > > > > > My question is, why that crazy if? The only time that will fail is if we > > > are assigning the constant NULL to p. What makes NULL so important here? > > > Can't there be a case when assigning NULL to p will require that wmb()? > > > > The barrier ensures that the reader can't see the new p and the old > > *p. Since you can't look at *NULL, that concern doesn't apply. > > Thanks for the explanation. > > Question 2) > > Then why the !__builtin_constant_p(v)? > > If v is NULL, then the same should apply even if it is not a constant? > What am I missing?
Checking for __builtin_constant_p(v) ensures that this test happens at compile time, and thus no conditional occurs at runtime. Together with the assumption of compiler constant folding and dead code elimination, this test means "if you can tell at compile time that the call assigns NULL, emit no barrier, otherwise emit a barrier". Under no circumstances will this macro actually emit conditional code.
- Josh Triplett
| |