diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-02-22 07:38:40 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-02-25 12:38:13 -0500 |
| commit | 10dd31a7a17254d6ba793305fc590455393e610e (patch) | |
| tree | 7416cf325f40eb27df6f0455807a0a1dfb203c2d /kernel | |
| parent | c7986acba211e8285e14c9603fb89e6f4ea0b9f8 (diff) | |
time: ntp: fix bug in ntp_update_offset() & do_adjtimex()
Impact: change (fix) the way the NTP PLL seconds offset is initialized/tracked
Fix a bug and do a micro-optimization:
When PLL is enabled we do not reset time_reftime. If the PLL
was off for a long time (for example after bootup), this is
arguably the wrong thing to do.
We already had a hack for the common boot-time case in
ntp_update_offset(), in form of:
if (unlikely(time_status & STA_FREQHOLD || time_reftime == 0))
secs = 0;
But the update delta should be reset later on too - not just when
the PLL is enabled for the first time after bootup.
So do it on !STA_PLL -> STA_PLL transitions.
This changes behavior, as previously if ntpd was disabled for
a long time and we restarted it, we'd run from that last update,
with a very large delta.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/ntp.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 580a35028693..fc08eb10ced4 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
| @@ -142,7 +142,7 @@ static void ntp_update_offset(long offset) | |||
| 142 | * and in which mode (PLL or FLL). | 142 | * and in which mode (PLL or FLL). |
| 143 | */ | 143 | */ |
| 144 | secs = xtime.tv_sec - time_reftime; | 144 | secs = xtime.tv_sec - time_reftime; |
| 145 | if (unlikely(time_status & STA_FREQHOLD || time_reftime == 0)) | 145 | if (unlikely(time_status & STA_FREQHOLD)) |
| 146 | secs = 0; | 146 | secs = 0; |
| 147 | 147 | ||
| 148 | time_reftime = xtime.tv_sec; | 148 | time_reftime = xtime.tv_sec; |
| @@ -394,6 +394,13 @@ int do_adjtimex(struct timex *txc) | |||
| 394 | } | 394 | } |
| 395 | /* only set allowed bits */ | 395 | /* only set allowed bits */ |
| 396 | time_status &= STA_RONLY; | 396 | time_status &= STA_RONLY; |
| 397 | /* | ||
| 398 | * If we turn on PLL adjustments then reset the | ||
| 399 | * reference time to current time. | ||
| 400 | */ | ||
| 401 | if (!(time_status & STA_PLL) && (txc->status & STA_PLL)) | ||
| 402 | time_reftime = xtime.tv_sec; | ||
| 403 | |||
| 397 | time_status |= txc->status & ~STA_RONLY; | 404 | time_status |= txc->status & ~STA_RONLY; |
| 398 | 405 | ||
| 399 | switch (time_state) { | 406 | switch (time_state) { |
