diff options
Diffstat (limited to 'include/linux/rcupdate.h')
| -rw-r--r-- | include/linux/rcupdate.h | 11 | 
1 files changed, 10 insertions, 1 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index c61b6b9506e7..a8af79738a0e 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -650,7 +650,16 @@ static inline void rcu_preempt_sleep_check(void)   * please be careful when making changes to rcu_assign_pointer() and the   * other macros that it invokes.   */ -#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;							      \ +})  /**   * rcu_access_pointer() - fetch RCU pointer with no dereferencing  | 
