settimeofday function taking 24 - 30 minutes to complete

Scot Hetzel swhetzel at gmail.com
Fri Dec 22 23:40:15 PST 2006


On 12/23/06, Scot Hetzel <swhetzel at gmail.com> wrote:
> By making the following change, the test program no longer hangs the system:
>
>        /*
>         * Calculate local time to put in RTC
>         * Ignore UTC offset, if it would cause the time < Jan 1, 1970 00:00.
>         */
>        if (tm >= utc_offset())
>                tm -= utc_offset();
>        else
>                printf("resettodr: utc_offset > tm");
>
> We probably need to change all the locations that use utc_offset(), to
> have a similar "if (x >= utc_offset()) x -= utc_offset();".
>
Attached is a patch that fixes most of the x -= utc_offset(); cases in
the kernel.

The only one that's not fixed is in sys/dev/twa/tw_osl_inline.h.

Scot

-- 
DISCLAIMER:
No electrons were mamed while sending this message. Only slightly bruised.
-------------- next part --------------
Index: amd64/isa/clock.c
===================================================================
RCS file: /home/ncvs/src/sys/amd64/isa/clock.c,v
retrieving revision 1.228
diff -u -r1.228 clock.c
--- amd64/isa/clock.c	3 Dec 2006 03:49:28 -0000	1.228
+++ amd64/isa/clock.c	23 Dec 2006 04:15:46 -0000
@@ -706,8 +706,7 @@
 	writertc(RTC_STATUSB, RTCSB_HALT | RTCSB_24HR);
 
 	/* Calculate local time to put in RTC */
-
-	tm -= utc_offset();
+	UTC_OFFSET(tm);
 
 	writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60;	/* Write back Seconds */
 	writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60;	/* Write back Minutes */
Index: fs/nwfs/nwfs_subr.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/nwfs/nwfs_subr.c,v
retrieving revision 1.17
diff -u -r1.17 nwfs_subr.c
--- fs/nwfs/nwfs_subr.c	24 Oct 2006 11:43:41 -0000	1.17
+++ fs/nwfs/nwfs_subr.c	23 Dec 2006 04:19:58 -0000
@@ -543,7 +543,8 @@
 
 	t = *tsp;
 	
-	t.tv_sec = - tzoff * 60 - utc_offset();
+	t.tv_sec = - tzoff * 60;
+	UTC_OFFSET(t.tv_sec);
 	timespec2fattime(&t, 1, ddp, dtp, dhp);
 }
 
Index: i386/isa/clock.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/clock.c,v
retrieving revision 1.231
diff -u -r1.231 clock.c
--- i386/isa/clock.c	3 Dec 2006 03:49:28 -0000	1.231
+++ i386/isa/clock.c	23 Dec 2006 04:20:58 -0000
@@ -719,7 +719,7 @@
 		return;
 
 	getnanotime(&ts);
-	ts.tv_sec -= utc_offset();
+	UTC_OFFSET(ts.tv_sec);
 	clock_ts_to_ct(&ts, &ct);
 
 	/* Disable RTC updates and interrupts. */
Index: ia64/ia64/clock.c
===================================================================
RCS file: /home/ncvs/src/sys/ia64/ia64/clock.c,v
retrieving revision 1.30
diff -u -r1.30 clock.c
--- ia64/ia64/clock.c	19 Oct 2006 00:53:35 -0000	1.30
+++ ia64/ia64/clock.c	23 Dec 2006 04:22:15 -0000
@@ -184,7 +184,7 @@
 
 	efi_get_time(&tm);
 	getnanotime(&ts);
-	ts.tv_sec -= utc_offset();
+	UTC_OFFSET(ts.tv_sec);
 	clock_ts_to_ct(&ts, &ct);
 
 	tm.tm_nsec = ts.tv_nsec;
Index: kern/subr_fattime.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_fattime.c,v
retrieving revision 1.2
diff -u -r1.2 subr_fattime.c
--- kern/subr_fattime.c	24 Oct 2006 10:27:23 -0000	1.2
+++ kern/subr_fattime.c	23 Dec 2006 04:13:21 -0000
@@ -142,7 +142,7 @@
 
 	t1 = tsp->tv_sec;
 	if (!utc)
-		t1 -= utc_offset();
+		UTC_OFFSET(t1);
 
 	if (dhp != NULL)
 		*dhp = (tsp->tv_sec & 1) * 100 + tsp->tv_nsec / 10000000;
Index: kern/subr_rtc.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_rtc.c,v
retrieving revision 1.9
diff -u -r1.9 subr_rtc.c
--- kern/subr_rtc.c	2 Oct 2006 18:23:37 -0000	1.9
+++ kern/subr_rtc.c	23 Dec 2006 04:14:25 -0000
@@ -157,7 +157,7 @@
 		return;
 
 	getnanotime(&ts);
-	ts.tv_sec -= utc_offset();
+	UTC_OFFSET(ts.tv_sec);
 	if ((error = CLOCK_SETTIME(clock_dev, &ts)) != 0) {
 		printf("warning: clock_settime failed (%d), time-of-day clock "
 		    "not adjusted to system time\n", error);
Index: pc98/cbus/clock.c
===================================================================
RCS file: /home/ncvs/src/sys/pc98/cbus/clock.c,v
retrieving revision 1.154
diff -u -r1.154 clock.c
--- pc98/cbus/clock.c	2 Oct 2006 16:21:16 -0000	1.154
+++ pc98/cbus/clock.c	23 Dec 2006 04:23:19 -0000
@@ -668,7 +668,7 @@
 		return;
 
 	getnanotime(&ts);
-	ts.tv_sec -= utc_offset();
+	UTC_OFFSET(ts.tv_sec);
 	clock_ts_to_ct(&ts, &ct);
 
 	rtc_serialcom(0x01);	/* Register shift command. */
Index: sys/clock.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/clock.h,v
retrieving revision 1.7
diff -u -r1.7 clock.h
--- sys/clock.h	24 Oct 2006 10:27:23 -0000	1.7
+++ sys/clock.h	23 Dec 2006 04:29:14 -0000
@@ -61,6 +61,11 @@
 int utc_offset(void);
 
 /*
+ * Prevent time from being < Jan 1, 1970 00:00 UTC
+ */
+#define UTC_OFFSET(tm) if (tm >= utc_offset()) tm -= utc_offset()
+
+/*
  * Structure to hold the values typically reported by time-of-day clocks.
  * This can be passed to the generic conversion functions to be converted
  * to a struct timespec.


More information about the freebsd-current mailing list