[PATCH] Detect clock skew during suspend
[firefly-linux-kernel-4.4.55.git] / arch / x86_64 / kernel / time.c
index 97115e608ed85a8ae8121cdf13a90ae3bbc73d25..9dd15d12b659f0ef5914b78337a095f7c3a38c32 100644 (file)
@@ -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