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

Reply via email to