public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/5] misc RCU fixes and cleanups
@ 2023-07-29 14:27 Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 1/5] rcutorture: Fix stuttering races and other issues Joel Fernandes (Google)
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel; +Cc: rcu, paulmck, Joel Fernandes (Google)

Here are some RCU fixes and cleanups. The main one is the TREE07 stuttering fix
which makes the test pass now. Thanks.

Joel Fernandes (Google) (5):
  rcutorture: Fix stuttering races and other issues
  srcu: Fix error handling in init_srcu_struct_fields()
  tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger
  tree/nocb: Improve readability of nocb_gp_wait()
  rcu/tree: Remove superfluous return from void call_rcu* functions

 kernel/rcu/srcutree.c  |  32 ++++++------
 kernel/rcu/tree.c      |   4 +-
 kernel/rcu/tree.h      |   4 +-
 kernel/rcu/tree_nocb.h | 113 ++++++++++++++++++++++++-----------------
 kernel/torture.c       |  45 +++++-----------
 5 files changed, 99 insertions(+), 99 deletions(-)

-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] rcutorture: Fix stuttering races and other issues
  2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
@ 2023-07-29 14:27 ` Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 2/5] srcu: Fix error handling in init_srcu_struct_fields() Joel Fernandes (Google)
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Joel Fernandes (Google), stable, Davidlohr Bueso,
	Josh Triplett

The stuttering code isn't functioning as expected. Ideally, it should
pause the torture threads for a designated period before resuming. Yet,
it fails to halt the test for the correct duration. Additionally, a race
condition exists, potentially causing the stuttering code to pause for
an extended period if the 'spt' variable is non-zero due to the stutter
orchestration thread's inadequate CPU time.

Moreover, over-stuttering can hinder RCU's progress on TREE07 kernels.
This happens as the stuttering code may run within a softirq due to RCU
callbacks. Consequently, ksoftirqd keeps a CPU busy for several seconds,
thus obstructing RCU's progress. This situation triggers a warning
message in the logs:

[ 2169.481783] rcu_torture_writer: rtort_pipe_count: 9

This warning suggests that an RCU torture object, although invisible to
RCU readers, couldn't make it past the pipe array and be freed -- a
strong indication that there weren't enough grace periods during the
stutter interval.

To address these issues, this patch sets the "stutter end" time to an
absolute point in the future set by the main stutter thread. This is
then used for waiting in stutter_wait(). While the stutter thread still
defines this absolute time, the waiters' waiting logic doesn't rely on
the stutter thread receiving sufficient CPU time to halt the stuttering
as the halting is now self-controlled.

Cc: stable@vger.kernel.org
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/torture.c | 45 ++++++++++++---------------------------------
 1 file changed, 12 insertions(+), 33 deletions(-)

diff --git a/kernel/torture.c b/kernel/torture.c
index 6ba62e5993e7..fd353f98162f 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -720,7 +720,7 @@ static void torture_shutdown_cleanup(void)
  * suddenly applied to or removed from the system.
  */
 static struct task_struct *stutter_task;
-static int stutter_pause_test;
+static ktime_t stutter_till_abs_time;
 static int stutter;
 static int stutter_gap;
 
@@ -730,30 +730,16 @@ static int stutter_gap;
  */
 bool stutter_wait(const char *title)
 {
-	unsigned int i = 0;
 	bool ret = false;
-	int spt;
+	ktime_t till_ns;
 
 	cond_resched_tasks_rcu_qs();
-	spt = READ_ONCE(stutter_pause_test);
-	for (; spt; spt = READ_ONCE(stutter_pause_test)) {
-		if (!ret && !rt_task(current)) {
-			sched_set_normal(current, MAX_NICE);
-			ret = true;
-		}
-		if (spt == 1) {
-			torture_hrtimeout_jiffies(1, NULL);
-		} else if (spt == 2) {
-			while (READ_ONCE(stutter_pause_test)) {
-				if (!(i++ & 0xffff))
-					torture_hrtimeout_us(10, 0, NULL);
-				cond_resched();
-			}
-		} else {
-			torture_hrtimeout_jiffies(round_jiffies_relative(HZ), NULL);
-		}
-		torture_shutdown_absorb(title);
+	till_ns = READ_ONCE(stutter_till_abs_time);
+	if (till_ns && ktime_before(ktime_get(), till_ns)) {
+		torture_hrtimeout_ns(till_ns, 0, HRTIMER_MODE_ABS, NULL);
+		ret = true;
 	}
+	torture_shutdown_absorb(title);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(stutter_wait);
@@ -764,23 +750,16 @@ EXPORT_SYMBOL_GPL(stutter_wait);
  */
 static int torture_stutter(void *arg)
 {
-	DEFINE_TORTURE_RANDOM(rand);
-	int wtime;
+	ktime_t till_ns;
 
 	VERBOSE_TOROUT_STRING("torture_stutter task started");
 	do {
 		if (!torture_must_stop() && stutter > 1) {
-			wtime = stutter;
-			if (stutter > 2) {
-				WRITE_ONCE(stutter_pause_test, 1);
-				wtime = stutter - 3;
-				torture_hrtimeout_jiffies(wtime, &rand);
-				wtime = 2;
-			}
-			WRITE_ONCE(stutter_pause_test, 2);
-			torture_hrtimeout_jiffies(wtime, NULL);
+			till_ns = ktime_add_ns(ktime_get(),
+					       jiffies_to_nsecs(stutter));
+			WRITE_ONCE(stutter_till_abs_time, till_ns);
+			torture_hrtimeout_jiffies(stutter - 1, NULL);
 		}
-		WRITE_ONCE(stutter_pause_test, 0);
 		if (!torture_must_stop())
 			torture_hrtimeout_jiffies(stutter_gap, NULL);
 		torture_shutdown_absorb("torture_stutter");
-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/5] srcu: Fix error handling in init_srcu_struct_fields()
  2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 1/5] rcutorture: Fix stuttering races and other issues Joel Fernandes (Google)
@ 2023-07-29 14:27 ` Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger Joel Fernandes (Google)
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Joel Fernandes (Google), Lai Jiangshan,
	Josh Triplett, Steven Rostedt, Mathieu Desnoyers

