From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@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>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@elte.hu>
Subject: [patch 15/28] clockevents: prevent endless loop lockup
Date: Mon, 6 Oct 2008 16:17:31 -0700 [thread overview]
Message-ID: <20081006231731.GP20567@suse.de> (raw)
In-Reply-To: <20081006231639.GA20567@suse.de>
[-- Attachment #1: timer-fix-05.patch --]
[-- Type: text/plain, Size: 4249 bytes --]
2.6.25-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Thomas Gleixner <tglx@linutronix.de>
commit 1fb9b7d29d8e85ba3196eaa7ab871bf76fc98d36 upstream
The C1E/HPET bug reports on AMDX2/RS690 systems where tracked down to a
too small value of the HPET minumum delta for programming an event.
The clockevents code needs to enforce an interrupt event on the clock event
device in some cases. The enforcement code was stupid and naive, as it just
added the minimum delta to the current time and tried to reprogram the device.
When the minimum delta is too small, then this loops forever.
Add a sanity check. Allow reprogramming to fail 3 times, then print a warning
and double the minimum delta value to make sure, that this does not happen again.
Use the same function for both tick-oneshot and tick-broadcast code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/time/tick-broadcast.c | 10 +---------
kernel/time/tick-internal.h | 2 ++
kernel/time/tick-oneshot.c | 36 ++++++++++++++++++++++++++++++------
3 files changed, 33 insertions(+), 15 deletions(-)
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -370,16 +370,8 @@ cpumask_t *tick_get_broadcast_oneshot_ma
static int tick_broadcast_set_event(ktime_t expires, int force)
{
struct clock_event_device *bc = tick_broadcast_device.evtdev;
- ktime_t now = ktime_get();
- int res;
- for(;;) {
- res = clockevents_program_event(bc, expires, now);
- if (!res || !force)
- return res;
- now = ktime_get();
- expires = ktime_add(now, ktime_set(0, bc->min_delta_ns));
- }
+ return tick_dev_program_event(bc, expires, force);
}
int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
--- a/kernel/time/tick-internal.h
+++ b/kernel/time/tick-internal.h
@@ -17,6 +17,8 @@ extern void tick_handle_periodic(struct
extern void tick_setup_oneshot(struct clock_event_device *newdev,
void (*handler)(struct clock_event_device *),
ktime_t nextevt);
+extern int tick_dev_program_event(struct clock_event_device *dev,
+ ktime_t expires, int force);
extern int tick_program_event(ktime_t expires, int force);
extern void tick_oneshot_notify(void);
extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *));
--- a/kernel/time/tick-oneshot.c
+++ b/kernel/time/tick-oneshot.c
@@ -25,18 +25,42 @@
/**
* tick_program_event internal worker function
*/
-static int __tick_program_event(struct clock_event_device *dev,
- ktime_t expires, int force)
+int tick_dev_program_event(struct clock_event_device *dev, ktime_t expires,
+ int force)
{
ktime_t now = ktime_get();
+ int i;
- while (1) {
+ for (i = 0;;) {
int ret = clockevents_program_event(dev, expires, now);
if (!ret || !force)
return ret;
+
+ /*
+ * We tried 2 times to program the device with the given
+ * min_delta_ns. If that's not working then we double it
+ * and emit a warning.
+ */
+ if (++i > 2) {
+ printk(KERN_WARNING "CE: __tick_program_event of %s is "
+ "stuck %llx %llx\n", dev->name ? dev->name : "?",
+ now.tv64, expires.tv64);
+ printk(KERN_WARNING
+ "CE: increasing min_delta_ns %ld to %ld nsec\n",
+ dev->min_delta_ns, dev->min_delta_ns << 1);
+ WARN_ON(1);
+
+ /* Double the min. delta and try again */
+ if (!dev->min_delta_ns)
+ dev->min_delta_ns = 5000;
+ else
+ dev->min_delta_ns <<= 1;
+ i = 0;
+ }
+
now = ktime_get();
- expires = ktime_add(now, ktime_set(0, dev->min_delta_ns));
+ expires = ktime_add_ns(now, dev->min_delta_ns);
}
}
@@ -47,7 +71,7 @@ int tick_program_event(ktime_t expires,
{
struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
- return __tick_program_event(dev, expires, force);
+ return tick_dev_program_event(dev, expires, force);
}
/**
@@ -71,7 +95,7 @@ void tick_setup_oneshot(struct clock_eve
{
newdev->event_handler = handler;
clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT);
- __tick_program_event(newdev, next_event, 1);
+ tick_dev_program_event(newdev, next_event, 1);
}
/**
--
next prev parent reply other threads:[~2008-10-06 23:27 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081006225949.357365087@mini.kroah.org>
2008-10-06 23:16 ` [patch 00/28] 2.6.25-stable review Greg KH
2008-10-06 23:16 ` [patch 01/28] USB: fix hcd interrupt disabling Greg KH
2008-10-06 23:17 ` [patch 02/28] pxa2xx_spi: dma bugfixes Greg KH
2008-10-07 0:15 ` Ned Forrester
2008-10-06 23:17 ` [patch 03/28] pxa2xx_spi: chipselect bugfixes Greg KH
2008-10-06 23:17 ` [patch 04/28] drivers/mmc/card/block.c: fix refcount leak in mmc_block_open() Greg KH
2008-10-06 23:17 ` [patch 05/28] ALSA: hda - Fix model for Dell Inspiron 1525 Greg KH
2008-10-07 5:55 ` Takashi Iwai
2008-10-09 2:38 ` Greg KH
2008-10-06 23:17 ` [patch 06/28] i2c-dev: Return correct error code on class_create() failure Greg KH
2008-10-06 23:17 ` [patch 07/28] ACPI: Fix thermal shutdowns Greg KH
2008-10-06 23:17 ` [patch 08/28] x86: add io delay quirk for Presario F700 Greg KH
2008-10-06 23:17 ` [patch 09/28] rtc: fix deadlock Greg KH
2008-10-06 23:17 ` [patch 10/28] ACPI: Avoid bogus EC timeout when EC is in Polling mode Greg KH
2008-10-06 23:17 ` [patch 11/28] clockevents: prevent clockevent event_handler ending up handler_noop Greg KH
2008-10-06 23:17 ` [patch 12/28] clockevents: prevent endless loop in periodic broadcast handler Greg KH
2008-10-06 23:17 ` [patch 13/28] clockevents: enforce reprogram in oneshot setup Greg KH
2008-10-06 23:17 ` [patch 14/28] clockevents: prevent multiple init/shutdown Greg KH
2008-10-06 23:17 ` Greg KH [this message]
2008-10-06 23:17 ` [patch 16/28] HPET: make minimum reprogramming delta useful Greg KH
2008-10-06 23:17 ` [patch 17/28] clockevents: broadcast fixup possible waiters Greg KH
2008-10-06 23:17 ` [patch 18/28] x86: HPET fix moronic 32/64bit thinko Greg KH
2008-10-06 23:17 ` [patch 19/28] x86: HPET: read back compare register before reading counter Greg KH
2008-10-06 23:17 ` [patch 20/28] ntp: fix calculation of the next jiffie to trigger RTC sync Greg KH
2008-10-06 23:17 ` [patch 21/28] clockevents: remove WARN_ON which was used to gather information Greg KH
2008-10-06 23:17 ` [patch 22/28] x86: Fix broken LDT access in VMI Greg KH
2008-10-06 23:17 ` [patch 23/28] ipv6: Fix OOPS in ip6_dst_lookup_tail() Greg KH
2008-10-06 23:51 ` Neil Horman
2008-10-06 23:17 ` [patch 24/28] niu: panic on reset Greg KH
2008-10-06 23:17 ` [patch 25/28] netlink: fix overrun in attribute iteration Greg KH
2008-10-06 23:17 ` [patch 26/28] sctp: do not enable peer features if we cant do them Greg KH
2008-10-06 23:17 ` [patch 27/28] sctp: Fix oops when INIT-ACK indicates that peer doesnt support AUTH Greg KH
2008-10-06 23:18 ` [patch 28/28] udp: Fix rcv socket locking Greg KH
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=20081006231731.GP20567@suse.de \
--to=gregkh@suse.de \
--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=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--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=w@1wt.eu \
--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 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.