aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/time.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2006-09-26 04:52:37 -0400
committerAndi Kleen <andi@basil.nowhere.org>2006-09-26 04:52:37 -0400
commit34464a5b8937b79801776dfb6970c1b949fed4be (patch)
tree0e7c2ac3b792e35e036040ac39eb86f2cc466122 /arch/x86_64/kernel/time.c
parenta549b86dd0f3cbffcd5f9343f4ae7fcd59f7e756 (diff)
[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/kernel/time.c')
-rw-r--r--arch/x86_64/kernel/time.c10
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)
1039 unsigned long flags; 1039 unsigned long flags;
1040 unsigned long sec; 1040 unsigned long sec;
1041 unsigned long ctime = get_cmos_time(); 1041 unsigned long ctime = get_cmos_time();
1042 unsigned long sleep_length = (ctime - sleep_start) * HZ; 1042 long sleep_length = (ctime - sleep_start) * HZ;
1043 1043
1044 if (sleep_length < 0) {
1045 printk(KERN_WARNING "Time skew detected in timer resume!\n");
1046 /* The time after the resume must not be earlier than the time
1047 * before the suspend or some nasty things will happen
1048 */
1049 sleep_length = 0;
1050 ctime = sleep_start;
1051 }
1044 if (vxtime.hpet_address) 1052 if (vxtime.hpet_address)
1045 hpet_reenable(); 1053 hpet_reenable();
1046 else 1054 else