From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@elte.hu, laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca,
josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de,
peterz@infradead.org, rostedt@goodmis.org,
Valdis.Kletnieks@vt.edu, dhowells@redhat.com,
eric.dumazet@gmail.com, darren@dvhart.com, patches@linaro.org,
"Paul E. McKenney" <paul.mckenney@linaro.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH RFC tip/core/rcu 06/13] rcu: Go dyntick-idle more quickly if CPU has serviced current grace period
Date: Mon, 28 Nov 2011 15:32:58 -0800 [thread overview]
Message-ID: <1322523185-456-6-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <20111128233212.GA32279@linux.vnet.ibm.com>
From: Paul E. McKenney <paul.mckenney@linaro.org>
The earlier version would attempt to push callbacks through five times
before going into dyntick-idle mode if callbacks remained, but the CPU
had done all that it needed to do for the current RCU grace periods.
This is wasteful: In most cases, once the CPU has done all that it
needs to for the current RCU grace periods, it will make no further
progress on the callbacks no matter how many times it loops through
the RCU core processing and the idle-entry code.
This commit therefore goes to dyntick-idle mode whenever the current
CPU has done all it can for the current grace period.
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
kernel/rcutree_plugin.h | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
index 6467f56..45790bf 100644
--- a/kernel/rcutree_plugin.h
+++ b/kernel/rcutree_plugin.h
@@ -2028,12 +2028,29 @@ static void rcu_prepare_for_idle(int cpu)
{
int c = 0;
- /* If no callbacks or in the holdoff period, enter dyntick-idle. */
+ /*
+ * If there are no callbacks on this CPU or if RCU has no further
+ * need for this CPU at the moment, enter dyntick-idle mode.
+ * Also reset state so as to not prejudice later attempts.
+ */
if (!rcu_cpu_has_callbacks(cpu)) {
per_cpu(rcu_dyntick_holdoff, cpu) = jiffies - 1;
+ per_cpu(rcu_dyntick_drain, cpu) = 0;
trace_rcu_prep_idle("No callbacks");
return;
}
+ if (!rcu_pending(cpu)) {
+ trace_rcu_prep_idle("Dyntick with callbacks");
+ per_cpu(rcu_dyntick_holdoff, cpu) = jiffies - 1;
+ per_cpu(rcu_dyntick_drain, cpu) = 0;
+ per_cpu(rcu_awake_at_gp_end, cpu) = 1;
+ return; /* Nothing to do immediately. */
+ }
+
+ /*
+ * If in holdoff mode, just return. We will presumably have
+ * refrained from disabling the scheduling-clock tick.
+ */
if (per_cpu(rcu_dyntick_holdoff, cpu) == jiffies) {
trace_rcu_prep_idle("In holdoff");
return;
@@ -2046,11 +2063,6 @@ static void rcu_prepare_for_idle(int cpu)
} else if (--per_cpu(rcu_dyntick_drain, cpu) <= 0) {
/* We have hit the limit, so time to give up. */
per_cpu(rcu_dyntick_holdoff, cpu) = jiffies;
- if (!rcu_pending(cpu)) {
- trace_rcu_prep_idle("Dyntick with callbacks");
- per_cpu(rcu_awake_at_gp_end, cpu) = 1;
- return; /* Nothing to do immediately. */
- }
trace_rcu_prep_idle("Begin holdoff");
invoke_rcu_core(); /* Force the CPU out of dyntick-idle. */
return;
--
1.7.3.2
next prev parent reply other threads:[~2011-11-28 23:34 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-28 23:32 [PATCH tip/core/rcu 0/13] Preview of yet more RCU changes for 3.3 Paul E. McKenney
2011-11-28 23:32 ` [PATCH RFC tip/core/rcu 01/13] rcu: Add rcutorture CPU-hotplug capability Paul E. McKenney
2011-11-28 23:32 ` [PATCH RFC tip/core/rcu 02/13] nohz: Remove tick_nohz_idle_enter_norcu() / tick_nohz_idle_exit_norcu() Paul E. McKenney
2011-11-28 23:32 ` [PATCH RFC tip/core/rcu 04/13] rcu: Update trace_rcu_dyntick() header comment Paul E. McKenney
2011-11-28 23:32 ` [PATCH RFC tip/core/rcu 05/13] rcu: Add tracing for RCU_FAST_NO_HZ Paul E. McKenney
2011-11-28 23:32 ` Paul E. McKenney [this message]
2011-11-28 23:32 ` [PATCH RFC tip/core/rcu 07/13] rcu: Avoid needlessly IPIing CPUs at GP end Paul E. McKenney
2011-11-28 23:33 ` [PATCH RFC tip/core/rcu 08/13] rcu: Eliminate RCU_FAST_NO_HZ grace-period hang Paul E. McKenney
2011-11-28 23:33 ` [PATCH RFC tip/core/rcu 09/13] rcu: Reduce latency of rcu_prepare_for_idle() Paul E. McKenney
2011-11-28 23:33 ` [PATCH RFC tip/core/rcu 10/13] rcu: Remove dynticks false positives and RCU failures Paul E. McKenney
2011-11-28 23:33 ` [PATCH RFC tip/core/rcu 11/13] rcu: Identify dyntick-idle CPUs on first force_quiescent_state() pass Paul E. McKenney
2011-11-28 23:33 ` [PATCH RFC tip/core/rcu 12/13] rcu: Document same-context read-side constraints Paul E. McKenney
2011-11-28 23:33 ` [PATCH RFC tip/core/rcu 13/13] rcu: Permit dyntick-idle with callbacks pending 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=1322523185-456-6-git-send-email-paulmck@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=Valdis.Kletnieks@vt.edu \
--cc=akpm@linux-foundation.org \
--cc=darren@dvhart.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=eric.dumazet@gmail.com \
--cc=josh@joshtriplett.org \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=niv@us.ibm.com \
--cc=patches@linaro.org \
--cc=paul.mckenney@linaro.org \
--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
all inboxes | Powered by JetHome®