From 6f261cc4266ab205e615853f67d5fe71a46551cf Mon Sep 17 00:00:00 2001 From: Roman Zippel Date: Mon, 22 Sep 2008 14:42:43 -0700 Subject: [PATCH] --- yaml --- r: 116350 b: refs/heads/master c: 5cd1c9c5cf30d4b33df3d3f74d8142f278d536b7 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/time/timekeeping.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 6e634339040f..4e824684a210 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: eb3f938fd6292dc79f43a5fe14784b044776e9f0 +refs/heads/master: 5cd1c9c5cf30d4b33df3d3f74d8142f278d536b7 diff --git a/trunk/kernel/time/timekeeping.c b/trunk/kernel/time/timekeeping.c index e91c29f961c9..5ecbfc39a268 100644 --- a/trunk/kernel/time/timekeeping.c +++ b/trunk/kernel/time/timekeeping.c @@ -454,7 +454,7 @@ void update_wall_time(void) #else offset = clock->cycle_interval; #endif - clock->xtime_nsec += (s64)xtime.tv_nsec << clock->shift; + clock->xtime_nsec = (s64)xtime.tv_nsec << clock->shift; /* normally this loop will run just once, however in the * case of lost or late ticks, it will accumulate correctly. @@ -479,9 +479,12 @@ void update_wall_time(void) /* correct the clock when NTP error is too big */ clocksource_adjust(offset); - /* store full nanoseconds into xtime */ - xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift; + /* store full nanoseconds into xtime after rounding it up and + * add the remainder to the error difference. + */ + xtime.tv_nsec = ((s64)clock->xtime_nsec >> clock->shift) + 1; clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift; + clock->error += clock->xtime_nsec << (NTP_SCALE_SHIFT - clock->shift); update_xtime_cache(cyc2ns(clock, offset));