What does --disable-kernel-PLL do?
Eric S. Raymond
esr at thyrsus.com
Fri Dec 2 06:05:13 UTC 2016
Hal Murray <hmurray at megapathdsl.net>:
>
> I was expecting it to be a no-op unless you turned on one of the magic
> options in a refclock that handed PPS processing off to the kernel.
>
> I think it's doing more than that. The symptom is that ntptime says:
>
> ntp_gettime() returns code 5 (ERROR)
> time dbdd51ae.aa8bc000 2016-11-21T02:57:50.666, (.666195),
> maximum error 16000000 us, estimated error 16000000 us, TAI offset 0
> ntp_adjtime() returns code 5 (ERROR)
> modes 0x0 (),
> offset 0.000 us, frequency 0.000 ppm, interval 1 s,
> maximum error 16000000 us, estimated error 16000000 us,
> status 0x40 (UNSYNC),
> time constant 2, precision 1.000 us, tolerance 500 ppm,
>
> The long story is that I had a setup that included --disable-kernel-PLL. (I
> don't remember why I added that.) I noticed that my daemon that records
> things like CPU and disk temperature and NTP's drift was getting 0 for the
> drift because that's what ntp_adjtime was returning. I eventually tracked it
> back to the --disable-kernel-PLL configuration option.
Here's the inside view from looking at the code: --disable-kernel-PLL turns
off the use of ntp_adjtime() to slew time, leaving adjustments to be done
at much coarser granularity by the old-style adjtime(2) call.
> There is a tangle in this area that I don't understand. When ntpd exits (or
> crashes), it leaves the previous state in the kernel so anybody running
> ntptime will think things are fine.
What previous state?
> I think there is a minor bug in libntp/clockwork:ntp_adjtime_ns
>
> The first time through when it tests for NANO/MICRO, it will get a wrong
> answer. See the sample above. Here is printout from a debugging hack:
>
> 21 Nov 03:30:13 ntpd[580]: ntp_adjtime: rc=5, modes: 0, status: 40
> 21 Nov 03:41:10 ntpd[1119]: ntp_adjtime: rc=0, modes: 0, status: 2001
>
> The first line is from a reboot. The second line if from restarting ntpd
> after it had been running.
>
> The code says:
> nanoseconds = (STA_NANO & ztx.status) != 0;
> so the first run will work in MICRO mode and divide the time correction by
> 1000. But there is more code following that recomputs nanoseconds after each
> call so it will get fixed before long.
>
> It's probably a bug in the kernel that it doesn't return the MICRO/NANO flag
> with the UNSYNC flag.
Yes, and it makes a fix difficult. Do you have any recommended action?
--
<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>
More information about the devel
mailing list