Messages in this thread | | | Date | Mon, 2 May 2016 11:06:44 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH 2/2] target: use RCU_INIT_POINTER() when NULLing. |
| |
On Mon, May 02, 2016 at 10:59:50AM -0700, Christoph Hellwig wrote: > On Mon, May 02, 2016 at 10:57:38AM -0700, Paul E. McKenney wrote: > > -#define rcu_assign_pointer(p, v) smp_store_release(&p, RCU_INITIALIZER(v)) > > +#define rcu_assign_pointer(p, v) \ > > +({ \ > > + uintptr_t _r_a_p__v = (uintptr_t)(v); \ > > + \ > > + if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ > > + WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ > > + else \ > > + smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ > > + _r_a_p__v; \ > > +}) > > Can't we turn it into an inline (would need different calling > conventions for p, though).
And for v. But how do I do that without C++ templates?
Also, does __builtin_constant_p() work reliably on a parameter? Especially when the compiler decides not to do the inlining?
Thanx, Paul
| |