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