linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com,
	akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
	josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org,
	rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
	fweisbec@gmail.com, oleg@redhat.com, bobby.prani@gmail.com,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH v3 tip/core/rcu 01/40] rcu: Maintain special bits at bottom of ->dynticks counter
Date: Wed, 19 Apr 2017 09:57:58 -0700	[thread overview]
Message-ID: <1492621117-13939-1-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <20170419165805.GB10874@linux.vnet.ibm.com>

Currently, IPIs are used to force other CPUs to invalidate their TLBs
in response to a kernel virtual-memory mapping change.  This works, but
degrades both battery lifetime (for idle CPUs) and real-time response
(for nohz_full CPUs), and in addition results in unnecessary IPIs due to
the fact that CPUs executing in usermode are unaffected by stale kernel
mappings.  It would be better to cause a CPU executing in usermode to
wait until it is entering kernel mode to do the flush, first to avoid
interrupting usemode tasks and second to handle multiple flush requests
with a single flush in the case of a long-running user task.

This commit therefore reserves a bit at the bottom of the ->dynticks
counter, which is checked upon exit from extended quiescent states.
If it is set, it is cleared and then a new rcu_eqs_special_exit() macro is
invoked, which, if not supplied, is an empty single-pass do-while loop.
If this bottom bit is set on -entry- to an extended quiescent state,
then a WARN_ON_ONCE() triggers.

This bottom bit may be set using a new rcu_eqs_special_set() function,
which returns true if the bit was set, or false if the CPU turned
out to not be in an extended quiescent state.  Please note that this
function refuses to set the bit for a non-nohz_full CPU when that CPU
is executing in usermode because usermode execution is tracked by RCU
as a dyntick-idle extended quiescent state only for nohz_full CPUs.

Reported-by: Andy Lutomirski <luto@amacapital.net>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
---
 include/linux/rcutiny.h |  5 ++++
 kernel/rcu/tree.c       | 77 +++++++++++++++++++++++++++++++++++++++----------
 kernel/rcu/tree.h       |  1 +
 3 files changed, 67 insertions(+), 16 deletions(-)

diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h
index b452953e21c8..6c9d941e3962 100644
--- a/include/linux/rcutiny.h
+++ b/include/linux/rcutiny.h
@@ -33,6 +33,11 @@ static inline int rcu_dynticks_snap(struct rcu_dynticks *rdtp)
 	return 0;
 }
 
+static inline bool rcu_eqs_special_set(int cpu)
+{
+	return false;  /* Never flag non-existent other CPUs! */
+}
+
 static inline unsigned long get_state_synchronize_rcu(void)
 {
 	return 0;
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 50fee7689e71..0efad311ded4 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -274,9 +274,19 @@ void rcu_bh_qs(void)
 
 static DEFINE_PER_CPU(int, rcu_sched_qs_mask);
 
+/*
+ * Steal a bit from the bottom of ->dynticks for idle entry/exit
+ * control.  Initially this is for TLB flushing.
+ */
+#define RCU_DYNTICK_CTRL_MASK 0x1
+#define RCU_DYNTICK_CTRL_CTR  (RCU_DYNTICK_CTRL_MASK + 1)
+#ifndef rcu_eqs_special_exit
+#define rcu_eqs_special_exit() do { } while (0)
+#endif
+
 static DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = {
 	.dynticks_nesting = DYNTICK_TASK_EXIT_IDLE,
-	.dynticks = ATOMIC_INIT(1),
+	.dynticks = ATOMIC_INIT(RCU_DYNTICK_CTRL_CTR),
 #ifdef CONFIG_NO_HZ_FULL_SYSIDLE
 	.dynticks_idle_nesting = DYNTICK_TASK_NEST_VALUE,
 	.dynticks_idle = ATOMIC_INIT(1),
@@ -290,15 +300,20 @@ static DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = {
 static void rcu_dynticks_eqs_enter(void)
 {
 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
-	int special;
+	int seq;
 
 	/*
-	 * CPUs seeing atomic_inc_return() must see prior RCU read-side
+	 * CPUs seeing atomic_add_return() must see prior RCU read-side
 	 * critical sections, and we also must force ordering with the
 	 * next idle sojourn.
 	 */
-	special = atomic_inc_return(&rdtp->dynticks);
-	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && special & 0x1);
+	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
+	/* Better be in an extended quiescent state! */
+	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
+		     (seq & RCU_DYNTICK_CTRL_CTR));
+	/* Better not have special action (TLB flush) pending! */
+	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
+		     (seq & RCU_DYNTICK_CTRL_MASK));
 }
 
 /*
@@ -308,15 +323,22 @@ static void rcu_dynticks_eqs_enter(void)
 static void rcu_dynticks_eqs_exit(void)
 {
 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
-	int special;
+	int seq;
 
 	/*
-	 * CPUs seeing atomic_inc_return() must see prior idle sojourns,
+	 * CPUs seeing atomic_add_return() must see prior idle sojourns,
 	 * and we also must force ordering with the next RCU read-side
 	 * critical section.
 	 */
