Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1215680

[PATCH RFC tip/core/rcu 3/9] rcu_sync: Add CONFIG_PROVE_RCU checks

From "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Newsgroups linux.kernel
Subject [PATCH RFC tip/core/rcu 3/9] rcu_sync: Add CONFIG_PROVE_RCU checks
Date 2015-08-29 05:50 +0200
Message-ID <q2Fjs-6Q1-25@gated-at.bofh.it> (permalink)
References <q2Fjr-6Q1-5@gated-at.bofh.it> <q2Fjr-6Q1-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Oleg Nesterov <oleg@redhat.com>

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>
---
 include/linux/rcu_sync.h |  6 ++++++
 kernel/rcu/sync.c        | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/include/linux/rcu_sync.h b/include/linux/rcu_sync.h
index c6d2272c4459..c55a070b2592 100644
--- a/include/linux/rcu_sync.h
+++ b/include/linux/rcu_sync.h
@@ -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(rss);
+#else
 	return !rsp->gp_state; /* GP_IDLE */
+#endif
 }
 
 extern void rcu_sync_init(struct rcu_sync *, enum rcu_sync_type);
diff --git a/kernel/rcu/sync.c b/kernel/rcu/sync.c
index 5a9aa4c394f1..26b2629e731e 100644
--- a/kernel/rcu/sync.c
+++ b/kernel/rcu/sync.c
@@ -23,21 +23,33 @@
 #include <linux/rcu_sync.h>
 #include <linux/sched.h>
 
+#ifdef CONFIG_PROVE_RCU
+#define __INIT_HELD(func)	.held = func,
+#else
+#define __INIT_HELD(func)
+#endif
+
 static const struct {
 	void (*sync)(void);
 	void (*call)(struct rcu_head *, void (*)(struct rcu_head *));
+#ifdef CONFIG_PROVE_RCU
+	int  (*held)(void);
+#endif
 } gp_ops[] = {
 	[RCU_SYNC] = {
 		.sync = synchronize_rcu,
 		.call = call_rcu,
+		__INIT_HELD(rcu_read_lock_held)
 	},
 	[RCU_SCHED_SYNC] = {
 		.sync = synchronize_sched,
 		.call = call_rcu_sched,
+		__INIT_HELD(rcu_read_lock_sched_held)
 	},
 	[RCU_BH_SYNC] = {
 		.sync = synchronize_rcu_bh,
 		.call = call_rcu_bh,
+		__INIT_HELD(rcu_read_lock_bh_held)
 	},
 };
 
@@ -46,6 +58,13 @@ enum { CB_IDLE = 0, CB_PENDING, CB_REPLAY };
 
 #define	rss_lock	gp_wait.lock
 
+#ifdef CONFIG_PROVE_RCU
+bool __rcu_sync_is_idle(struct rcu_sync *rsp)
+{
+	WARN_ON(!gp_ops[rsp->gp_type].held());
+	return rsp->gp_state == GP_IDLE;
+}
+
 /**
  * rcu_sync_init() - Initialize an rcu_sync structure
  * @rsp: Pointer to rcu_sync structure to be initialized
@@ -57,6 +76,7 @@ void rcu_sync_init(struct rcu_sync *rsp, enum rcu_sync_type type)
 	init_waitqueue_head(&rsp->gp_wait);
 	rsp->gp_type = type;
 }
+#endif
 
 /**
  * rcu_sync_enter() - Force readers onto slowpath
-- 
1.8.1.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Find similar | Unroll thread


Thread

[PATCH RFC tip/core/rcu 1/9] rcu: Create rcu_sync infrastructure "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200
  [PATCH RFC tip/core/rcu 6/9] locking/percpu-rwsem: Make use of the rcu_sync infrastructure "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200
  [PATCH RFC tip/core/rcu 2/9] rcu_sync: Simplify rcu_sync using new rcu_sync_ops structure "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200
  [PATCH RFC tip/core/rcu 5/9] locking/percpu-rwsem: Make percpu_free_rwsem() after kzalloc() safe "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200
  [PATCH RFC tip/core/rcu 7/9] locking/percpu-rwsem: Fix the comments outdated by rcu_sync "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200
  [PATCH RFC tip/core/rcu 8/9] locking/percpu-rwsem: Clean up the lockdep annotations in percpu_down_read() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200
  [PATCH RFC tip/core/rcu 3/9] rcu_sync: Add CONFIG_PROVE_RCU checks "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-29 05:50 +0200

csiph-web