locking/barriers: Validate lockless_dereference() is used on a pointer type
Use the type to validate the argument @p is indeed a pointer type. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Paul McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/20160522104827.GP3193@twins.programming.kicks-ass.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
a461d58792
commit
331b6d8c7a
|
@ -545,10 +545,14 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
|
||||||
* Similar to rcu_dereference(), but for situations where the pointed-to
|
* Similar to rcu_dereference(), but for situations where the pointed-to
|
||||||
* object's lifetime is managed by something other than RCU. That
|
* object's lifetime is managed by something other than RCU. That
|
||||||
* "something other" might be reference counting or simple immortality.
|
* "something other" might be reference counting or simple immortality.
|
||||||
|
*
|
||||||
|
* The seemingly unused void * variable is to validate @p is indeed a pointer
|
||||||
|
* type. All pointer types silently cast to void *.
|
||||||
*/
|
*/
|
||||||
#define lockless_dereference(p) \
|
#define lockless_dereference(p) \
|
||||||
({ \
|
({ \
|
||||||
typeof(p) _________p1 = READ_ONCE(p); \
|
typeof(p) _________p1 = READ_ONCE(p); \
|
||||||
|
__maybe_unused const void * const _________p2 = _________p1; \
|
||||||
smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
|
smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
|
||||||
(_________p1); \
|
(_________p1); \
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue