diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-04-30 06:42:01 -0700 | 
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-06-14 16:37:26 -0700 | 
| commit | f5155b33277c9678041a27869165619bb34f722f (patch) | |
| tree | 16cef227f7e05e3b8d97a68d7b7a60e86255cb98 | |
| parent | 551d55a944b143ef26fbd482d1c463199d6f65cf (diff) | |
| download | olio-linux-3.10-f5155b33277c9678041a27869165619bb34f722f.tar.xz olio-linux-3.10-f5155b33277c9678041a27869165619bb34f722f.zip  | |
rcu: add an rcu_dereference_index_check()
The sparse RCU-pointer checking relies on type magic that dereferences
the pointer in question.  This does not work if the pointer is in fact
an array index.  This commit therefore supplies a new RCU API that
omits the sparse checking to continue to support rcu_dereference()
on integers.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
| -rw-r--r-- | include/linux/rcupdate.h | 33 | 
1 files changed, 33 insertions, 0 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 2b7fc506e47..9fbc54a2585 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -566,4 +566,37 @@ static inline void debug_rcu_head_unqueue(struct rcu_head *head)  }  #endif	/* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ +#ifndef CONFIG_PROVE_RCU +#define __do_rcu_dereference_check(c) do { } while (0) +#endif /* #ifdef CONFIG_PROVE_RCU */ + +#define __rcu_dereference_index_check(p, c) \ +	({ \ +		typeof(p) _________p1 = ACCESS_ONCE(p); \ +		__do_rcu_dereference_check(c); \ +		smp_read_barrier_depends(); \ +		(_________p1); \ +	}) + +/** + * rcu_dereference_index_check() - rcu_dereference for indices with debug checking + * @p: The pointer to read, prior to dereferencing + * @c: The conditions under which the dereference will take place + * + * Similar to rcu_dereference_check(), but omits the sparse checking. + * This allows rcu_dereference_index_check() to be used on integers, + * which can then be used as array indices.  Attempting to use + * rcu_dereference_check() on an integer will give compiler warnings + * because the sparse address-space mechanism relies on dereferencing + * the RCU-protected pointer.  Dereferencing integers is not something + * that even gcc will put up with. + * + * Note that this function does not implicitly check for RCU read-side + * critical sections.  If this function gains lots of uses, it might + * make sense to provide versions for each flavor of RCU, but it does + * not make sense as of early 2010. + */ +#define rcu_dereference_index_check(p, c) \ +	__rcu_dereference_index_check((p), (c)) +  #endif /* __LINUX_RCUPDATE_H */  |