Greetings, I noticed large latency spikes in 2.6.28 (and 2.6.27.10) which would make the system unresponsive for minutes at a time (alt+Fn switching wouldn't even work) when the system is under load. I could trigger the latency by running a large make -j 3. Sometimes it would trigger in a few seconds other times it would take a few minutes. I bisected it in 2.6.27.10 to d9a888b061f55534016d2d86a21639948312a117 -> Revert "sched_clock: prevent scd->clock from moving backwards" (ca7e716c7833aeaeb8fedd6d004c5f5d5e14d325 in 2.6.28) and reverting it in 2.6.28 make the latency spike go away. At least, so far no spike in over 24 hours. .config and dmesg from vanilla 2.6.28 is attached. Here's the commit: ------------------------------------ From: Linus Torvalds Date: Sun, 14 Dec 2008 23:46:01 +0000 (-0800) Subject: Revert "sched_clock: prevent scd->clock from moving backwards" X-Git-Tag: v2.6.28-rc9~27 X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=ca7e716c7833aeaeb8fedd6d004c5f5d5e14d325 Revert "sched_clock: prevent scd->clock from moving backwards" This reverts commit 5b7dba4ff834259a5623e03a565748704a8fe449, which caused a regression in hibernate, reported by and bisected by Fabio Comolli. This revert fixes http://bugzilla.kernel.org/show_bug.cgi?id=12155 http://bugzilla.kernel.org/show_bug.cgi?id=12149 Bisected-by: Fabio Comolli Requested-by: Rafael J. Wysocki Acked-by: Dave Kleikamp Cc: Peter Zijlstra Cc: Ingo Molnar Signed-off-by: Linus Torvalds --- diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c index 8178724..e8ab096 100644 --- a/kernel/sched_clock.c +++ b/kernel/sched_clock.c @@ -118,13 +118,13 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now) /* * scd->clock = clamp(scd->tick_gtod + delta, - * max(scd->tick_gtod, scd->clock), - * max(scd->clock, scd->tick_gtod + TICK_NSEC)); + * max(scd->tick_gtod, scd->clock), + * scd->tick_gtod + TICK_NSEC); */ clock = scd->tick_gtod + delta; min_clock = wrap_max(scd->tick_gtod, scd->clock); - max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC); + max_clock = scd->tick_gtod + TICK_NSEC; clock = wrap_max(clock, min_clock); clock = wrap_min(clock, max_clock); ------------------------------------