-	special = atomic_inc_return(&rdtp->dynticks);
-	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !(special & 0x1));
+	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
+	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
+		     !(seq & RCU_DYNTICK_CTRL_CTR));
+	if (seq & RCU_DYNTICK_CTRL_MASK) {
+		atomic_andnot(RCU_DYNTICK_CTRL_MASK, &rdtp->dynticks);
+		smp_mb__after_atomic(); /* _exit after clearing mask. */
+		/* Prefer duplicate flushes to losing a flush. */
+		rcu_eqs_special_exit();
+	}
 }
 
 /*
@@ -333,9 +355,9 @@ static void rcu_dynticks_eqs_online(void)
 {
 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
 
-	if (atomic_read(&rdtp->dynticks) & 0x1)
+	if (atomic_read(&rdtp->dynticks) & RCU_DYNTICK_CTRL_CTR)
 		return;
-	atomic_add(0x1, &rdtp->dynticks);
+	atomic_add(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
 }
 
 /*
@@ -347,7 +369,7 @@ bool rcu_dynticks_curr_cpu_in_eqs(void)
 {
 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
 
-	return !(atomic_read(&rdtp->dynticks) & 0x1);
+	return !(atomic_read(&rdtp->dynticks) & RCU_DYNTICK_CTRL_CTR);
 }
 
 /*
@@ -358,7 +380,7 @@ int rcu_dynticks_snap(struct rcu_dynticks *rdtp)
 {
 	int snap = atomic_add_return(0, &rdtp->dynticks);
 
-	return snap;
+	return snap & ~RCU_DYNTICK_CTRL_MASK;
 }
 
 /*
@@ -367,7 +389,7 @@ int rcu_dynticks_snap(struct rcu_dynticks *rdtp)
  */
 static bool rcu_dynticks_in_eqs(int snap)
 {
-	return !(snap & 0x1);
+	return !(snap & RCU_DYNTICK_CTRL_CTR);
 }
 
 /*
@@ -387,10 +409,33 @@ static bool rcu_dynticks_in_eqs_since(struct rcu_dynticks *rdtp, int snap)
 static void rcu_dynticks_momentary_idle(void)
 {
 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
-	int special = atomic_add_return(2, &rdtp->dynticks);
+	int special = atomic_add_return(2 * RCU_DYNTICK_CTRL_CTR,
+					&rdtp->dynticks);
 
 	/* It is illegal to call this from idle state. */
-	WARN_ON_ONCE(!(special & 0x1));
+	WARN_ON_ONCE(!(special & RCU_DYNTICK_CTRL_CTR));
+}
+
+/*
+ * Set the special (bottom) bit of the specified CPU so that it
+ * will take special action (such as flushing its TLB) on the
+ * next exit from an extended quiescent state.  Returns true if
+ * the bit was successfully set, or false if the CPU was not in
+ * an extended quiescent state.
+ */
+bool rcu_eqs_special_set(int cpu)
+{
+	int old;
+	int new;
+	struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
+
+	do {
+		old = atomic_read(&rdtp->dynticks);
+		if (old & RCU_DYNTICK_CTRL_CTR)
+			return false;
+		new = old | RCU_DYNTICK_CTRL_MASK;
+	} while (atomic_cmpxchg(&rdtp->dynticks, old, new) != old);
+	return true;
 }
 
 DEFINE_PER_CPU_SHARED_ALIGNED(unsigned long, rcu_qs_ctr);
diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
index ec62a05bfdb3..7468b4de7e0c 100644
--- a/kernel/rcu/tree.h
+++ b/kernel/rcu/tree.h
@@ -596,6 +596,7 @@ extern struct rcu_state rcu_preempt_state;
 #endif /* #ifdef CONFIG_PREEMPT_RCU */
 
 int rcu_dynticks_snap(struct rcu_dynticks *rdtp);
