Re: [PATCH net-next 22/24] rcu: Suppress sparse warnings for rcu_dereference_raw()

From: Paul E. McKenney
Date: Tue Jul 05 2016 - 17:32:45 EST


On Tue, Jul 05, 2016 at 02:14:49PM +0100, David Howells wrote:
> From: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx>
>
> 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@xxxxxxxxxx>
> Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx>
> Signed-off-by: David Howells <dhowells@xxxxxxxxxx>

This would normally be my cue to give an Acked-by to an RCU patch, but
it already has my Signed-off-by. So this is just to confirm that I agree
that keeping this patch with the other patches that depend on it is the
right thing to do. ;-)

Thanx, Paul

> ---
>
> include/linux/rcupdate.h | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> index 5f1533e3d032..85830e6c797b 100644
> --- a/include/linux/rcupdate.h
> +++ b/include/linux/rcupdate.h
> @@ -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.
>