From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org, stable@kernel.org, jejb@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Ingo Molnar <mingo@elte.hu>
Subject: NOHZ: reevaluate idle sleep length after add_timer_on()
Date: Wed, 16 Apr 2008 18:01:33 -0700 [thread overview]
Message-ID: <20080417010322.059941982@sous-sol.org> (raw)
In-Reply-To: 20080417010122.148289106@sous-sol.org
[-- Attachment #1: nohz-reevaluate-idle-sleep-length-after-add_timer_on.patch --]
[-- Type: text/plain, Size: 3989 bytes --]
-stable review patch. If anyone has any objections, please let us know.
---------------------
From: Thomas Gleixner <tglx@linutronix.de>
upstream commit: 06d8308c61e54346585b2691c13ee3f90cb6fb2f
add_timer_on() can add a timer on a CPU which is currently in a long
idle sleep, but the timer wheel is not reevaluated by the nohz code on
that CPU. So a timer can be delayed for quite a long time. This
triggered a false positive in the clocksource watchdog code.
To avoid this we need to wake up the idle CPU and enforce the
reevaluation of the timer wheel for the next timer event.
Add a function, which checks a given CPU for idle state, marks the
idle task with NEED_RESCHED and sends a reschedule IPI to notify the
other CPU of the change in the timer wheel.
Call this function from add_timer_on().
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
--
include/linux/sched.h | 6 ++++++
kernel/sched.c | 43 +++++++++++++++++++++++++++++++++++++++++++
kernel/timer.c | 10 +++++++++-
3 files changed, 58 insertions(+), 1 deletion(-)
---
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1449,6 +1449,12 @@ static inline void idle_task_exit(void)
extern void sched_idle_next(void);
+#if defined(CONFIG_NO_HZ) && defined(CONFIG_SMP)
+extern void wake_up_idle_cpu(int cpu);
+#else
+static inline void wake_up_idle_cpu(int cpu) { }
+#endif
+
#ifdef CONFIG_SCHED_DEBUG
extern unsigned int sysctl_sched_latency;
extern unsigned int sysctl_sched_min_granularity;
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -727,6 +727,49 @@ static void resched_cpu(int cpu)
resched_task(cpu_curr(cpu));
spin_unlock_irqrestore(&rq->lock, flags);
}
+
+#ifdef CONFIG_NO_HZ
+/*
+ * When add_timer_on() enqueues a timer into the timer wheel of an
+ * idle CPU then this timer might expire before the next timer event
+ * which is scheduled to wake up that CPU. In case of a completely
+ * idle system the next event might even be infinite time into the
+ * future. wake_up_idle_cpu() ensures that the CPU is woken up and
+ * leaves the inner idle loop so the newly added timer is taken into
+ * account when the CPU goes back to idle and evaluates the timer
+ * wheel for the next timer event.
+ */
+void wake_up_idle_cpu(int cpu)
+{
+ struct rq *rq = cpu_rq(cpu);
+
+ if (cpu == smp_processor_id())
+ return;
+
+ /*
+ * This is safe, as this function is called with the timer
+ * wheel base lock of (cpu) held. When the CPU is on the way
+ * to idle and has not yet set rq->curr to idle then it will
+ * be serialized on the timer wheel base lock and take the new
+ * timer into account automatically.
+ */
+ if (rq->curr != rq->idle)
+ return;
+
+ /*
+ * We can set TIF_RESCHED on the idle task of the other CPU
+ * lockless. The worst case is that the other CPU runs the
+ * idle task through an additional NOOP schedule()
+ */
+ set_tsk_thread_flag(rq->idle, TIF_NEED_RESCHED);
+
+ /* NEED_RESCHED must be visible before we test polling */
+ smp_mb();
+ if (!tsk_is_polling(rq->idle))
+ smp_send_reschedule(cpu);
+}
+#endif
+
#else
static inline void resched_task(struct task_struct *p)
{
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -453,10 +453,18 @@ void add_timer_on(struct timer_list *tim
spin_lock_irqsave(&base->lock, flags);
timer_set_base(timer, base);
internal_add_timer(base, timer);
+ /*
+ * Check whether the other CPU is idle and needs to be
+ * triggered to reevaluate the timer wheel when nohz is
+ * active. We are protected against the other CPU fiddling
+ * with the timer by holding the timer base lock. This also
+ * makes sure that a CPU on the way to idle can not evaluate
+ * the timer wheel.
+ */
+ wake_up_idle_cpu(cpu);
spin_unlock_irqrestore(&base->lock, flags);
}
-
/**
* mod_timer - modify a timer's timeout
* @timer: the timer to be modified
--
next prev parent reply other threads:[~2008-04-17 1:14 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-17 1:01 [patch 00/66] 2.6.24-stable review Chris Wright
2008-04-17 1:01 ` time: prevent the loop in timespec_add_ns() from being optimised away Chris Wright
2008-04-17 1:01 ` kbuild: soften modpost checks when doing cross builds Chris Wright
2008-04-17 1:01 ` mtd: memory corruption in block2mtd.c Chris Wright
2008-04-17 1:01 ` md: remove the super sysfs attribute from devices in an md array Chris Wright
2008-04-17 1:01 ` V4L: ivtv: Add missing sg_init_table() Chris Wright
2008-04-17 1:01 ` UIO: add pgprot_noncached() to UIO mmap code Chris Wright
2008-04-17 1:01 ` USB: add support for Motorola ROKR Z6 cellphone in mass storage mode Chris Wright
2008-04-17 1:01 ` USB: new quirk flag to avoid Set-Interface Chris Wright
2008-04-17 1:01 ` inotify: fix race Chris Wright
2008-04-17 1:01 ` inotify: remove debug code Chris Wright
2008-04-17 1:01 ` Chris Wright [this message]
2008-04-17 1:01 ` slab: fix cache_cache bootstrap in kmem_cache_init() Chris Wright
2008-04-17 1:01 ` xen: fix RMW when unmasking events Chris Wright
2008-04-17 1:01 ` xen: mask out SEP from CPUID Chris Wright
2008-04-17 1:01 ` xen: fix UP setup of shared_info Chris Wright
2008-04-17 1:01 ` PERCPU : __percpu_alloc_mask() can dynamically size percpu_data storage Chris Wright
2008-04-17 1:01 ` alloc_percpu() fails to allocate percpu data Chris Wright
2008-04-17 1:01 ` vfs: fix data leak in nobh_write_end() Chris Wright
2008-04-17 1:01 ` pci: revert SMBus unhide on HP Compaq nx6110 Chris Wright
2008-04-17 1:01 ` hwmon: (w83781d) Fix I/O resource conflict with PNP Chris Wright
2008-04-17 1:01 ` vmcoreinfo: add the symbol "phys_base" Chris Wright
2008-04-17 9:24 ` Eric W. Biederman
2008-04-17 17:16 ` Chris Wright
2008-04-17 17:29 ` Vivek Goyal
2008-04-18 10:17 ` Ken'ichi Ohmichi
2008-04-17 23:31 ` Eric W. Biederman
2008-04-17 1:01 ` USB: Allow initialization of broken keyspan serial adapters Chris Wright
2008-04-17 1:01 ` USB: serial: fix regression in Visor/Palm OS module for kernels >= 2.6.24 Chris Wright
2008-04-17 1:01 ` USB: serial: ti_usb_3410_5052: Correct TUSB3410 endpoint requirements Chris Wright
2008-04-17 8:01 ` Oliver Neukum
2008-04-17 17:02 ` Greg KH
2008-04-17 1:01 ` CRYPTO xcbc: Fix crash when ipsec uses xcbc-mac with big data chunk Chris Wright
2008-04-17 11:26 ` S.Çağlar Onur
2008-04-17 14:22 ` Herbert Xu
2008-04-17 23:33 ` Chris Wright
2008-04-17 1:01 ` mtd: fix broken state in CFI driver caused by FL_SHUTDOWN Chris Wright
2008-04-17 1:01 ` ipmi: change device node ordering to reflect probe order Chris Wright
2008-04-17 1:01 ` AX25 ax25_out: check skb for NULL in ax25_kick() Chris Wright
2008-04-17 1:01 ` NET: include <linux/types.h> into linux/ethtool.h for __u* typedef Chris Wright
2008-04-17 1:01 ` SUNGEM: Fix NAPI assertion failure Chris Wright
2008-04-17 1:01 ` INET: inet_frag_evictor() must run with BH disabled Chris Wright
2008-04-17 1:01 ` LLC: Restrict LLC sockets to root Chris Wright
2008-04-17 1:01 ` netpoll: zap_completion_queue: adjust skb->users counter Chris Wright
2008-04-17 1:01 ` PPPOL2TP: Make locking calls softirq-safe Chris Wright
2008-04-17 1:01 ` PPPOL2TP: Fix SMP issues in skb reorder queue handling Chris Wright
2008-04-17 1:01 ` NET: Add preemption point in qdisc_run Chris Wright
2008-04-17 1:01 ` sch_htb: fix "too many events" situation Chris Wright
2008-04-17 1:02 ` SCTP: Fix local_addr deletions during list traversals Chris Wright
2008-04-17 1:02 ` NET: Fix multicast device ioctl checks Chris Wright
2008-04-17 1:02 ` TCP: Fix shrinking windows with window scaling Chris Wright
2008-04-17 1:02 ` TCP: Let skbs grow over a page on fast peers Chris Wright
2008-04-17 1:02 ` VLAN: Dont copy ALLMULTI/PROMISC flags from underlying device Chris Wright
2008-04-17 1:02 ` SPARC64: Fix atomic backoff limit Chris Wright
2008-04-17 1:02 ` SPARC64: Fix __get_cpu_var in preemption-enabled area Chris Wright
2008-04-17 1:02 ` SPARC64: flush_ptrace_access() needs preemption disable Chris Wright
2008-04-17 1:02 ` libata: assume no device is attached if both IDENTIFYs are aborted Chris Wright
2008-04-17 1:02 ` sis190: read the mac address from the eeprom first Chris Wright
2008-04-17 1:02 ` bluetooth: hci_core: defer hci_unregister_sysfs() Chris Wright
2008-04-17 1:02 ` SPARC64: Fix FPU saving in 64-bit signal handling Chris Wright
2008-04-17 1:02 ` DVB: tda10086: make the 22kHz tone for DISEQC a config option Chris Wright
2008-04-17 1:02 ` SUNRPC: Fix a memory leak in rpc_create() Chris Wright
2008-04-17 21:25 ` Stefan Lippers-Hollmann
2008-04-17 22:06 ` Trond Myklebust
2008-04-17 22:09 ` Chris Wright
2008-04-18 14:42 ` Chuck Lever
2008-04-17 1:02 ` HFS+: fix unlink of links Chris Wright
2008-04-17 1:02 ` acpi: fix "buggy BIOS check" when CPUs are hot removed Chris Wright
2008-04-17 1:02 ` plip: replace spin_lock_irq with spin_lock_irqsave in irq context Chris Wright
2008-04-17 1:02 ` signalfd: fix for incorrect SI_QUEUE user data reporting Chris Wright
2008-04-17 1:02 ` md: close a livelock window in handle_parity_checks5 Chris Wright
2008-04-17 1:02 ` POWERPC: Fix build of modular drivers/macintosh/apm_emu.c Chris Wright
2008-04-17 1:02 ` pnpacpi: reduce printk severity for "pnpacpi: exceeded the max number of ..." Chris Wright
2008-04-17 15:24 ` Nick Andrew
2008-04-17 17:09 ` Chris Wright
2008-04-18 21:48 ` Bjorn Helgaas
2008-04-23 4:09 ` [stable PATCH for 2.6.24.5 and 2.6.25] pnpacpi: fix potential corruption on "pnpacpi: exceeded the max number of IRQ resources 2" Len Brown
2008-04-17 1:02 ` PARISC futex: special case cmpxchg NULL in kernel space Chris Wright
2008-04-17 1:02 ` PARISC pdc_console: fix bizarre panic on boot Chris Wright
2008-04-17 1:02 ` PARISC fix signal trampoline cache flushing Chris Wright
2008-04-17 1:02 ` acpi: bus: check once more for an empty list after locking it Chris Wright
2008-04-17 1:02 ` fbdev: fix /proc/fb oops after module removal Chris Wright
2008-04-17 1:02 ` macb: Call phy_disconnect on removing Chris Wright
2008-04-17 1:02 ` file capabilities: remove cap_task_kill() Chris Wright
2008-04-17 1:02 ` locks: fix possible infinite loop in fcntl(F_SETLKW) over nfs Chris Wright
2008-04-18 7:50 ` [stable] [patch 00/66] 2.6.24-stable review Chris Wright
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=20080417010322.059941982@sous-sol.org \
--to=chrisw@sous-sol.org \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=jejb@kernel.org \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mkrufky@linuxtv.org \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=zwane@arm.linux.org.uk \
/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