On Mon, 10 Aug 2020 09:53:10 +0200
Otto Moerbeek <[email protected]> wrote:
> On Sun, Aug 09, 2020 at 09:46:00PM +0100, Julian Smith wrote:
>
> > I've just used adjfreq() directly to correct my hardware clock,
> > which was running an hour ahead of UTC (due to my hardware
> > previously running Windows).
> >
> > But i've struggled to understand the adjfreq(2) man page, so ended
> > up finding a value for <freq> by trial and error.
> >
> > I ended up with this code:
> >
> > double x = 1.5;
> > int64_t newfreq = ((1ll << 32) * 1e9) * x;
> > adjfreq(newfreq, NULL);
>
> This does not look like actual code, first arg should be a pointer.
Ah yes, apologies for this, i foolishly hand-wrote the code above in
the post. The actual code i used did pass a pointer:
e = adjfreq(&newfreq, &oldfreq);
>
> >
> > In this table, the second column is the increment in the time as
> > shown by running date(1) twice, over a 10 second period as measured
> > using my phone as a timer, for different values of x:
> >
> > x 10s
> > -------------
> > 0 10
> > 0.1 12
> > 0.25 13
> > 0.5 15
> > 0.75 17
> > 0.8 19
> > 0.9 19
> > 1.0 21
> > 1.1 1
> > 1.25: 3
> > 1.5: 6
> > 1.75: 8
> > 2: 10
> > 2.25: 10
> > 2.5: 10
>
> The only user of adjfreq(2) in base is ntpd(8), which caps it's
> adjustments between +/-MAX_FREQUENCY_ADJUST = 128e-5.
>
> It is very well possible the calculations in the kernel go wrong with
> large(r) values. The API exists for gradual adjustments, not for
> anything big. Scott Cheloha <[email protected]> has been working
> on the kernel side of things, he might know more, so I Cc'ed him,
> don't know if her reads misc@.
Thanks for doing this.
Using a big adjustment was very convenient for fixing my problem, so it
might be of general use/interest. I guess alternatives would be to get
control early in boot and fix it up; or i think one can tell the OS that
the hardware clock is set to a particular offset from UTC (can't find
the man page for this right now, but i'm sure i came across it when
investigating adjfreq).
Thanks,
- Jules
--
http://op59.net