The current error handling in init_srcu_struct_fields() is a bit
inconsistent.  If init_srcu_struct_nodes() fails, the function either
returns -ENOMEM or 0 depending on whether ssp->sda_is_static is true or
false. This can make init_srcu_struct_fields() return 0 even if memory
allocation failed!

Simplify the error handling by always returning -ENOMEM if either
init_srcu_struct_nodes() or the per-CPU allocation fails. This makes the
control flow easier to follow and avoids the inconsistent return values.

Add goto labels to avoid duplicating the error cleanup code.

Link: https://lore.kernel.org/r/20230404003508.GA254019@google.com
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/rcu/srcutree.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
index 20d7a238d675..f1a905200fc2 100644
--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -255,29 +255,31 @@ static int init_srcu_struct_fields(struct srcu_struct *ssp, bool is_static)
 	ssp->srcu_sup->sda_is_static = is_static;
 	if (!is_static)
 		ssp->sda = alloc_percpu(struct srcu_data);
-	if (!ssp->sda) {
-		if (!is_static)
-			kfree(ssp->srcu_sup);
-		return -ENOMEM;
-	}
+	if (!ssp->sda)
+		goto err_free_sup;
 	init_srcu_struct_data(ssp);
 	ssp->srcu_sup->srcu_gp_seq_needed_exp = 0;
 	ssp->srcu_sup->srcu_last_gp_end = ktime_get_mono_fast_ns();
 	if (READ_ONCE(ssp->srcu_sup->srcu_size_state) == SRCU_SIZE_SMALL && SRCU_SIZING_IS_INIT()) {
-		if (!init_srcu_struct_nodes(ssp, GFP_ATOMIC)) {
-			if (!ssp->srcu_sup->sda_is_static) {
-				free_percpu(ssp->sda);
-				ssp->sda = NULL;
-				kfree(ssp->srcu_sup);
-				return -ENOMEM;
-			}
-		} else {
-			WRITE_ONCE(ssp->srcu_sup->srcu_size_state, SRCU_SIZE_BIG);
-		}
+		if (!init_srcu_struct_nodes(ssp, GFP_ATOMIC))
+			goto err_free_sda;
+		WRITE_ONCE(ssp->srcu_sup->srcu_size_state, SRCU_SIZE_BIG);
 	}
 	ssp->srcu_sup->srcu_ssp = ssp;
 	smp_store_release(&ssp->srcu_sup->srcu_gp_seq_needed, 0); /* Init done. */
 	return 0;
+
+err_free_sda:
+	if (!is_static) {
+		free_percpu(ssp->sda);
+		ssp->sda = NULL;
+	}
+err_free_sup:
+	if (!is_static) {
+		kfree(ssp->srcu_sup);
+		ssp->srcu_sup = NULL;
+	}
+	return -ENOMEM;
 }
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger
  2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 1/5] rcutorture: Fix stuttering races and other issues Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 2/5] srcu: Fix error handling in init_srcu_struct_fields() Joel Fernandes (Google)
