diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2006-09-26 10:52:37 +0200 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-09-26 10:52:37 +0200 |
commit | 34464a5b8937b79801776dfb6970c1b949fed4be (patch) | |
tree | 0e7c2ac3b792e35e036040ac39eb86f2cc466122 /arch/x86_64 | |
parent | a549b86dd0f3cbffcd5f9343f4ae7fcd59f7e756 (diff) | |
download | blackbird-op-linux-34464a5b8937b79801776dfb6970c1b949fed4be.tar.gz blackbird-op-linux-34464a5b8937b79801776dfb6970c1b949fed4be.zip |
[PATCH] Detect clock skew during suspend
Detect the situations in which the time after a resume from disk would
be earlier than the time before the suspend and prevent them from
happening on x86_64.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/x86_64')
-rw-r--r-- | arch/x86_64/kernel/time.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c index 97115e608ed8..9dd15d12b659 100644 --- a/arch/x86_64/kernel/time.c +++ b/arch/x86_64/kernel/time.c @@ -1039,8 +1039,16 @@ static int timer_resume(struct sys_device *dev) unsigned long flags; unsigned long sec; unsigned long ctime = get_cmos_time(); - unsigned long sleep_length = (ctime - sleep_start) * HZ; + long sleep_length = (ctime - sleep_start) * HZ; + if (sleep_length < 0) { + printk(KERN_WARNING "Time skew detected in timer resume!\n"); + /* The time after the resume must not be earlier than the time + * before the suspend or some nasty things will happen + */ + sleep_length = 0; + ctime = sleep_start; + } if (vxtime.hpet_address) hpet_reenable(); else |