|
@@ -32,6 +32,8 @@ struct timekeeper {
|
|
|
cycle_t cycle_interval;
|
|
|
/* Number of clock shifted nano seconds in one NTP interval. */
|
|
|
u64 xtime_interval;
|
|
|
+ /* shifted nano seconds left over when rounding cycle_interval */
|
|
|
+ s64 xtime_remainder;
|
|
|
/* Raw nano seconds accumulated per NTP interval. */
|
|
|
u32 raw_interval;
|
|
|
|
|
@@ -62,7 +64,7 @@ struct timekeeper timekeeper;
|
|
|
static void timekeeper_setup_internals(struct clocksource *clock)
|
|
|
{
|
|
|
cycle_t interval;
|
|
|
- u64 tmp;
|
|
|
+ u64 tmp, ntpinterval;
|
|
|
|
|
|
timekeeper.clock = clock;
|
|
|
clock->cycle_last = clock->read(clock);
|
|
@@ -70,6 +72,7 @@ static void timekeeper_setup_internals(struct clocksource *clock)
|
|
|
/* Do the ns -> cycle conversion first, using original mult */
|
|
|
tmp = NTP_INTERVAL_LENGTH;
|
|
|
tmp <<= clock->shift;
|
|
|
+ ntpinterval = tmp;
|
|
|
tmp += clock->mult/2;
|
|
|
do_div(tmp, clock->mult);
|
|
|
if (tmp == 0)
|
|
@@ -80,6 +83,7 @@ static void timekeeper_setup_internals(struct clocksource *clock)
|
|
|
|
|
|
/* Go back from cycles -> shifted ns */
|
|
|
timekeeper.xtime_interval = (u64) interval * clock->mult;
|
|
|
+ timekeeper.xtime_remainder = ntpinterval - timekeeper.xtime_interval;
|
|
|
timekeeper.raw_interval =
|
|
|
((u64) interval * clock->mult) >> clock->shift;
|
|
|
|
|
@@ -719,7 +723,8 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift)
|
|
|
|
|
|
/* Accumulate error between NTP and clock interval */
|
|
|
timekeeper.ntp_error += tick_length << shift;
|
|
|
- timekeeper.ntp_error -= timekeeper.xtime_interval <<
|
|
|
+ timekeeper.ntp_error -=
|
|
|
+ (timekeeper.xtime_interval + timekeeper.xtime_remainder) <<
|
|
|
(timekeeper.ntp_error_shift + shift);
|
|
|
|
|
|
return offset;
|