@ 2023-07-29 14:27 ` Joel Fernandes (Google)
  2023-08-29 10:53   ` Frederic Weisbecker
  2023-07-29 14:27 ` [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait() Joel Fernandes (Google)
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Joel Fernandes (Google), Frederic Weisbecker,
	Neeraj Upadhyay, Josh Triplett, Boqun Feng, Steven Rostedt,
	Mathieu Desnoyers, Lai Jiangshan, Zqiang

This is needed to make the next patch work correctly as we rely on the
strength of the wakeup when comparing deferred-wakeup types across
different CPUs.

Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/rcu/tree.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
index 192536916f9a..0f40a9c2b78d 100644
--- a/kernel/rcu/tree.h
+++ b/kernel/rcu/tree.h
@@ -288,8 +288,8 @@ struct rcu_data {
 
 /* Values for nocb_defer_wakeup field in struct rcu_data. */
 #define RCU_NOCB_WAKE_NOT	0
-#define RCU_NOCB_WAKE_BYPASS	1
-#define RCU_NOCB_WAKE_LAZY	2
+#define RCU_NOCB_WAKE_LAZY	1
+#define RCU_NOCB_WAKE_BYPASS	2
 #define RCU_NOCB_WAKE		3
 #define RCU_NOCB_WAKE_FORCE	4
 
-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait()
  2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
                   ` (2 preceding siblings ...)
  2023-07-29 14:27 ` [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger Joel Fernandes (Google)
@ 2023-07-29 14:27 ` Joel Fernandes (Google)
  2023-08-29 14:45   ` Frederic Weisbecker
  2023-07-29 14:27 ` [PATCH 5/5] Revert "checkpatch: Error out if deprecated RCU API used" Joel Fernandes (Google)
  2023-07-29 14:27 ` [PATCH v2 5/5] rcu/tree: Remove superfluous return from void call_rcu* functions Joel Fernandes (Google)
  5 siblings, 1 reply; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Joel Fernandes (Google), Frederic Weisbecker,
	Neeraj Upadhyay, Josh Triplett, Boqun Feng, Steven Rostedt,
	Mathieu Desnoyers, Lai Jiangshan, Zqiang

The nocb_gp_wait() function contains logic to check each rdp's bypass
list, flush if needed, and decide on wakeups. This makes the function
hard to follow.

Split out the bypass checking and flushing into a separate helper
nocb_gp_flush_wake(). The new function encapsulates the logic to:

- Check if the bypass needs to be flushed
- Flush if needed
- Return info on wakeups (lazy, bypass or none)

nocb_gp_wait() now becomes simpler by calling the helper to handle
the bypass flushing and waking logic.

This splitting improves the readability and maintainability of the
code by encapsulating related logic into a function with a clear
purpose.

Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/rcu/tree_nocb.h | 113 ++++++++++++++++++++++++-----------------
 1 file changed, 66 insertions(+), 47 deletions(-)

diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 5598212d1f27..c805825c3f00 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -670,22 +670,68 @@ static void nocb_gp_sleep(struct rcu_data *my_rdp, int cpu)
 	trace_rcu_nocb_wake(rcu_state.name, cpu, TPS("EndSleep"));
 }
 
+/*
+ * Given an rdp, flush its bypass list if needed and return information about
+ * if a deferred-wakeup needs to be organized depending on whether things are
+ * still in the bypass list. Also tell caller if the list was flushed and if it
+ * is still empty after any flushing.
+ */
+static int nocb_gp_flush_wake(struct rcu_data *rdp, bool *empty, bool *flush)
+{
+	long bypass_ncbs;
+	long lazy_ncbs;
+	unsigned long j = jiffies;
+
+	trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check"));
+	lockdep_assert_held(&rdp->nocb_lock);
+	bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
+	lazy_ncbs = READ_ONCE(rdp->lazy_len);
+
+	*flush = false;
+	*empty = false;
+	if (bypass_ncbs && (lazy_ncbs == bypass_ncbs) &&
+	    (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + jiffies_till_flush) ||
+	     bypass_ncbs > 2 * qhimark)) {
+		*flush = true;
+	} else if (bypass_ncbs && (lazy_ncbs != bypass_ncbs) &&
+			(time_after(j, READ_ONCE(rdp->nocb_bypass_first) + 1) ||
+			 bypass_ncbs > 2 * qhimark)) {
+		*flush = true;
+	} else if (!bypass_ncbs && rcu_segcblist_empty(&rdp->cblist)) {
+		*empty = true;
+		return RCU_NOCB_WAKE_NOT;
+	}
+
+	if (*flush) {
+		// Bypass full or old, so flush it.
+		(void)rcu_nocb_try_flush_bypass(rdp, j);
+		bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
+		lazy_ncbs = READ_ONCE(rdp->lazy_len);
+	}
+
+	if (bypass_ncbs) {
+		trace_rcu_nocb_wake(rcu_state.name, rdp->cpu,
+				    bypass_ncbs == lazy_ncbs ? TPS("Lazy") : TPS("Bypass"));
+		return (bypass_ncbs == lazy_ncbs ? RCU_NOCB_WAKE_LAZY :
+						   RCU_NOCB_WAKE_BYPASS);
+	}
+	return RCU_NOCB_WAKE_NOT;
+}
+
 /*
  * No-CBs GP kthreads come here to wait for additional callbacks to show up
  * or for grace periods to end.
  */
 static void nocb_gp_wait(struct rcu_data *my_rdp)
 {
-	bool bypass = false;
 	int __maybe_unused cpu = my_rdp->cpu;
 	unsigned long cur_gp_seq;
 	unsigned long flags;
 	bool gotcbs = false;
-	unsigned long j = jiffies;
-	bool lazy = false;
 	bool needwait_gp = false; // This prevents actual uninitialized use.
 	bool needwake;
 	bool needwake_gp;
+	int defer_wake_type = RCU_NOCB_WAKE_NOT;
 	struct rcu_data *rdp, *rdp_toggling = NULL;
 	struct rcu_node *rnp;
 	unsigned long wait_gp_seq = 0; // Suppress "use uninitialized" warning.
@@ -712,44 +758,24 @@ static void nocb_gp_wait(struct rcu_data *my_rdp)
 	 * won't be ignored for long.
 	 */
 	list_for_each_entry(rdp, &my_rdp->nocb_head_rdp, nocb_entry_rdp) {
-		long bypass_ncbs;
-		bool flush_bypass = false;
-		long lazy_ncbs;
+		int defer_wake_type_one = RCU_NOCB_WAKE_NOT;
+		bool flushed;
+		bool empty;
 
-		trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check"));
 		rcu_nocb_lock_irqsave(rdp, flags);
-		lockdep_assert_held(&rdp->nocb_lock);
-		bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
-		lazy_ncbs = READ_ONCE(rdp->lazy_len);
+		defer_wake_type_one = nocb_gp_flush_wake(rdp, &empty, &flushed);
 
-		if (bypass_ncbs && (lazy_ncbs == bypass_ncbs) &&
-		    (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + jiffies_till_flush) ||
-		     bypass_ncbs > 2 * qhimark)) {
-			flush_bypass = true;
-		} else if (bypass_ncbs && (lazy_ncbs != bypass_ncbs) &&
-		    (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + 1) ||
-		     bypass_ncbs > 2 * qhimark)) {
-			flush_bypass = true;
-		} else if (!bypass_ncbs && rcu_segcblist_empty(&rdp->cblist)) {
-			rcu_nocb_unlock_irqrestore(rdp, flags);
-			continue; /* No callbacks here, try next. */
-		}
+		// We may need to do a deferred wakeup later for bypass/lazy
+		// So note down what we learnt from the rdp.
+		defer_wake_type = max(defer_wake_type_one, defer_wake_type);
 
-		if (flush_bypass) {
-			// Bypass full or old, so flush it.
-			(void)rcu_nocb_try_flush_bypass(rdp, j);
-			bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
-			lazy_ncbs = READ_ONCE(rdp->lazy_len);
+		// Did we make any updates to main cblist? If not, no
+		// non-deferred wake up to do for this rdp.
+		if (!flushed && empty) {
+			rcu_nocb_unlock_irqrestore(rdp, flags);
+			continue;
 		}
 
-		if (bypass_ncbs) {
-			trace_rcu_nocb_wake(rcu_state.name, rdp->cpu,
-					    bypass_ncbs == lazy_ncbs ? TPS("Lazy") : TPS("Bypass"));
-			if (bypass_ncbs == lazy_ncbs)
-				lazy = true;
-			else
-				bypass = true;
-		}
 		rnp = rdp->mynode;
 
 		// Advance callbacks if helpful and low contention.
@@ -792,23 +818,16 @@ static void nocb_gp_wait(struct rcu_data *my_rdp)
 			rcu_gp_kthread_wake();
 	}
 
-	my_rdp->nocb_gp_bypass = bypass;
+	my_rdp->nocb_gp_bypass = (defer_wake_type == RCU_NOCB_WAKE_BYPASS);
 	my_rdp->nocb_gp_gp = needwait_gp;
 	my_rdp->nocb_gp_seq = needwait_gp ? wait_gp_seq : 0;
 
 	// At least one child with non-empty ->nocb_bypass, so set
 	// timer in order to avoid stranding its callbacks.
-	if (!rcu_nocb_poll) {
-		// If bypass list only has lazy CBs. Add a deferred lazy wake up.
-		if (lazy && !bypass) {
-			wake_nocb_gp_defer(my_rdp, RCU_NOCB_WAKE_LAZY,
-					TPS("WakeLazyIsDeferred"));
-		// Otherwise add a deferred bypass wake up.
-		} else if (bypass) {
-			wake_nocb_gp_defer(my_rdp, RCU_NOCB_WAKE_BYPASS,
-					TPS("WakeBypassIsDeferred"));
-		}
-	}
+	if (!rcu_nocb_poll && defer_wake_type != RCU_NOCB_WAKE_NOT)
+		wake_nocb_gp_defer(my_rdp, defer_wake_type,
+				   defer_wake_type == RCU_NOCB_WAKE_LAZY ?
+				   TPS("WakeLazyIsDeferred") : TPS("WakeBypassIsDeferred"));
 
 	if (rcu_nocb_poll) {
 		/* Polling, so trace if first poll in the series. */
-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 5/5] Revert "checkpatch: Error out if deprecated RCU API used"
  2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
                   ` (3 preceding siblings ...)
  2023-07-29 14:27 ` [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait() Joel Fernandes (Google)
@ 2023-07-29 14:27 ` Joel Fernandes (Google)
  2023-07-29 14:29   ` Joel Fernandes
  2023-07-29 14:27 ` [PATCH v2 5/5] rcu/tree: Remove superfluous return from void call_rcu* functions Joel Fernandes (Google)
  5 siblings, 1 reply; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Joel Fernandes (Google), Andy Whitcroft,
	Joe Perches, Dwaipayan Ray, Lukas Bulwahn

