Re: Regression: can't apply frequency offsets above 1000ppm.

From: Miroslav Lichvar
Date: Thu Sep 03 2015 - 07:29:51 EST


On Wed, Sep 02, 2015 at 04:16:00PM -0700, John Stultz wrote:
> On Tue, Sep 1, 2015 at 6:14 PM, Nuno Gonçalves <nunojpg@xxxxxxxxx> wrote:
> > And just installing chrony from the feeds. With any kernel from 3.17
> > you'll have wrong estimates at chronyc sourcestats.
>
> Wrong estimates? Could you be more specific about what the failure
> you're seeing is here? The
>
> I installed the image above, which comes with a 4.1.6 kernel, and
> chrony seems to have gotten my BBB into ~1ms sync w/ servers over the
> internet fairly quickly (at least according to chronyc tracking).

To see the bug with chronyd the initial offset shouldn't be very close
to zero, so it's forced to correct the offset by adjusting the
frequency in a larger step.

I'm attaching a simple C program that prints the frequency offset
as measured between the REALTIME and MONOTONIC_RAW clocks when the
adjtimex tick is set to 9000. It should show values close to -100000
ppm and I suspect on the BBB it will be much smaller.

--
Miroslav Lichvar
#include <stdio.h>
#include <sys/timex.h>
#include <time.h>
#include <unistd.h>

#define DIFFTS(a, b) ((a.tv_sec - b.tv_sec) + 1e-9 * (a.tv_nsec - b.tv_nsec))

int main() {
struct timespec ts1, ts2, ts3, ts4 = {0};
struct timex t;

t.modes = ADJ_TICK;
t.tick = 9000;
if (adjtimex(&t) < 0)
return 1;

while (1) {
clock_gettime(CLOCK_REALTIME, &ts1);
clock_gettime(CLOCK_MONOTONIC_RAW, &ts2);

if (ts4.tv_sec)
printf("freq offset = %.0f ppm\n",
(DIFFTS(ts1, ts3) / DIFFTS(ts2, ts4) - 1.0) * 1e6);

ts3 = ts1;
ts4 = ts2;
usleep(1000000);
}

return 0;
}