wrong uptime

Paul Herman pherman at frenchfries.net
Sat Dec 4 08:22:22 PST 2004


On Sat, 4 Dec 2004, YONETANI Tomokazu wrote:

I wonder, if you revert kern_clock.c:1.19 (i.e. set boottime =
basetime) do you still see your problem from April 2003?  I can't
seem to reproduce it at all.
I've confirmed that it doesn't. At lease uptime, ntpdate and ps are working
correctly. I'm not 100% sure that this change affects other parts of the
system that depend on this twisted boottime though.
I doubt they do -- I'm sure the 2x uptime is unintentional.  Here 
is a quick fix, could someone please commit something like this?

Index: kern_clock.c
===================================================================
RCS file: /u01/cvs-repositories/dcvs/src/sys/kern/kern_clock.c,v
retrieving revision 1.27
diff -u -r1.27 kern_clock.c
--- kern_clock.c	20 Nov 2004 20:25:09 -0000	1.27
+++ kern_clock.c	4 Dec 2004 15:48:59 -0000
@@ -227,7 +227,7 @@
 	    basetime.tv_nsec += 1000000000;
 	    --basetime.tv_sec;
 	}
-	boottime.tv_sec = basetime.tv_sec - mycpu->gd_time_seconds;
+	boottime = basetime;
 	timedelta = 0;
 	crit_exit();
 }
As far as I can tell, both boottime/basetime serve the same purpose 
and one of the should be removed because as it stands now, boottime 
is only adjusted by set_timeofday().  Finer clock adjustments ala 
adjtime() do not currently adjust boottime (which they should) 
. ..that is probably a patch for another day.

To see first hand your real uptime sliping away from you, here's a 
short test program.  Getting 0 and 0 for both differences is what 
you should be getting (well, 99.99% of the time :-)

su-2.05b# cc -o x x.c
su-2.05b# ./x
Real time diff: 0
boottime diff:  -262
su-2.05b# cat x.c
#include <sys/time.h>
#include <sys/sysctl.h>
#include <stdio.h>
int main() {
	struct timeval tv1, tv2, b1, b2;
	int l = sizeof(tv1);
	sysctlbyname("kern.boottime", &b1, &l, NULL, 0);
	gettimeofday(&tv1, NULL);
	settimeofday(&tv1, NULL);	// <--- This slides boottime back
	gettimeofday(&tv2, NULL);
	sysctlbyname("kern.boottime", &b2, &l, NULL, 0);
	printf("Real time diff: %ld\n", tv2.tv_sec - tv1.tv_sec);
	printf("boottime diff:  %ld\n", b2.tv_sec - b1.tv_sec);
	return 0;
}
-Paul.





More information about the Bugs mailing list