The check for single-argument kfree_rcu() is no longer needed as all
users have been converted.

This reverts commit 1eacac3255495be7502d406e2ba5444fb5c3607c.

Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 scripts/checkpatch.pl | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index a9841148cde2..528f619520eb 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -6422,15 +6422,6 @@ sub process {
 			}
 		}
 
-# check for soon-to-be-deprecated single-argument k[v]free_rcu() API
-		if ($line =~ /\bk[v]?free_rcu\s*\([^(]+\)/) {
-			if ($line =~ /\bk[v]?free_rcu\s*\([^,]+\)/) {
-				ERROR("DEPRECATED_API",
-				      "Single-argument k[v]free_rcu() API is deprecated, please pass rcu_head object or call k[v]free_rcu_mightsleep()." . $herecurr);
-			}
-		}
-
-
 # check for unnecessary "Out of Memory" messages
 		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
 		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 5/5] rcu/tree: Remove superfluous return from void call_rcu* functions
  2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
                   ` (4 preceding siblings ...)
  2023-07-29 14:27 ` [PATCH 5/5] Revert "checkpatch: Error out if deprecated RCU API used" Joel Fernandes (Google)
@ 2023-07-29 14:27 ` Joel Fernandes (Google)
  2023-07-29 22:19   ` Paul E. McKenney
  5 siblings, 1 reply; 13+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-29 14:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Joel Fernandes (Google), Frederic Weisbecker,
	Neeraj Upadhyay, Josh Triplett, Boqun Feng, Steven Rostedt,
	Mathieu Desnoyers, Lai Jiangshan, Zqiang

