rcu: Suppress sparse warnings for rcu_dereference_raw()
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 1 Jul 2016 20:44:53 +0000 (13:44 -0700)
committerDavid Howells <dhowells@redhat.com>
Wed, 6 Jul 2016 09:51:14 +0000 (10:51 +0100)
Data structures that are used both with and without RCU protection
are difficult to write in a sparse-clean manner.  If you mark the
relevant pointers with __rcu, sparse will complain about all non-RCU
uses, but if you don't mark those pointers, sparse will complain about
all RCU uses.

This commit therefore suppresses sparse warnings for rcu_dereference_raw(),
allowing mixed-protection data structures to avoid these warnings.

Reported-by: David Howells <dhowells@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: David Howells <dhowells@redhat.com>
include/linux/rcupdate.h

index 5f1533e3d03206d2d64f67a6a1db51b785f0a1fb..85830e6c797b5b536e15c1f3921acbc57e1a87bd 100644 (file)
@@ -611,6 +611,12 @@ static inline void rcu_preempt_sleep_check(void)
        rcu_dereference_sparse(p, space); \
        ((typeof(*p) __force __kernel *)(p)); \
 })
+#define rcu_dereference_raw(p) \
+({ \
+       /* Dependency order vs. p above. */ \
+       typeof(p) ________p1 = lockless_dereference(p); \
+       ((typeof(*p) __force __kernel *)(________p1)); \
+})
 
 /**
  * RCU_INITIALIZER() - statically initialize an RCU-protected global variable
@@ -729,8 +735,6 @@ static inline void rcu_preempt_sleep_check(void)
        __rcu_dereference_check((p), (c) || rcu_read_lock_sched_held(), \
                                __rcu)
 
-#define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/
-
 /*
  * The tracing infrastructure traces RCU (we want that), but unfortunately
  * some of the RCU checks causes tracing to lock up the system.