diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2006-09-26 04:52:37 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-09-26 04:52:37 -0400 |
commit | 34464a5b8937b79801776dfb6970c1b949fed4be (patch) | |
tree | 0e7c2ac3b792e35e036040ac39eb86f2cc466122 /arch | |
parent | a549b86dd0f3cbffcd5f9343f4ae7fcd59f7e756 (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')
-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) | |||
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 |