OK I don't care if there is better machinery or numbers, this is far better than the current situation. We lost power in a DC a few months back and we had machines come up with clocks off by values between 30 seconds and 45 minutes. On 9 Nov 2015 8:04 am, "Christian Weisgerber" <na...@mips.inka.de> wrote:
> I would like to sync the system time periodically back to the RTC. > > Currently we update the RTC > (1) when the time is set with clock_settime() or settimeofday(), which > never happens for a typical ntpd setup, > (2) before suspend, > (3) when the system is properly shut down. > > This means if a machine has been running for a few months and it > loses power, it may come back up with the time, say, 200 seconds > off because of RTC drift, and then your SixXS tunnel won't come up > and you can no longer reach your home network on the last day of > u2k15. For example. > > FreeBSD uses a period of 30 minutes. I have no idea what a good > number would be so I went with that. (Maybe a prime number of > seconds?) FreeBSD also has a sysctl knob to change the period, > which is silly. > > The patch below, inspired by FreeBSD, "seems to work for me", but > I don't really know what I'm doing and if it's okay to just use a > timeout(9) like that. Do I need a task? Any locking? I'm also > uncertain where to put the hook to kick off the initial timeout_add(). > > > Index: kern/init_main.c > =================================================================== > RCS file: /cvs/src/sys/kern/init_main.c,v > retrieving revision 1.246 > diff -u -p -r1.246 init_main.c > --- kern/init_main.c 8 Nov 2015 20:45:57 -0000 1.246 > +++ kern/init_main.c 8 Nov 2015 21:06:47 -0000 > @@ -118,6 +118,8 @@ struct sigacts sigacts0; > struct process *initprocess; > struct proc *reaperproc; > > +void start_periodic_resettodr(void); > + > extern struct user *proc0paddr; > > struct vnode *rootvp, *swapdev_vp; > @@ -550,6 +552,8 @@ main(void *framep) > #if !(defined(__m88k__) && defined(MULTIPROCESSOR)) /* XXX */ > pool_gc_pages(NULL); > #endif > + > + start_periodic_resettodr(); > > /* > * proc0: nothing to do, back to sleep > Index: kern/kern_time.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_time.c,v > retrieving revision 1.95 > diff -u -p -r1.95 kern_time.c > --- kern/kern_time.c 1 Nov 2015 19:03:33 -0000 1.95 > +++ kern/kern_time.c 8 Nov 2015 16:46:46 -0000 > @@ -41,6 +41,7 @@ > #include <sys/vnode.h> > #include <sys/signalvar.h> > #include <sys/pledge.h> > +#include <sys/timeout.h> > #include <sys/timetc.h> > > #include <sys/mount.h> > @@ -792,3 +793,21 @@ ppsratecheck(struct timeval *lasttime, i > return (rv); > } > > + > +#define RESETTODR_PERIOD 1800 > + > +void periodic_resettodr(void *); > +struct timeout resettodr_to = TIMEOUT_INITIALIZER(periodic_resettodr, > NULL); > + > +void > +periodic_resettodr(void *arg __unused) > +{ > + resettodr(); > + timeout_add_sec(&resettodr_to, RESETTODR_PERIOD); > +} > + > +void > +start_periodic_resettodr(void) > +{ > + timeout_add_sec(&resettodr_to, RESETTODR_PERIOD); > +} > -- > Christian "naddy" Weisgerber na...@mips.inka.de > >