Linux RCU subsystem development
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.ibm.com>
To: rcu@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, 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, joel@joelfernandes.org,
	"Paul E. McKenney" <paulmck@linux.ibm.com>
Subject: [PATCH tip/core/rcu 10/21] rcutorture: Give the scheduler a chance on PREEMPT && NO_HZ_FULL kernels
Date: Thu, 30 May 2019 08:17:01 -0700	[thread overview]
Message-ID: <20190530151712.1612-10-paulmck@linux.ibm.com> (raw)
In-Reply-To: <20190530151650.GA422@linux.ibm.com>

In !PREEMPT kernels, cond_resched() is a no-op.  In NO_HZ_FULL kernels,
in-kernel execution (such as that of rcutorture's kthreads) might extend
indefinitely without the scheduler gaining the aid of a scheduling-clock
interrupt.  This combination can make the interaction of an rcutorture
forward-progress test and a CPU-hotplug stop_machine operation make less
forward progress than one might like.  Additionally, Sebastian Siewior
notes that NO_HZ_FULL kernels have a scheduler check upon return to
userspace execution, which suggests that in-kernel emulation of tight
userspace loops containing system calls doing call_rcu() might also need
explicit checks in the PREEMPT && NO_HZ_FULL case.

This commit therefore introduces a rcu_torture_fwd_prog_cond_resched()
function that explicitly invokes schedule() in such kernels whenever
need_resched() returns true, while retaining use of cond_resched()
for kernels that are either !PREEMPT or !NO_HZ_FULL.

Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
---
 kernel/rcu/rcutorture.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 6a4558532eac..ef6f6dedf4c4 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1667,6 +1667,17 @@ static void rcu_torture_fwd_cb_cr(struct rcu_head *rhp)
 	spin_unlock_irqrestore(&rcu_fwd_lock, flags);
 }
 
+// Give the scheduler a chance, even on nohz_full CPUs.
+static void rcu_torture_fwd_prog_cond_resched(void)
+{
+	if (IS_ENABLED(CONFIG_PREEMPT) && IS_ENABLED(CONFIG_NO_HZ_FULL)) {
+		if (need_resched())
+			schedule();
+	} else {
+		cond_resched();
+	}
+}
+
 /*
  * Free all callbacks on the rcu_fwd_cb_head list, either because the
  * test is over or because we hit an OOM event.
@@ -1690,7 +1701,7 @@ static unsigned long rcu_torture_fwd_prog_cbfree(void)
 		spin_unlock_irqrestore(&rcu_fwd_lock, flags);
 		kfree(rfcp);
 		freed++;
-		cond_resched();
+		rcu_torture_fwd_prog_cond_resched();
 	}
 	return freed;
 }
@@ -1734,7 +1745,7 @@ static void rcu_torture_fwd_prog_nr(int *tested, int *tested_tries)
 		udelay(10);
 		cur_ops->readunlock(idx);
 		if (!fwd_progress_need_resched || need_resched())
-			cond_resched();
+			rcu_torture_fwd_prog_cond_resched();
 	}
 	(*tested_tries)++;
 	if (!time_before(jiffies, stopat) &&
@@ -1817,7 +1828,7 @@ static void rcu_torture_fwd_prog_cr(void)
 			rfcp->rfc_gps = 0;
 		}
 		cur_ops->call(&rfcp->rh, rcu_torture_fwd_cb_cr);
-		cond_resched();
+		rcu_torture_fwd_prog_cond_resched();
 	}
 	stoppedat = jiffies;
 	n_launders_cb_snap = READ_ONCE(n_launders_cb);
-- 
2.17.1


  parent reply	other threads:[~2019-05-30 15:18 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-30 15:16 [PATCH tip/core/rcu 0/21] Torture-test updates for v5.3 Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 01/21] rcutorture: Select from only online CPUs Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 02/21] rcutorture: Add cpu0 to the set of CPUs to add jitter Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 03/21] rcutorture: Add cond_resched() to forward-progress free-up loop Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 04/21] rcutorture: Fix stutter_wait() return value and freelist checks Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 05/21] torture: Allow inter-stutter interval to be specified Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 06/21] torture: Make kvm-find-errors.sh and kvm-recheck.sh provide exit status Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 07/21] rcutorture: Provide rudimentary Makefile Paul E. McKenney
2019-05-30 15:16 ` [PATCH tip/core/rcu 08/21] rcutorture: Exempt tasks RCU from timely draining of grace periods Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 09/21] rcutorture: Exempt TREE01 from forward-progress testing Paul E. McKenney
2019-05-30 15:17 ` Paul E. McKenney [this message]
2019-05-30 15:17 ` [PATCH tip/core/rcu 11/21] rcutorture: Halt forward-progress checks at end of run Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 12/21] rcutorture: Add trivial RCU implementation Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 13/21] rcutorture: Tweak kvm options Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 14/21] torture: Capture qemu output Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 15/21] torture: Add function graph-tracing cheat sheet Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 16/21] torture: Run kernel build in source directory Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 17/21] torture: Make --cpus override idleness calculations Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 18/21] torture: Add --trust-make to suppress "make clean" Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 19/21] rcutorture: Dump trace buffer for callback pipe drain failures Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 20/21] torture: Suppress propagating trace_printk() warning Paul E. McKenney
2019-05-30 15:17 ` [PATCH tip/core/rcu 21/21] rcutorture: Upper case solves the case of the vanishing NULL pointer Paul E. McKenney

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=20190530151712.1612-10-paulmck@linux.ibm.com \
    --to=paulmck@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=dipankar@in.ibm.com \
    --cc=edumazet@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jiangshanlai@gmail.com \
    --cc=joel@joelfernandes.org \
    --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=rcu@vger.kernel.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