linux/kernel/time
Thomas Gleixner 7b7422a566 clocksource: Prevent potential kgdb dead lock
commit 0f8e8ef7 (clocksource: Simplify clocksource watchdog resume
logic) introduced a potential kgdb dead lock. When the kernel is
stopped by kgdb inside code which holds watchdog_lock then kgdb dead
locks in clocksource_resume_watchdog().

clocksource_resume_watchdog() is called from kbdg via
clocksource_touch_watchdog() to avoid that the clock source watchdog
marks TSC unstable after the kernel has been stopped.

Solve this by replacing spin_lock with a spin_trylock and just return
in case the lock is held. Not resetting the watchdog might result in
TSC becoming marked unstable, but that's an acceptable penalty for
using kgdb.

The timekeeping is anyway easily screwed up by kgdb when the system
uses either jiffies or a clock source which wraps in short intervals
(e.g. pm_timer wraps about every 4.6s), so we really do not have to
worry about that occasional TSC marked unstable side effect.

The second caller of clocksource_resume_watchdog() is
clocksource_resume(). The trylock is safe here as well because the
system is UP at this point, interrupts are disabled and nothing else
can hold watchdog_lock().

Reported-by: Jason Wessel <jason.wessel@windriver.com>
LKML-Reference: <1264480000-6997-4-git-send-email-jason.wessel@windriver.com>
Cc: kgdb-bugreport@lists.sourceforge.net
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: John Stultz <johnstul@us.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2010-01-26 14:53:16 +01:00
..
Kconfig Kconfig: eliminate "def_bool n" constructs 2008-10-16 11:21:31 -07:00
Makefile time: add function to convert between calendar time and broken-down time for universal use 2009-09-24 07:20:56 -07:00
clockevents.c clockevent: Don't remove broadcast device when cpu is dead 2010-01-18 14:44:50 +01:00
clocksource.c clocksource: Prevent potential kgdb dead lock 2010-01-26 14:53:16 +01:00
jiffies.c clocksource: Cleanup clocksource selection 2009-08-15 10:55:46 +02:00
ntp.c timekeeping: Introduce timekeeping_leap_insert 2009-08-15 10:55:45 +02:00
tick-broadcast.c clockevents: Convert to raw_spinlock 2009-12-14 23:55:34 +01:00
tick-common.c clockevents: Convert to raw_spinlock 2009-12-14 23:55:34 +01:00
tick-internal.h clockevents: Make tick_device_lock static 2009-12-14 23:55:34 +01:00
tick-oneshot.c nohz: Allow 32-bit machines to sleep for more than 2.15 seconds 2009-11-13 20:46:24 +01:00
tick-sched.c Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-12-08 19:27:08 -08:00
timecompare.c timecompare: fix half-Y2K38 problem in timecompare_update while calculating offset 2009-12-16 07:19:57 -08:00
timeconv.c time: add function to convert between calendar time and broken-down time for universal use 2009-09-24 07:20:56 -07:00
timekeeping.c Revert "time: Remove xtime_cache" 2009-12-22 14:10:37 -08:00
timer_list.c cpumask: avoid dereferencing struct cpumask 2009-12-17 11:43:29 +10:30
timer_stats.c hrtimers: Convert to raw_spinlocks 2009-12-14 23:55:34 +01:00