The return keyword is not needed here.

Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/rcu/tree.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index cb1caefa8bd0..7c79480bfaa0 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2713,7 +2713,7 @@ __call_rcu_common(struct rcu_head *head, rcu_callback_t func, bool lazy_in)
  */
 void call_rcu_hurry(struct rcu_head *head, rcu_callback_t func)
 {
-	return __call_rcu_common(head, func, false);
+	__call_rcu_common(head, func, false);
 }
 EXPORT_SYMBOL_GPL(call_rcu_hurry);
 #endif
@@ -2764,7 +2764,7 @@ EXPORT_SYMBOL_GPL(call_rcu_hurry);
  */
 void call_rcu(struct rcu_head *head, rcu_callback_t func)
 {
-	return __call_rcu_common(head, func, IS_ENABLED(CONFIG_RCU_LAZY));
+	__call_rcu_common(head, func, IS_ENABLED(CONFIG_RCU_LAZY));
 }
 EXPORT_SYMBOL_GPL(call_rcu);
 
-- 
2.41.0.487.g6d72f3e995-goog


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 5/5] Revert "checkpatch: Error out if deprecated RCU API used"
  2023-07-29 14:27 ` [PATCH 5/5] Revert "checkpatch: Error out if deprecated RCU API used" Joel Fernandes (Google)
@ 2023-07-29 14:29   ` Joel Fernandes
  0 siblings, 0 replies; 13+ messages in thread
From: Joel Fernandes @ 2023-07-29 14:29 UTC (permalink / raw)
  To: linux-kernel
  Cc: rcu, paulmck, Andy Whitcroft, Joe Perches, Dwaipayan Ray,
	Lukas Bulwahn

On Sat, Jul 29, 2023 at 10:27 AM Joel Fernandes (Google)
<joel@joelfernandes.org> wrote:
>
> The check for single-argument kfree_rcu() is no longer needed as all
> users have been converted.
>
> This reverts commit 1eacac3255495be7502d406e2ba5444fb5c3607c.
>
> Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> ---

Ignore this particular patch since it was already applied, sorry for
resend. Thank you!

 - Joel



>  scripts/checkpatch.pl | 9 ---------
>  1 file changed, 9 deletions(-)
>
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index a9841148cde2..528f619520eb 100755
> --- a/scripts/checkpatch.pl
> +++ b/scripts/checkpatch.pl
> @@ -6422,15 +6422,6 @@ sub process {
>                         }
>                 }
>
> -# check for soon-to-be-deprecated single-argument k[v]free_rcu() API
> -               if ($line =~ /\bk[v]?free_rcu\s*\([^(]+\)/) {
> -                       if ($line =~ /\bk[v]?free_rcu\s*\([^,]+\)/) {
> -                               ERROR("DEPRECATED_API",
> -                                     "Single-argument k[v]free_rcu() API is deprecated, please pass rcu_head object or call k[v]free_rcu_mightsleep()." . $herecurr);
> -                       }
> -               }
> -
> -
>  # check for unnecessary "Out of Memory" messages
>                 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
>                     $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
> --
> 2.41.0.487.g6d72f3e995-goog
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 5/5] rcu/tree: Remove superfluous return from void call_rcu* functions
  2023-07-29 14:27 ` [PATCH v2 5/5] rcu/tree: Remove superfluous return from void call_rcu* functions Joel Fernandes (Google)
@ 2023-07-29 22:19   ` Paul E. McKenney
  0 siblings, 0 replies; 13+ messages in thread
From: Paul E. McKenney @ 2023-07-29 22:19 UTC (permalink / raw)
  To: Joel Fernandes (Google)
  Cc: linux-kernel, rcu, Frederic Weisbecker, Neeraj Upadhyay,
	Josh Triplett, Boqun Feng, Steven Rostedt, Mathieu Desnoyers,
	Lai Jiangshan, Zqiang

On Sat, Jul 29, 2023 at 02:27:36PM +0000, Joel Fernandes (Google) wrote:
> The return keyword is not needed here.
> 
> Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>

Odd that this is allowed.  ;-)

I took 1, 2, and 5, thank you!  It would still be good to get Frederic's
eyes on 3 and 4.

							Thanx, Paul

