diff options
| author | Roman Zippel <zippel@linux-m68k.org> | 2006-10-01 02:28:25 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-01 03:39:26 -0400 |
| commit | 8f807f8d2137ba728d22820103131038639b68a9 (patch) | |
| tree | cea8d4eedbffc17ea9a01808afacb0e02dbbe206 /kernel/time | |
| parent | 3d3675cc3d04d7fd4bb11e8c1ea79e5ade4f5e44 (diff) | |
[PATCH] ntp: add time_adjust to tick length
This folds update_ntp_one_tick() into second_overflow() and adds time_adjust
to the tick length, this makes time_next_adjust unnecessary. This slightly
changes the adjtime() behaviour, instead of applying it to the next tick, it's
applied to the next second.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Cc: john stultz <johnstul@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/ntp.c | 71 |
1 files changed, 18 insertions, 53 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 238ce47ef09d..65223b7ed810 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
| @@ -22,8 +22,9 @@ unsigned long tick_usec = TICK_USEC; /* USER_HZ period (usec) */ | |||
| 22 | unsigned long tick_nsec; /* ACTHZ period (nsec) */ | 22 | unsigned long tick_nsec; /* ACTHZ period (nsec) */ |
| 23 | static u64 tick_length, tick_length_base; | 23 | static u64 tick_length, tick_length_base; |
| 24 | 24 | ||
| 25 | /* Don't completely fail for HZ > 500. */ | 25 | #define MAX_TICKADJ 500 /* microsecs */ |
| 26 | int tickadj = 500/HZ ? : 1; /* microsecs */ | 26 | #define MAX_TICKADJ_SCALED (((u64)(MAX_TICKADJ * NSEC_PER_USEC) << \ |
| 27 | TICK_LENGTH_SHIFT) / HZ) | ||
| 27 | 28 | ||
| 28 | /* | 29 | /* |
| 29 | * phase-lock loop variables | 30 | * phase-lock loop variables |
| @@ -40,7 +41,6 @@ long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ | |||
| 40 | long time_freq; /* frequency offset (scaled ppm)*/ | 41 | long time_freq; /* frequency offset (scaled ppm)*/ |
| 41 | long time_reftime; /* time at last adjustment (s) */ | 42 | long time_reftime; /* time at last adjustment (s) */ |
| 42 | long time_adjust; | 43 | long time_adjust; |
| 43 | long time_next_adjust; | ||
| 44 | 44 | ||
| 45 | /** | 45 | /** |
| 46 | * ntp_clear - Clears the NTP state variables | 46 | * ntp_clear - Clears the NTP state variables |
| @@ -160,46 +160,19 @@ void second_overflow(void) | |||
| 160 | time_adj = max(time_adj, ((MAXPHASE / HZ) << SHIFT_UPDATE) / MINSEC); | 160 | time_adj = max(time_adj, ((MAXPHASE / HZ) << SHIFT_UPDATE) / MINSEC); |
| 161 | time_offset -= time_adj; | 161 | time_offset -= time_adj; |
| 162 | tick_length += (s64)time_adj << (TICK_LENGTH_SHIFT - SHIFT_UPDATE); | 162 | tick_length += (s64)time_adj << (TICK_LENGTH_SHIFT - SHIFT_UPDATE); |
| 163 | } | ||
| 164 | |||
| 165 | /* | ||
| 166 | * Returns how many microseconds we need to add to xtime this tick | ||
| 167 | * in doing an adjustment requested with adjtime. | ||
| 168 | */ | ||
| 169 | static long adjtime_adjustment(void) | ||
| 170 | { | ||
| 171 | long time_adjust_step; | ||
| 172 | |||
| 173 | time_adjust_step = time_adjust; | ||
| 174 | if (time_adjust_step) { | ||
| 175 | /* | ||
| 176 | * We are doing an adjtime thing. Prepare time_adjust_step to | ||
| 177 | * be within bounds. Note that a positive time_adjust means we | ||
| 178 | * want the clock to run faster. | ||
| 179 | * | ||
| 180 | * Limit the amount of the step to be in the range | ||
| 181 | * -tickadj .. +tickadj | ||
| 182 | */ | ||
| 183 | time_adjust_step = min(time_adjust_step, (long)tickadj); | ||
| 184 | time_adjust_step = max(time_adjust_step, (long)-tickadj); | ||
| 185 | } | ||
| 186 | return time_adjust_step; | ||
| 187 | } | ||
| 188 | 163 | ||
| 189 | /* in the NTP reference this is called "hardclock()" */ | 164 | if (unlikely(time_adjust)) { |
| 190 | void update_ntp_one_tick(void) | 165 | if (time_adjust > MAX_TICKADJ) { |
| 191 | { | 166 | time_adjust -= MAX_TICKADJ; |
| 192 | long time_adjust_step; | 167 | tick_length += MAX_TICKADJ_SCALED; |
| 193 | 168 | } else if (time_adjust < -MAX_TICKADJ) { | |
| 194 | time_adjust_step = adjtime_adjustment(); | 169 | time_adjust += MAX_TICKADJ; |
| 195 | if (time_adjust_step) | 170 | tick_length -= MAX_TICKADJ_SCALED; |
| 196 | /* Reduce by this step the amount of time left */ | 171 | } else { |
| 197 | time_adjust -= time_adjust_step; | 172 | time_adjust = 0; |
| 198 | 173 | tick_length += (s64)(time_adjust * NSEC_PER_USEC / | |
| 199 | /* Changes by adjtime() do not take effect till next tick. */ | 174 | HZ) << TICK_LENGTH_SHIFT; |
| 200 | if (time_next_adjust != 0) { | 175 | } |
| 201 | time_adjust = time_next_adjust; | ||
| 202 | time_next_adjust = 0; | ||
| 203 | } | 176 | } |
| 204 | } | 177 | } |
| 205 | 178 | ||
| @@ -213,14 +186,7 @@ void update_ntp_one_tick(void) | |||
| 213 | */ | 186 | */ |
| 214 | u64 current_tick_length(void) | 187 | u64 current_tick_length(void) |
| 215 | { | 188 | { |
| 216 | u64 ret; | 189 | return tick_length; |
| 217 | |||
| 218 | /* calculate the finest interval NTP will allow. | ||
| 219 | */ | ||
| 220 | ret = tick_length; | ||
| 221 | ret += (u64)(adjtime_adjustment() * 1000) << TICK_LENGTH_SHIFT; | ||
| 222 | |||
| 223 | return ret; | ||
| 224 | } | 190 | } |
| 225 | 191 | ||
| 226 | 192 | ||
| @@ -263,7 +229,7 @@ int do_adjtimex(struct timex *txc) | |||
| 263 | result = time_state; /* mostly `TIME_OK' */ | 229 | result = time_state; /* mostly `TIME_OK' */ |
| 264 | 230 | ||
| 265 | /* Save for later - semantics of adjtime is to return old value */ | 231 | /* Save for later - semantics of adjtime is to return old value */ |
| 266 | save_adjust = time_next_adjust ? time_next_adjust : time_adjust; | 232 | save_adjust = time_adjust; |
| 267 | 233 | ||
| 268 | #if 0 /* STA_CLOCKERR is never set yet */ | 234 | #if 0 /* STA_CLOCKERR is never set yet */ |
| 269 | time_status &= ~STA_CLOCKERR; /* reset STA_CLOCKERR */ | 235 | time_status &= ~STA_CLOCKERR; /* reset STA_CLOCKERR */ |
| @@ -310,8 +276,7 @@ int do_adjtimex(struct timex *txc) | |||
| 310 | if (txc->modes & ADJ_OFFSET) { /* values checked earlier */ | 276 | if (txc->modes & ADJ_OFFSET) { /* values checked earlier */ |
| 311 | if (txc->modes == ADJ_OFFSET_SINGLESHOT) { | 277 | if (txc->modes == ADJ_OFFSET_SINGLESHOT) { |
| 312 | /* adjtime() is independent from ntp_adjtime() */ | 278 | /* adjtime() is independent from ntp_adjtime() */ |
| 313 | if ((time_next_adjust = txc->offset) == 0) | 279 | time_adjust = txc->offset; |
| 314 | time_adjust = 0; | ||
| 315 | } | 280 | } |
| 316 | else if (time_status & STA_PLL) { | 281 | else if (time_status & STA_PLL) { |
| 317 | ltemp = txc->offset; | 282 | ltemp = txc->offset; |
