Package: chrony
Version: 1.20-6
Followup-For: Bug #294030

 
after a little stracing, I came to the conclusion that chrony
alternating calls to ioctl(fd, RTC_UIE_ON, 0) and ioctl(fd, RTC_UIE_OFF, 0)
is responsible for the freezes.

the program attached (that must be run by root after ensuring nobody
else is using /dev/rtc) should print approximately one line every 0.1 sec.

on my PC, when genrtc.ko is loaded, lines with a plus sign
(corresponding to the RTC_UIE_ON calls) have delays ranging from 0.2 sec
to 0.9 sec. 

I have no idea whether the calls make sense, or whether the kernel
module behaviour is correct, because I don't know what the ioctls are
supposed to do.  Maybe someone should ask the kernel people...

hope it helps
g.b.

-- System Information:
Debian Release: 3.1
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.8-2-686
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages chrony depends on:
ii  libc6                       2.3.2.ds1-20 GNU C Library: Shared libraries an
ii  libncurses5                 5.4-4        Shared libraries for terminal hand
ii  libreadline4                4.3-11       GNU readline and history libraries

-- no debconf information
#include <fcntl.h>
#include <time.h>
#include <linux/rtc.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <stdlib.h>

#define delta(x, y) ( (x.tv_usec-y.tv_usec) + (x.tv_sec-y.tv_sec)*1000000 )

int main()
{
    int i;
    struct timespec rem, delay = { 0, 100000000L };	/* 100 msec delay */
    struct timeval t, t0;
    int iv[] = { RTC_UIE_OFF, RTC_UIE_ON };
    int rtc;

    gettimeofday(&t0, NULL);
    if ((rtc = open("/dev/rtc", O_RDWR)) < 0) {
	perror("can't open RTC");
	return EXIT_FAILURE;
    }
    for (i = 100; i--; ) {
	int f = i & 0x7;	/* i % 8 */
	int r;
	r = nanosleep(&delay, &rem);
	gettimeofday(&t, NULL);
	printf("%8ld %d %c\n", delta(t, t0), r, (f ? ' ' : '+'));
	if (f < 2)
	    ioctl(rtc, iv[f], 0);
	t0 = t;
    }
    return EXIT_SUCCESS;
}

Reply via email to