Commit 06e1e4ff authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

uml: deal with host time going backwards

Protection against the host's time going backwards (eg, ntp activity on
the host) by keeping track of the time at the last tick and if it's
greater than the current time, keep time stopped until the host catches
up.

Cc: Nix <nix@esperi.org.uk>
Signed-off-by: default avatarJeff Dike <jdike@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 34397892
...@@ -106,6 +106,10 @@ static void deliver_alarm(void) ...@@ -106,6 +106,10 @@ static void deliver_alarm(void)
unsigned long long this_tick = os_nsecs(); unsigned long long this_tick = os_nsecs();
int one_tick = UM_NSEC_PER_SEC / UM_HZ; int one_tick = UM_NSEC_PER_SEC / UM_HZ;
/* Protection against the host's time going backwards */
if ((last_tick != 0) && (this_tick < last_tick))
this_tick = last_tick;
if (last_tick == 0) if (last_tick == 0)
last_tick = this_tick - one_tick; last_tick = this_tick - one_tick;
...@@ -148,6 +152,9 @@ static int after_sleep_interval(struct timespec *ts) ...@@ -148,6 +152,9 @@ static int after_sleep_interval(struct timespec *ts)
start_usecs = usec; start_usecs = usec;
start_usecs -= skew / UM_NSEC_PER_USEC; start_usecs -= skew / UM_NSEC_PER_USEC;
if (start_usecs < 0)
start_usecs = 0;
tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC, tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC,
.tv_usec = start_usecs % UM_USEC_PER_SEC }); .tv_usec = start_usecs % UM_USEC_PER_SEC });
interval = ((struct itimerval) { { 0, usec }, tv }); interval = ((struct itimerval) { { 0, usec }, tv });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment