Package: adjtimex Version: 1.21.1-3 Severity: normal Tags: patch Hello,
Reportedly, on some machines, adjtimex hangs with the /dev/rtc driver, because ioctl(RTC_UIE_ON) succeeds, but no interrupt never comes. The attached patch adds a --directisa option to adjtimex, named after the hwclock --directisa option, and doing the same thing: Bypass the /dev/rtc driver. BTW --version shows 1.20 instead of 1.21.1 Alain.
diff -prud adjtimex-1.21.1.orig/adjtimex.c adjtimex-1.21.1/adjtimex.c --- adjtimex-1.21.1.orig/adjtimex.c Sun Sep 23 11:10:17 2007 +++ adjtimex-1.21.1/adjtimex.c Sun Sep 23 18:52:31 2007 @@ -119,6 +120,7 @@ struct option longopt[]= {"timeconstant", 1, NULL, 'T'}, {"tick", 1, NULL, 't'}, {"utc", 0, NULL, 'u'}, + {"directisa", 0, NULL, 'd'}, {"version", 0, NULL, 'v'}, {"verbose", 0, NULL, 'V'}, {"watch", 0, NULL, 'w'}, @@ -199,10 +201,11 @@ usage(void) " -c, --compare[=count] compare system and CMOS clocks\n" " -i, --interval tim set clock comparison interval (sec)\n" " -l, --log[=file] log current times to file\n" -" --host timeserver query the timeserver\n" +" -h, --host timeserver query the timeserver\n" " -w, --watch get current time from user\n" " -r, --review[=file] review clock log file, estimate drifts\n" " -u, --utc the CMOS clock is set to UTC\n" +" -d, --directisa access the CMOS clock directly\n" "\n" "Informative Output:\n" " --help print this help, then exit\n" @@ -276,7 +279,7 @@ main(int argc, char *argv[]) txc.modes = 0; while((c = getopt_long_only(argc, argv, - "a::c::l::e:f:h:i:m:o:prPPsPS:RT:t:uvVw", + "a::c::l::e:f:h:i:m:o:prPPsPS:RT:t:udvVw", longopt, NULL)) != -1) { switch(c) @@ -367,6 +370,9 @@ main(int argc, char *argv[]) case 'u': universal = 1; break; + case 'd': + using_dev_rtc = 0; + break; case 'v': { printf("adjtimex %s\n", VERSION); diff -prud adjtimex-1.21.1.orig/adjtimex.8 adjtimex-1.21.1/adjtimex.8 --- adjtimex-1.21.1.orig/adjtimex.8 Fri May 26 23:06:38 2006 +++ adjtimex-1.21.1/adjtimex.8 Sun Sep 23 22:30:17 2007 @@ -115,6 +115,8 @@ follow. \-\-review[=\fIfile\fP] \-u \-\-utc +\-d +\-\-directisa .TP \fBInformative Output\fP \-\-help @@ -263,6 +265,21 @@ Set the interval in seconds between cloc \fB\-\-compare\fP and \fB\-\-adjust\fP options. .IP "\fB\-u\fP, \fB\-\-utc\fP" The CMOS clock is set to UTC (universal time) rather than local time. +.IP "\fB\-d\fP, \fB\-\-directisa\fP" +To read the CMOS clock accurately, \fBadjtimex\fP usually accesses the +clock via the /dev/rtc device driver of the kernel, and makes use of its +CMOS update-ended interrupt to detect the beginning of seconds. When the +/dev/rtc driver is absent, or when the interrupt is not available, +\fBadjtimex\fP can sometimes automatically fallback to a direct access +method. This method detects the start of seconds by polling the +update\-in\-progress (UIP) flag of the CMOS clock. You can force this +direct access to the CMOS chip with the \fB\-\-directisa\fP switch. + +Note that the /dev/rtc interrupt method is more accurate, less sensible +to perturbations due to system load, cleaner, cheaper, and is generally +better than the direct access method. It is advisable to not use the +\fB\-\-directisa\fP switch, unless the CMOS chip or the motherboard +don't properly provide the necessary interrupt. .IP "\fB\-l\fP[\fIfile\fP], \fB\-\-log\fP[\fB=\fP\fIfile\fP]" Save the current values of the system and CMOS clocks, and optionally a reference time, to \fIfile\fP (default \fI/var/log/clocks.log\fP).