rcu_sync: Add CONFIG_PROVE_RCU checks

This commit validates that the caller of rcu_sync_is_idle() holds the
corresponding type of RCU read-side lock, but only in kernels built
with CONFIG_PROVE_RCU=y.  This validation is carried out via a new
rcu_sync_ops->held() method that is checked within rcu_sync_is_idle().

Note that although this does add code to the fast path, it only does so
in kernels built with CONFIG_PROVE_RCU=y.

Suggested-by: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
Oleg Nesterov
2015-08-21 19:42:50 +02:00
committed by Paul E. McKenney
parent 82e8c565be
commit 3a518b76af
2 changed files with 26 additions and 0 deletions

View File

@@ -40,6 +40,8 @@ struct rcu_sync {
enum rcu_sync_type gp_type;
};
extern bool __rcu_sync_is_idle(struct rcu_sync *);
/**
* rcu_sync_is_idle() - Are readers permitted to use their fastpaths?
* @rsp: Pointer to rcu_sync structure to use for synchronization
@@ -50,7 +52,11 @@ struct rcu_sync {
*/
static inline bool rcu_sync_is_idle(struct rcu_sync *rsp)
{
#ifdef CONFIG_PROVE_RCU
return __rcu_sync_is_idle(rsp);
#else
return !rsp->gp_state; /* GP_IDLE */
#endif
}
extern void rcu_sync_init(struct rcu_sync *, enum rcu_sync_type);