Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a37f727 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: No ordering for rcu_assign_pointer() of NULL



This commit does a compile-time check for rcu_assign_pointer() of NULL,
and uses WRITE_ONCE() rather than smp_store_release() in that case.

Reported-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 810ce8b5
Loading
Loading
Loading
Loading
+10 −1
Original line number Original line Diff line number Diff line
@@ -650,7 +650,16 @@ static inline void rcu_preempt_sleep_check(void)
 * please be careful when making changes to rcu_assign_pointer() and the
 * please be careful when making changes to rcu_assign_pointer() and the
 * other macros that it invokes.
 * 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
 * rcu_access_pointer() - fetch RCU pointer with no dereferencing