DragonFly BSD
DragonFly commits List (threaded) for 2004-12
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: cvs commit: src/sys/kern


From: Paul Herman <pherman@xxxxxxxxxxxxxxx>
Date: Sat, 4 Dec 2004 17:22:25 -0800 (PST)

On Sat, 4 Dec 2004, Matthew Dillon wrote:

 Log:
 Fix the boottime calculation when the time of day is set in absolute terms.
 We want boottime to be calculated based on the current real time minus our
 best uptime guess.  gd_time_seconds survives a lot of time issues and is our
 best uptime guess and since it is already used to calculate the new basetime,
 we can just assign boottime to basetime.

On an additional note -- and I suppose anything at this point is nitpicking -- would it be worthwhile to preserve the original drift? Take an extreme example with the current code with a machine booted at 12:00:00 when the clock adds a second every 30 seconds compared to a reference clock:


        basetime = 11:59:58
        boottime = 12:00:00
  reference time = 12:01:00
 gd_time_seconds = 62
    nanouptime() = 00:01:02
wallclock uptime = 00:01:00
     w(1) uptime = 00:01:00

Now, reset time on the reference clock (and machine) forward 1 minute to 12:02:00

        basetime = 12:00:58
        boottime = 12:00:58
  reference time = 12:02:00
 gd_time_seconds = 62
    nanouptime() = 00:01:02
wallclock uptime = 00:01:00
     w(1) uptime = 00:01:02

So (if I got the logic all right) the w(1) uptime reported would be wrong. If we could add the original 2 second difference between boottime & basetime back to boottime, I think things should be better.

Thoughts?  Am I getting too anal?  :-)
-Paul.

void
set_timeofday(struct timespec *ts)
{
        struct timespec ts2, drift;

        /*
         * XXX SMP / non-atomic basetime updates
         */
        crit_enter();
	drift.tv_sec = boottime.tv_sec - basetime.tv_sec;
	drift.tv_nsec = boottime.tv_nsec - basetime.tv_nsec;
        nanouptime(&ts2);
        basetime.tv_sec = ts->tv_sec - ts2.tv_sec;
        basetime.tv_nsec = ts->tv_nsec - ts2.tv_nsec;
        if (basetime.tv_nsec < 0) {
            basetime.tv_nsec += 1000000000;
            --basetime.tv_sec;
        }
        boottime.tv_sec = basetime.tv_sec + drift.tv_sec;
        boottime.tv_nsec = basetime.tv_nsec + drift.tv_nsec;
        timedelta = 0;
        crit_exit();
}





[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]