> ---
>  kernel/rcu/tree.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> index cb1caefa8bd0..7c79480bfaa0 100644
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -2713,7 +2713,7 @@ __call_rcu_common(struct rcu_head *head, rcu_callback_t func, bool lazy_in)
>   */
>  void call_rcu_hurry(struct rcu_head *head, rcu_callback_t func)
>  {
> -	return __call_rcu_common(head, func, false);
> +	__call_rcu_common(head, func, false);
>  }
>  EXPORT_SYMBOL_GPL(call_rcu_hurry);
>  #endif
> @@ -2764,7 +2764,7 @@ EXPORT_SYMBOL_GPL(call_rcu_hurry);
>   */
>  void call_rcu(struct rcu_head *head, rcu_callback_t func)
>  {
> -	return __call_rcu_common(head, func, IS_ENABLED(CONFIG_RCU_LAZY));
> +	__call_rcu_common(head, func, IS_ENABLED(CONFIG_RCU_LAZY));
>  }
>  EXPORT_SYMBOL_GPL(call_rcu);
>  
> -- 
> 2.41.0.487.g6d72f3e995-goog
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger
  2023-07-29 14:27 ` [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger Joel Fernandes (Google)
@ 2023-08-29 10:53   ` Frederic Weisbecker
  2023-08-30 21:13     ` Joel Fernandes
  0 siblings, 1 reply; 13+ messages in thread
From: Frederic Weisbecker @ 2023-08-29 10:53 UTC (permalink / raw)
  To: Joel Fernandes (Google)
  Cc: linux-kernel, rcu, paulmck, Neeraj Upadhyay, Josh Triplett,
	Boqun Feng, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	Zqiang

On Sat, Jul 29, 2023 at 02:27:33PM +0000, Joel Fernandes (Google) wrote:
> This is needed to make the next patch work correctly as we rely on the
> strength of the wakeup when comparing deferred-wakeup types across
> different CPUs.
> 
> Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> ---
>  kernel/rcu/tree.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
> index 192536916f9a..0f40a9c2b78d 100644
> --- a/kernel/rcu/tree.h
> +++ b/kernel/rcu/tree.h
> @@ -288,8 +288,8 @@ struct rcu_data {
>  
>  /* Values for nocb_defer_wakeup field in struct rcu_data. */
>  #define RCU_NOCB_WAKE_NOT	0
> -#define RCU_NOCB_WAKE_BYPASS	1
> -#define RCU_NOCB_WAKE_LAZY	2
> +#define RCU_NOCB_WAKE_LAZY	1
> +#define RCU_NOCB_WAKE_BYPASS	2
>  #define RCU_NOCB_WAKE		3
>  #define RCU_NOCB_WAKE_FORCE	4

Good change but make sure to audit all the occurences of
RCU_NOCB_WAKE_LAZY and RCU_NOCB_WAKE_BYPASS. For example this breaks
do_nocb_deferred_wakeup_timer() that will now ignore RCU_NOCB_WAKE_LAZY
timers.

Thanks.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait()
  2023-07-29 14:27 ` [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait() Joel Fernandes (Google)
@ 2023-08-29 14:45   ` Frederic Weisbecker
  2023-08-30 21:27     ` Joel Fernandes
  0 siblings, 1 reply; 13+ messages in thread
From: Frederic Weisbecker @ 2023-08-29 14:45 UTC (permalink / raw)
  To: Joel Fernandes (Google)
  Cc: linux-kernel, rcu, paulmck, Neeraj Upadhyay, Josh Triplett,
	Boqun Feng, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	Zqiang

On Sat, Jul 29, 2023 at 02:27:34PM +0000, Joel Fernandes (Google) wrote:
>  /*
>   * No-CBs GP kthreads come here to wait for additional callbacks to show up
>   * or for grace periods to end.
>   */
>  static void nocb_gp_wait(struct rcu_data *my_rdp)
>  {
> -	bool bypass = false;
>  	int __maybe_unused cpu = my_rdp->cpu;
>  	unsigned long cur_gp_seq;
>  	unsigned long flags;
>  	bool gotcbs = false;
> -	unsigned long j = jiffies;
> -	bool lazy = false;
>  	bool needwait_gp = false; // This prevents actual uninitialized use.
>  	bool needwake;
>  	bool needwake_gp;
> +	int defer_wake_type = RCU_NOCB_WAKE_NOT;
>  	struct rcu_data *rdp, *rdp_toggling = NULL;
>  	struct rcu_node *rnp;
>  	unsigned long wait_gp_seq = 0; // Suppress "use uninitialized" warning.
> @@ -712,44 +758,24 @@ static void nocb_gp_wait(struct rcu_data *my_rdp)
>  	 * won't be ignored for long.
>  	 */
>  	list_for_each_entry(rdp, &my_rdp->nocb_head_rdp, nocb_entry_rdp) {
> -		long bypass_ncbs;
> -		bool flush_bypass = false;
> -		long lazy_ncbs;
> +		int defer_wake_type_one = RCU_NOCB_WAKE_NOT;

No need to initialize it, nocb_gp_flush_wake() always returns a value, and
it will avoid mistakes in the future if nocb_gp_flush_wake() is moved and
accidentally not called.

> +		bool flushed;
> +		bool empty;
>  
> -		trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check"));
>  		rcu_nocb_lock_irqsave(rdp, flags);
> -		lockdep_assert_held(&rdp->nocb_lock);
> -		bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
> -		lazy_ncbs = READ_ONCE(rdp->lazy_len);
> +		defer_wake_type_one = nocb_gp_flush_wake(rdp, &empty, &flushed);
>  
> -		if (bypass_ncbs && (lazy_ncbs == bypass_ncbs) &&
> -		    (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + jiffies_till_flush) ||
> -		     bypass_ncbs > 2 * qhimark)) {
> -			flush_bypass = true;
> -		} else if (bypass_ncbs && (lazy_ncbs != bypass_ncbs) &&
> -		    (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + 1) ||
> -		     bypass_ncbs > 2 * qhimark)) {
> -			flush_bypass = true;
> -		} else if (!bypass_ncbs && rcu_segcblist_empty(&rdp->cblist)) {
> -			rcu_nocb_unlock_irqrestore(rdp, flags);
> -			continue; /* No callbacks here, try next. */
> -		}
> +		// We may need to do a deferred wakeup later for bypass/lazy
> +		// So note down what we learnt from the rdp.
> +		defer_wake_type = max(defer_wake_type_one, defer_wake_type);
>  
> -		if (flush_bypass) {
> -			// Bypass full or old, so flush it.
> -			(void)rcu_nocb_try_flush_bypass(rdp, j);
> -			bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
> -			lazy_ncbs = READ_ONCE(rdp->lazy_len);
> +		// Did we make any updates to main cblist? If not, no
> +		// non-deferred wake up to do for this rdp.
> +		if (!flushed && empty) {

Can you ever have (flushed && empty) ? If not you should be able to remove the
flushed parameter.

Thanks.

> +			rcu_nocb_unlock_irqrestore(rdp, flags);
> +			continue;
>  		}
>  
> -		if (bypass_ncbs) {
> -			trace_rcu_nocb_wake(rcu_state.name, rdp->cpu,
> -					    bypass_ncbs == lazy_ncbs ? TPS("Lazy") : TPS("Bypass"));
> -			if (bypass_ncbs == lazy_ncbs)
> -				lazy = true;
> -			else
> -				bypass = true;
> -		}
>  		rnp = rdp->mynode;
>  

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger
  2023-08-29 10:53   ` Frederic Weisbecker
@ 2023-08-30 21:13     ` Joel Fernandes
  0 siblings, 0 replies; 13+ messages in thread
From: Joel Fernandes @ 2023-08-30 21:13 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: linux-kernel, rcu, paulmck, Neeraj Upadhyay, Josh Triplett,
	Boqun Feng, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	Zqiang

On Tue, Aug 29, 2023 at 6:53 AM Frederic Weisbecker <frederic@kernel.org> wrote:
>
> On Sat, Jul 29, 2023 at 02:27:33PM +0000, Joel Fernandes (Google) wrote:
> > This is needed to make the next patch work correctly as we rely on the
> > strength of the wakeup when comparing deferred-wakeup types across
> > different CPUs.
> >
> > Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> > ---
> >  kernel/rcu/tree.h | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
> > index 192536916f9a..0f40a9c2b78d 100644
> > --- a/kernel/rcu/tree.h
> > +++ b/kernel/rcu/tree.h
> > @@ -288,8 +288,8 @@ struct rcu_data {
> >
> >  /* Values for nocb_defer_wakeup field in struct rcu_data. */
> >  #define RCU_NOCB_WAKE_NOT    0
> > -#define RCU_NOCB_WAKE_BYPASS 1
> > -#define RCU_NOCB_WAKE_LAZY   2
> > +#define RCU_NOCB_WAKE_LAZY   1
> > +#define RCU_NOCB_WAKE_BYPASS 2
> >  #define RCU_NOCB_WAKE                3
> >  #define RCU_NOCB_WAKE_FORCE  4
>
> Good change but make sure to audit all the occurences of
> RCU_NOCB_WAKE_LAZY and RCU_NOCB_WAKE_BYPASS. For example this breaks
> do_nocb_deferred_wakeup_timer() that will now ignore RCU_NOCB_WAKE_LAZY
> timers.
>

Ah I did do an audit, but missed this one. So then I think
do_nocb_deferred_wakeup_timer() should pass the weakest one
(RCU_NOCB_WAKE_LAZY) to do_nocb_deferred_wakeup_common().

Thanks a lot Frederic! I will take a deeper dive into this and author
users of RCU_NOCB_WAKE* and repost soon.

 - Joel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait()
  2023-08-29 14:45   ` Frederic Weisbecker
@ 2023-08-30 21:27     ` Joel Fernandes
  0 siblings, 0 replies; 13+ messages in thread
From: Joel Fernandes @ 2023-08-30 21:27 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: linux-kernel, rcu, paulmck, Neeraj Upadhyay, Josh Triplett,
	Boqun Feng, Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan,
	Zqiang

On Tue, Aug 29, 2023 at 10:45 AM Frederic Weisbecker
<frederic@kernel.org> wrote:
>
> On Sat, Jul 29, 2023 at 02:27:34PM +0000, Joel Fernandes (Google) wrote:
> >  /*
> >   * No-CBs GP kthreads come here to wait for additional callbacks to show up
> >   * or for grace periods to end.
> >   */
> >  static void nocb_gp_wait(struct rcu_data *my_rdp)
> >  {
> > -     bool bypass = false;
> >       int __maybe_unused cpu = my_rdp->cpu;
> >       unsigned long cur_gp_seq;
> >       unsigned long flags;
> >       bool gotcbs = false;
> > -     unsigned long j = jiffies;
> > -     bool lazy = false;
> >       bool needwait_gp = false; // This prevents actual uninitialized use.
> >       bool needwake;
> >       bool needwake_gp;
> > +     int defer_wake_type = RCU_NOCB_WAKE_NOT;
> >       struct rcu_data *rdp, *rdp_toggling = NULL;
> >       struct rcu_node *rnp;
> >       unsigned long wait_gp_seq = 0; // Suppress "use uninitialized" warning.
> > @@ -712,44 +758,24 @@ static void nocb_gp_wait(struct rcu_data *my_rdp)
> >        * won't be ignored for long.
> >        */
> >       list_for_each_entry(rdp, &my_rdp->nocb_head_rdp, nocb_entry_rdp) {
> > -             long bypass_ncbs;
> > -             bool flush_bypass = false;
> > -             long lazy_ncbs;
> > +             int defer_wake_type_one = RCU_NOCB_WAKE_NOT;
>
> No need to initialize it, nocb_gp_flush_wake() always returns a value, and
> it will avoid mistakes in the future if nocb_gp_flush_wake() is moved and
> accidentally not called.

Compiler does not like that if it is not initialized:
tree_nocb.h:821:51: error: ‘defer_wake_type’ is used uninitialized
[-Werror=uninitialized]

> > +             bool flushed;
> > +             bool empty;
> >
> > -             trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check"));
> >               rcu_nocb_lock_irqsave(rdp, flags);
> > -             lockdep_assert_held(&rdp->nocb_lock);
> > -             bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
> > -             lazy_ncbs = READ_ONCE(rdp->lazy_len);
> > +             defer_wake_type_one = nocb_gp_flush_wake(rdp, &empty, &flushed);
> >
> > -             if (bypass_ncbs && (lazy_ncbs == bypass_ncbs) &&
> > -                 (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + jiffies_till_flush) ||
> > -                  bypass_ncbs > 2 * qhimark)) {
> > -                     flush_bypass = true;
> > -             } else if (bypass_ncbs && (lazy_ncbs != bypass_ncbs) &&
> > -                 (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + 1) ||
> > -                  bypass_ncbs > 2 * qhimark)) {
> > -                     flush_bypass = true;
> > -             } else if (!bypass_ncbs && rcu_segcblist_empty(&rdp->cblist)) {
> > -                     rcu_nocb_unlock_irqrestore(rdp, flags);
> > -                     continue; /* No callbacks here, try next. */
> > -             }
> > +             // We may need to do a deferred wakeup later for bypass/lazy
> > +             // So note down what we learnt from the rdp.
> > +             defer_wake_type = max(defer_wake_type_one, defer_wake_type);
> >
> > -             if (flush_bypass) {
> > -                     // Bypass full or old, so flush it.
> > -                     (void)rcu_nocb_try_flush_bypass(rdp, j);
> > -                     bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass);
> > -                     lazy_ncbs = READ_ONCE(rdp->lazy_len);
> > +             // Did we make any updates to main cblist? If not, no
> > +             // non-deferred wake up to do for this rdp.
> > +             if (!flushed && empty) {
>
> Can you ever have (flushed && empty) ? If not you should be able to remove the
> flushed parameter.

We can return 3 different states from the new nocb_gp_flush_wake():
1. flushed = true and empty = false
2. flushed = false and empty = true
3. flushed = false and empty = false

I guess you mean, we don't care about case #1 and #3 ?

That's a good point. What I will do then is pass a single bool
"wakeup" and and set it for case #2 from within the
nocb_gp_flush_wake().

Thanks!

 - Joel

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2023-08-30 21:29 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-29 14:27 [PATCH v2 0/5] misc RCU fixes and cleanups Joel Fernandes (Google)
2023-07-29 14:27 ` [PATCH v2 1/5] rcutorture: Fix stuttering races and other issues Joel Fernandes (Google)
2023-07-29 14:27 ` [PATCH v2 2/5] srcu: Fix error handling in init_srcu_struct_fields() Joel Fernandes (Google)
2023-07-29 14:27 ` [PATCH v2 3/5] tree/nocb: Adjust RCU_NOCB_WAKE_* macros from weaker to stronger Joel Fernandes (Google)
2023-08-29 10:53   ` Frederic Weisbecker
2023-08-30 21:13     ` Joel Fernandes
2023-07-29 14:27 ` [PATCH v2 4/5] tree/nocb: Improve readability of nocb_gp_wait() Joel Fernandes (Google)
2023-08-29 14:45   ` Frederic Weisbecker
2023-08-30 21:27     ` Joel Fernandes
2023-07-29 14:27 ` [PATCH 5/5] Revert "checkpatch: Error out if deprecated RCU API used" Joel Fernandes (Google)
2023-07-29 14:29   ` Joel Fernandes
2023-07-29 14:27 ` [PATCH v2 5/5] rcu/tree: Remove superfluous return from void call_rcu* functions Joel Fernandes (Google)
2023-07-29 22:19   ` Paul E. McKenney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox