From: Frederic Weisbecker <fweisbec@gmail.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
Chris Metcalf <cmetcalf@tilera.com>,
Christoph Lameter <cl@linux.com>,
Geoff Levand <geoff@infradead.org>,
Gilad Ben Yossef <gilad@benyossef.com>,
Hakan Akkan <hakanakkan@gmail.com>,
Ingo Molnar <mingo@kernel.org>, Kevin Hilman <khilman@linaro.org>,
Li Zhong <zhong@linux.vnet.ibm.com>,
Namhyung Kim <namhyung.kim@lge.com>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Peter Zijlstra <peterz@infradead.org>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: [PATCH 1/4] nohz: Force boot CPU outside full dynticks range
Date: Wed, 27 Mar 2013 16:32:36 +0100 [thread overview]
Message-ID: <1364398359-21990-2-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1364398359-21990-1-git-send-email-fweisbec@gmail.com>
The timekeeping job must be able to run early on boot
because there may be some pre-SMP (and thus pre-initcalls )
components that rely on it. The IO-APIC is one such users
as it tests the timer health by watching jiffies progression.
Given that it happens before we know the initial online
set, we can't rely on it to select a timekeeper. We need
one before SMP time otherwise we simply crash on boot.
To fix this and keep things simple for now, force the boot CPU
outside of the full dynticks range in any case and do this early
on kernel parameter parsing time.
We might want a trickier solution later, expecially for aSMP
architectures that need to assign housekeeping tasks to arbitrary
low power CPUs.
But it's still first pass KISS time for now.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Geoff Levand <geoff@infradead.org>
Cc: Gilad Ben Yossef <gilad@benyossef.com>
Cc: Hakan Akkan <hakanakkan@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Kevin Hilman <khilman@linaro.org>
Cc: Li Zhong <zhong@linux.vnet.ibm.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
---
Documentation/kernel-parameters.txt | 4 +-
kernel/time/tick-sched.c | 52 ++++++++++-------------------------
2 files changed, 17 insertions(+), 39 deletions(-)
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 231698f..28e039c 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1916,8 +1916,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
nohz_extended= [KNL,BOOT]
In kernels built with CONFIG_NO_HZ_EXTENDED=y, set
the specified list of CPUs whose tick will be stopped
- whenever possible. You need to keep at least one online
- CPU outside the range to maintain the timekeeping.
+ whenever possible. The boot CPU will be forced outside
+ the range to maintain the timekeeping.
noiotrap [SH] Disables trapped I/O port accesses.
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 57bb3fe..74bc7f1 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -158,11 +158,21 @@ int tick_nohz_extended_cpu(int cpu)
/* Parse the boot-time nohz CPU list from the kernel parameters. */
static int __init tick_nohz_extended_setup(char *str)
{
+ int cpu;
+
alloc_bootmem_cpumask_var(&nohz_extended_mask);
- if (cpulist_parse(str, nohz_extended_mask) < 0)
+ if (cpulist_parse(str, nohz_extended_mask) < 0) {
pr_warning("NOHZ: Incorrect nohz_extended cpumask\n");
- else
- have_nohz_extended_mask = true;
+ return 1;
+ }
+
+ cpu = smp_processor_id();
+ if (cpumask_test_cpu(cpu, nohz_extended_mask)) {
+ pr_warning("NO_HZ: Clearing %d from nohz_extended range for timekeeping\n", cpu);
+ cpumask_clear_cpu(cpu, nohz_extended_mask);
+ }
+ have_nohz_extended_mask = true;
+
return 1;
}
__setup("nohz_extended=", tick_nohz_extended_setup);
@@ -188,42 +198,10 @@ static int __cpuinit tick_nohz_cpu_down_callback(struct notifier_block *nfb,
static int __init init_tick_nohz_extended(void)
{
- cpumask_var_t online_nohz;
int cpu;
- if (!have_nohz_extended_mask)
- return 0;
-
- cpu_notifier(tick_nohz_cpu_down_callback, 0);
-
- if (!zalloc_cpumask_var(&online_nohz, GFP_KERNEL)) {
- pr_warning("NO_HZ: Not enough memory to check extended nohz mask\n");
- return -ENOMEM;
- }
-
- /*
- * CPUs can probably not be concurrently offlined on initcall time.
- * But we are paranoid, aren't we?
- */
- get_online_cpus();
-
- /* Ensure we keep a CPU outside the dynticks range for timekeeping */
- cpumask_and(online_nohz, cpu_online_mask, nohz_extended_mask);
- if (cpumask_equal(online_nohz, cpu_online_mask)) {
- pr_warning("NO_HZ: Must keep at least one online CPU "
- "out of nohz_extended range\n");
- /*
- * We know the current CPU doesn't have its tick stopped.
- * Let's use it for the timekeeping duty.
- */
- preempt_disable();
- cpu = smp_processor_id();
- pr_warning("NO_HZ: Clearing %d from nohz_extended range\n", cpu);
- cpumask_clear_cpu(cpu, nohz_extended_mask);
- preempt_enable();
- }
- put_online_cpus();
- free_cpumask_var(online_nohz);
+ if (have_nohz_extended_mask)
+ cpu_notifier(tick_nohz_cpu_down_callback, 0);
return 0;
}
--
1.7.5.4
next prev parent reply other threads:[~2013-03-27 15:32 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-27 15:32 [PATCH 0/4] nohz: Full dynticks fixes/improvements Frederic Weisbecker
2013-03-27 15:32 ` Frederic Weisbecker [this message]
2013-03-28 7:38 ` [PATCH 1/4] nohz: Force boot CPU outside full dynticks range Ingo Molnar
2013-03-28 13:08 ` Frederic Weisbecker
2013-03-27 15:32 ` [PATCH 2/4] nohz: Print final full dynticks CPUs range on boot Frederic Weisbecker
2013-03-28 7:40 ` Ingo Molnar
2013-03-28 13:12 ` Frederic Weisbecker
2013-03-29 0:25 ` Paul Gortmaker
2013-03-29 0:39 ` Frederic Weisbecker
2013-03-29 2:00 ` Paul E. McKenney
2013-03-29 2:08 ` Paul Gortmaker
2013-03-29 3:51 ` Paul E. McKenney
2013-03-29 2:02 ` Paul Gortmaker
2013-03-27 15:32 ` [PATCH 3/4] nohz: Ensure full dynticks CPUs are RCU nocbs Frederic Weisbecker
2013-03-27 15:32 ` [PATCH 4/4] nohz: New option to force all CPUs in full dynticks range Frederic Weisbecker
2013-03-28 7:45 ` Ingo Molnar
2013-03-28 13:43 ` Frederic Weisbecker
2013-03-30 9:10 ` Ingo Molnar
2013-04-02 13:09 ` Frederic Weisbecker
2013-04-08 14:57 ` Christoph Lameter
2013-04-09 13:22 ` Paul Gortmaker
2013-04-09 14:35 ` Christoph Lameter
2013-04-11 15:19 ` Frederic Weisbecker
2013-04-11 15:37 ` Paul E. McKenney
2013-04-11 15:53 ` Frederic Weisbecker
2013-04-11 16:10 ` Paul E. McKenney
2013-04-11 16:41 ` Christoph Lameter
2013-04-11 17:04 ` Frederic Weisbecker
2013-04-11 17:11 ` Paul E. McKenney
2013-04-11 17:28 ` Frederic Weisbecker
2013-04-11 19:17 ` Paul E. McKenney
2013-04-12 15:59 ` Christoph Lameter
2013-04-15 10:27 ` Ingo Molnar
2013-04-15 16:11 ` Christoph Lameter
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=1364398359-21990-2-git-send-email-fweisbec@gmail.com \
--to=fweisbec@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=cmetcalf@tilera.com \
--cc=geoff@infradead.org \
--cc=gilad@benyossef.com \
--cc=hakanakkan@gmail.com \
--cc=khilman@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung.kim@lge.com \
--cc=paul.gortmaker@windriver.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=zhong@linux.vnet.ibm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.