+bool rcu_eqs_special_set(int cpu);
 
 #ifdef CONFIG_RCU_BOOST
 DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status);
-- 
2.5.2

  reply	other threads:[~2017-04-19 17:02 UTC|newest]

Thread overview: 176+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-12 17:40 [PATCH tip/core/rcu 0/40] SRCU callback parallelization for 4.12 Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 01/40] rcu: Maintain special bits at bottom of ->dynticks counter Paul E. McKenney
2017-04-13  9:20   ` Peter Zijlstra
2017-04-13 16:15     ` Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 02/40] rcu: Make arch select smp_mb__after_unlock_lock() strength Paul E. McKenney
2017-04-13  9:21   ` Peter Zijlstra
2017-04-13 16:17     ` Paul E. McKenney
2017-04-13  9:24   ` Peter Zijlstra
2017-04-13 16:26     ` Paul E. McKenney
2017-04-13 16:37       ` Peter Zijlstra
2017-04-13 17:03         ` Paul E. McKenney
2017-04-19 13:38           ` Michael Ellerman
2017-04-19 15:09             ` Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 03/40] srcu: Consolidate batch checking into rcu_all_batches_empty() Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 04/40] srcu: Check for tardy grace-period activity in cleanup_srcu_struct() Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 05/40] rcu: Semicolon inside RCU_TRACE() for rcu.h Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 06/40] rcu: Semicolon inside RCU_TRACE() for Tiny RCU Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 07/40] rcu: Semicolon inside RCU_TRACE() for tree.c Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 08/40] rcu: Make call_rcu() do deferred NOCB wakeups Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 09/40] rcu: Make rcu_all_qs() " Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 10/40] rcu: Make rcu_note_context_switch() " Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 11/40] rcu: Pull rcu_sched_qs_mask into rcu_dynticks structure Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 12/40] rcu: Pull rcu_qs_ctr " Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 13/40] rcu: Eliminate flavor scan in rcu_momentary_dyntick_idle() Paul E. McKenney
2017-04-12 17:39 ` [PATCH tip/core/rcu 14/40] rcu: Place guard on rcu_all_qs() and rcu_note_context_switch() actions Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 15/40] rcu: Default RCU_FANOUT_LEAF to 16 unless explicitly changed Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 16/40] srcu: Abstract multi-tail callback list handling Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 17/40] srcu: Allow SRCU to access rcu_scheduler_active Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 18/40] srcu: Allow early boot use of synchronize_srcu() Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 19/40] rcu: Add single-element dequeue functions to rcu_segcblist Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 20/40] srcu: Move rcu_seq_start() and friends to rcu.h Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 21/40] rcu: Expedited wakeups need to be fully ordered Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 22/40] rcu: Fix warning in rcu_seq_end() Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 23/40] srcu: Push srcu_advance_batches() fastpath into common case Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 24/40] srcu: Move to state-based grace-period sequencing Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 25/40] srcu: Add grace-period sequence numbers Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 26/40] srcu: Use rcu_segcblist to track SRCU callbacks Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 27/40] srcu: Move combining-tree definitions for SRCU's benefit Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 28/40] srcu: Move rcu_init_levelspread() to rcu_tree_node.h Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 29/40] rcu: Remove redundant levelcnt[] array from rcu_init_one() Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 30/40] srcu: Move rcu_node traversal macros to rcu.h Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 31/40] srcu: Make num_rcu_lvl[] array be external Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 32/40] srcu: Fix bogus try_check_zero() comment Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 33/40] srcu: Improve rcu_seq grace-period-counter abstraction Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 34/40] srcu: Allow a second bit in rcu_seq for SRCU state Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 35/40] srcu: Merge ->srcu_state into ->srcu_gp_seq Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 36/40] srcu: Crude control of expedited grace periods Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 37/40] srcu: Create a tiny SRCU Paul E. McKenney
2017-04-13  9:48   ` Peter Zijlstra
2017-04-13 16:30     ` Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 38/40] srcutorture: Print Tiny SRCU reader statistics Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 39/40] srcu: Introduce CLASSIC_SRCU Kconfig option Paul E. McKenney
2017-04-12 17:40 ` [PATCH tip/core/rcu 40/40] srcu: Parallelize callback handling Paul E. McKenney
2017-04-13  9:50   ` Peter Zijlstra
2017-04-13 16:37     ` Paul E. McKenney
2017-04-13 17:42       ` Paul E. McKenney
2017-04-13  9:54   ` Peter Zijlstra
2017-04-13 16:50     ` Paul E. McKenney
2017-04-20  3:40   ` powerpc KVM build break in linux-next (was Re: [PATCH tip/core/rcu 40/40] srcu: Parallelize callback handling) Michael Ellerman
2017-04-20 14:19     ` Paul E. McKenney
2017-04-20 15:28     ` Paolo Bonzini
2017-04-21  0:38       ` Paul E. McKenney
2017-04-21  1:42         ` Michael Ellerman
2017-04-21  4:17           ` Paul E. McKenney
2017-04-21  7:27             ` Paolo Bonzini
2017-04-21 12:51               ` Paul E. McKenney
2017-04-22  6:09                 ` Michael Ellerman
2017-04-21  2:13       ` Michael Ellerman
2017-04-17 23:44 ` [PATCH v2 tip/core/rcu 0/40] SRCU callback parallelization for 4.12 Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 01/39] rcu: Maintain special bits at bottom of ->dynticks counter Paul E. McKenney
2017-04-18  0:07     ` Josh Triplett
2017-04-18 18:19       ` Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 02/39] rcu: Make arch select smp_mb__after_unlock_lock() strength Paul E. McKenney
2017-04-18  0:19     ` Josh Triplett
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 03/39] srcu: Consolidate batch checking into rcu_all_batches_empty() Paul E. McKenney
2017-04-18  0:30     ` Josh Triplett
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 04/39] srcu: Check for tardy grace-period activity in cleanup_srcu_struct() Paul E. McKenney
2017-04-18  0:33     ` Josh Triplett
2017-04-18  0:34       ` Josh Triplett
2017-04-18 18:34         ` Paul E. McKenney
2017-04-18 19:44           ` Josh Triplett
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 05/39] rcu: Semicolon inside RCU_TRACE() for rcu.h Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 06/39] rcu: Semicolon inside RCU_TRACE() for Tiny RCU Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 07/39] rcu: Semicolon inside RCU_TRACE() for tree.c Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 08/39] rcu: Pull rcu_sched_qs_mask into rcu_dynticks structure Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 09/39] rcu: Pull rcu_qs_ctr " Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 10/39] rcu: Eliminate flavor scan in rcu_momentary_dyntick_idle() Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 11/39] rcu: Place guard on rcu_all_qs() and rcu_note_context_switch() actions Paul E. McKenney
2017-04-17 23:44   ` [PATCH v2 tip/core/rcu 12/39] rcu: Default RCU_FANOUT_LEAF to 16 unless explicitly changed Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 13/39] srcu: Abstract multi-tail callback list handling Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 14/39] srcu: Allow SRCU to access rcu_scheduler_active Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 15/39] srcu: Allow early boot use of synchronize_srcu() Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 16/39] rcu: Add single-element dequeue functions to rcu_segcblist Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 17/39] srcu: Move rcu_seq_start() and friends to rcu.h Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 18/39] rcu: Expedited wakeups need to be fully ordered Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 19/39] rcu: Fix warning in rcu_seq_end() Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 20/39] srcu: Push srcu_advance_batches() fastpath into common case Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 21/39] srcu: Move to state-based grace-period sequencing Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 22/39] srcu: Add grace-period sequence numbers Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 23/39] srcu: Use rcu_segcblist to track SRCU callbacks Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 24/39] srcu: Move combining-tree definitions for SRCU's benefit Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 25/39] srcu: Move rcu_init_levelspread() to rcu_tree_node.h Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 26/39] rcu: Remove redundant levelcnt[] array from rcu_init_one() Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 27/39] srcu: Move rcu_node traversal macros to rcu.h Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 28/39] srcu: Make num_rcu_lvl[] array be external Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 29/39] srcu: Fix bogus try_check_zero() comment Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 30/39] srcu: Improve rcu_seq grace-period-counter abstraction Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 31/39] srcu: Allow a second bit in rcu_seq for SRCU state Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 32/39] srcu: Merge ->srcu_state into ->srcu_gp_seq Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 33/39] srcu: Crude control of expedited grace periods Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 34/39] mm: Use static initialization for "srcu" Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 35/39] srcu: Create a tiny SRCU Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 36/39] srcutorture: Print Tiny SRCU reader statistics Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 37/39] srcu: Introduce CLASSIC_SRCU Kconfig option Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 38/39] srcu: Parallelize callback handling Paul E. McKenney
2017-04-17 23:45   ` [PATCH v2 tip/core/rcu 39/39] rcu: Make non-preemptive schedule be Tasks RCU quiescent state Paul E. McKenney
2017-04-19 16:58   ` [PATCH v3 tip/core/rcu 0/40] SRCU callback parallelization for 4.12 Paul E. McKenney
2017-04-19 16:57     ` Paul E. McKenney [this message]
2017-04-19 16:57     ` [PATCH v3 tip/core/rcu 02/40] rcu: Make arch select smp_mb__after_unlock_lock() strength Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 03/40] srcu: Consolidate batch checking into rcu_all_batches_empty() Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 04/40] srcu: Check for tardy grace-period activity in cleanup_srcu_struct() Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 05/40] rcu: Semicolon inside RCU_TRACE() for rcu.h Paul E. McKenney
2017-04-19 17:41       ` Joe Perches
2017-04-25 21:00         ` Paul E. McKenney
2017-04-25 21:13       ` Steven Rostedt
2017-04-25 21:27         ` Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 06/40] rcu: Semicolon inside RCU_TRACE() for Tiny RCU Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 07/40] rcu: Semicolon inside RCU_TRACE() for tree.c Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 08/40] rcu: Pull rcu_sched_qs_mask into rcu_dynticks structure Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 09/40] rcu: Pull rcu_qs_ctr " Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 10/40] rcu: Eliminate flavor scan in rcu_momentary_dyntick_idle() Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 11/40] rcu: Place guard on rcu_all_qs() and rcu_note_context_switch() actions Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 12/40] rcu: Default RCU_FANOUT_LEAF to 16 unless explicitly changed Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 13/40] srcu: Abstract multi-tail callback list handling Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 14/40] srcu: Allow SRCU to access rcu_scheduler_active Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 15/40] srcu: Allow early boot use of synchronize_srcu() Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 16/40] rcu: Add single-element dequeue functions to rcu_segcblist Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 17/40] srcu: Move rcu_seq_start() and friends to rcu.h Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 18/40] rcu: Expedited wakeups need to be fully ordered Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 19/40] rcu: Fix warning in rcu_seq_end() Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 20/40] srcu: Push srcu_advance_batches() fastpath into common case Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 21/40] srcu: Move to state-based grace-period sequencing Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 22/40] srcu: Add grace-period sequence numbers Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 23/40] srcu: Use rcu_segcblist to track SRCU callbacks Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 24/40] srcu: Move combining-tree definitions for SRCU's benefit Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 25/40] srcu: Move rcu_init_levelspread() to rcu_tree_node.h Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 26/40] rcu: Remove redundant levelcnt[] array from rcu_init_one() Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 27/40] srcu: Move rcu_node traversal macros to rcu.h Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 28/40] srcu: Make num_rcu_lvl[] array be external Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 29/40] srcu: Fix bogus try_check_zero() comment Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 30/40] srcu: Improve rcu_seq grace-period-counter abstraction Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 31/40] srcu: Allow a second bit in rcu_seq for SRCU state Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 32/40] srcu: Merge ->srcu_state into ->srcu_gp_seq Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 33/40] srcu: Crude control of expedited grace periods Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 34/40] mm: Use static initialization for "srcu" Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 35/40] srcu: Create a tiny SRCU Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 36/40] srcutorture: Print Tiny SRCU reader statistics Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 37/40] srcu: Introduce CLASSIC_SRCU Kconfig option Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 38/40] srcu: Parallelize callback handling Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 39/40] srcu: Expedite srcu_schedule_cbs_snp() callback invocation Paul E. McKenney
2017-04-19 16:58     ` [PATCH v3 tip/core/rcu 40/40] rcu: Make non-preemptive schedule be Tasks RCU quiescent state Paul E. McKenney
2017-09-28  9:37       ` Sasha Levin
2017-09-28 12:30         ` Paul E. McKenney
2017-09-28 15:38           ` Levin, Alexander (Sasha Levin)
2017-09-28 16:05             ` Paul E. McKenney
2017-09-28 16:18               ` Peter Zijlstra
2017-09-28 16:30                 ` Paul E. McKenney
2017-09-29  9:30               ` Boqun Feng
2017-09-29 10:01                 ` Paolo Bonzini
2017-09-29 10:25                   ` Boqun Feng
2017-09-29 10:34                   ` Peter Zijlstra
2017-09-29 11:44                     ` Paolo Bonzini
2017-09-29 16:38                       ` Paul E. McKenney
2017-09-29 16:36                   ` Paul E. McKenney
2017-09-28 16:08             ` Peter Zijlstra
2017-09-28 16:23               ` Levin, Alexander (Sasha Levin)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1492621117-13939-1-git-send-email-paulmck@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=bobby.prani@gmail.com \
    --cc=dhowells@redhat.com \
    --cc=dipankar@in.ibm.com \
    --cc=edumazet@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jiangshanlai@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).