Skip to content

Commit 112dc0c

Browse files
jmberg-intelIngo Molnar
authored andcommitted
locking/barriers: Suppress sparse warnings in lockless_dereference()
After Peter's commit: 331b6d8 ("locking/barriers: Validate lockless_dereference() is used on a pointer type") ... we get a lot of sparse warnings (one for every rcu_dereference, and more) since the expression here is assigning to the wrong address space. Instead of validating that 'p' is a pointer this way, instead make it fail compilation when it's not by using sizeof(*(p)). This will not cause any sparse warnings (tested, likely since the address space is irrelevant for sizeof), and will fail compilation when 'p' isn't a pointer type. Tested-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Daniel Vetter <daniel.vetter@intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Fixes: 331b6d8 ("locking/barriers: Validate lockless_dereference() is used on a pointer type") Link: http://lkml.kernel.org/r/1470909022-687-2-git-send-email-johannes@sipsolutions.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent f17b3ea commit 112dc0c

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

include/linux/compiler.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -527,13 +527,13 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
527527
* object's lifetime is managed by something other than RCU. That
528528
* "something other" might be reference counting or simple immortality.
529529
*
530-
* The seemingly unused void * variable is to validate @p is indeed a pointer
531-
* type. All pointer types silently cast to void *.
530+
* The seemingly unused size_t variable is to validate @p is indeed a pointer
531+
* type by making sure it can be dereferenced.
532532
*/
533533
#define lockless_dereference(p) \
534534
({ \
535535
typeof(p) _________p1 = READ_ONCE(p); \
536-
__maybe_unused const void * const _________p2 = _________p1; \
536+
size_t __maybe_unused __size_of_ptr = sizeof(*(p)); \
537537
smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
538538
(_________p1); \
539539
})

0 commit comments

Comments
 (0)