[lkml]   [2000]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
SubjectRe: i8259 IRQ problems
On Fri, 24 Mar 2000, Manfred Spraul wrote:

> I'm not sure:
> 1) what happens if the cpu runs with disabled local interrupts, the
> local apic accepts multiple interrupts. The cpu reenables the local
> interrupts.
> Now the tlb flush interrupts should be handled first.
> 2) we are in the middle of a level triggered interrupt.
> We do not ack the interrupt until the end of the interrupt handler. And
> the APIC will deliver higher priority interrupts immediately, but lower
> priority interrupts wait for the EOI.

My memory hasn't served me well this time. You are right and I was
wrong. The local APIC uses a priority model and dispenses higher vectors
first. Given we keep level-triggered interrupts unacked for a long time
now, this really an issue. Two intensive level-triggered interrupts can
starve the tlb flush and also local timer interrupts completely...

> The task priority remains 0, but the local apic maintains a "Processor
> priority register", and this one changes automagically.

Of course. Ingo, how about the following patch? It works for me.

+ Maciej W. Rozycki, Technical University of Gdansk, Poland +
+ e-mail:, PGP key available +

diff -u --recursive --new-file linux-2.3.99-pre3-7.macro/arch/i386/kernel/io_apic.c linux-2.3.99-pre3-7/arch/i386/kernel/io_apic.c
--- linux-2.3.99-pre3-7.macro/arch/i386/kernel/io_apic.c Fri Mar 24 01:08:48 2000
+++ linux-2.3.99-pre3-7/arch/i386/kernel/io_apic.c Fri Mar 24 13:10:13 2000
@@ -524,14 +524,14 @@
static int current_vector = IRQ0_TRAP_VECTOR, offset = 0;
if (IO_APIC_VECTOR(irq) > 0)
return IO_APIC_VECTOR(irq);
- if (current_vector == 0xFF)
+ if (current_vector == LAST_APIC_VECTOR)
panic("ran out of interrupt sources!");
current_vector += 8;
if (current_vector == SYSCALL_VECTOR)
goto next;

- if (current_vector > 0xFF) {
+ if (current_vector > LAST_APIC_VECTOR) {
current_vector = IRQ0_TRAP_VECTOR + offset;
diff -u --recursive --new-file linux-2.3.99-pre3-7.macro/include/asm-i386/hw_irq.h linux-2.3.99-pre3-7/include/asm-i386/hw_irq.h
--- linux-2.3.99-pre3-7.macro/include/asm-i386/hw_irq.h Fri Mar 24 03:20:48 2000
+++ linux-2.3.99-pre3-7/include/asm-i386/hw_irq.h Fri Mar 24 13:08:57 2000
@@ -27,18 +27,18 @@

- * Special IRQ vectors used by the SMP architecture, 0x30-0x4f
+ * Special IRQ vectors used by the SMP architecture, 0xe0-0xff
* some of the following vectors are 'rare', they are merged
* into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
* TLB, reschedule and local APIC vectors are performance-critical.
-#define LOCAL_TIMER_VECTOR 0x31
+#define LOCAL_TIMER_VECTOR 0xe1

/* 'rare' vectors: */

* These IRQs should never really happen on perfect hardware running
@@ -48,15 +48,16 @@
* normally, so we violate the 'only 2 vectors per priority level'
* rule here.
-#define ERROR_APIC_VECTOR 0x43
+#define ERROR_APIC_VECTOR 0xf3

- * First APIC vector available to drivers: (vectors 0x51-0xfe)
- * we start at 0x51 to spread out vectors between priority levels
+ * First APIC vector available to drivers: (vectors 0x31-0xdf)
+ * we start at 0x31 to spread out vectors between priority levels
* evenly. (note that 0x80 is the syscall vector)
-#define IRQ0_TRAP_VECTOR 0x51
+#define IRQ0_TRAP_VECTOR 0x31
+#define LAST_APIC_VECTOR 0xdf

extern int irq_vector[NR_IRQS];
#define IO_APIC_VECTOR(irq) irq_vector[irq]

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
Please read the FAQ at

 \ /
  Last update: 2005-03-22 13:57    [W:0.041 / U:38.092 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site