Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 May 2003 00:45:09 +1000 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        jimd@siu.edu
Cc:        freebsd-current@freebsd.org
Subject:   Re: Current-5.1-BETA hangs with SMP/HTT/APIC
Message-ID:  <20030519000704.K19959@gamplex.bde.org>
In-Reply-To: <20030518034907.S28148@freebsd2.localnet10>
References:  <20030518034907.S28148@freebsd2.localnet10>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 18 May 2003 jimd_NOSPAM@siu.edu wrote:

> I have an MSI 655-MAX (SiS 655/963) motherboard (which is HTT capable).
> When I boot a re-compiled kernel with SMP and APIC enabled, the process
> hangs at/after "APIC_IO: Testing 8254 interrupt delivery". (I had to
> disable acpi.o in order to be able to use my Soundblaster Live! card)

Hangs here probably mean that RTC interrupts don't work.  The message lies
slightly -- the test is actually of both RTC and i8254 interrupt delivery,
with i8254 interrupt delivery not tested at all until 5 or 6 RTC interrupts
have been delivered.

I don't know why RTC interrupts wouldn't be delivered, but in my kernel
all interrupts are hard to deliver here, so I only arranged for delivery
of i8254 interrupts and simplified the test to not need RTC interrupts.
This simplification should work in all kernels.

%%%
Index: clock.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/clock.c,v
retrieving revision 1.191
diff -u -2 -r1.191 clock.c
--- clock.c	4 Dec 2002 13:46:49 -0000	1.191
+++ clock.c	26 Apr 2003 12:07:37 -0000
@@ -1076,8 +1799,6 @@
 #ifdef APIC_IO
 	if (apic_8254_trial) {
-
 		printf("APIC_IO: Testing 8254 interrupt delivery\n");
-		while (read_intr_count(8) < 6)
-			;	/* nothing */
+		DELAY(100000);
 		if (read_intr_count(apic_8254_intr) < 3) {
 			/*
%%%

Some details: the old code waits for hopefully at least 5 or 6 RTC
interrupts.  It is sloppy and may lose if several RTC interrupts have
already occurred, but this probably doesn't happen in practice.  The
RTC interrupt frequency is approx. 128 Hz, so waiting for 5-6 RTC
interrupts is almost equivalent to waiting for 39-47 msec.  My version
waits for 100 msec instead.  The i8254 counter should be reliable at
this point although i8254 interrupts might not be.  The i8254 interrupt
frequency is approximately HZ Hz.  For the default configuration of
HZ = 100, there should be 3-5 i8254 interrupts during the wait time
of 39-47 msec.  The magic number of 3 in the test is the same as the
3 in "3-5".  The above code seems to be quite broken for values of HZ
not much smaller than the default, but configuring such values is
unusual.

To avoid the magic numbers, rewrite the test to check that there is
at least 1 i8254 interrupt after the first detected reversal of the
i8254 countdown.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030519000704.K19959>