2.4.0t8 SMP interrupt high latency ?

From: Robert Redelmeier (redelm@ev1.net)
Date: Sun Sep 24 2000 - 18:02:59 EST


I've been testing out the 2.4.0 kernels as Linus wants.
My particular area is looking at SMP interrupt handling
trying to write `burnAPIC`.

First, the good news: average int overhead measured by
`clockwatcher.c` [posted last year] is down from ~960 CPU
clocks in 2.2.13 to ~740 clocks in 2.4.0t8. Impressive.

Now the bad: Sometimes (~15%) it takes at least 25,000 CPU
clocks (68 us @ 366) for an IRQ to be handled. [Both module
prink's come out before the kernel intr printk's] Then the
the second of the closed-spaced pair gets lost. I use a write
to the APIC Intr Cmd Reg to simulate hardware interrupts
[`movl 0x840D0, 0xFFFFE300` in the kernel module below].
Naturally I hit uninstalled IRQs, and the default handler
takes care of it with a nice printk.

Now I don't know if the same behaviour happens with real
hardware interrupts, but the possibility is there. And
long interrupt latency will cause real trouble for high
interrupt machines. An innocent Linux box might suffer
sitting on a 100baseTX ethernet polluted by broadcast
runts from poxy MS-Windows NetBIOS boxen. It'd only have
6 us to handle the garbage packets.

I don't know what would cause high IRQ latency. I would
hope that the APIC page at 0xFFFFF000 isn't mapped cacheable.

-- Robert author `cpuburn` http://users.ev1.net/~redelm

# modAPIC - Generate hw interrupts
# Copyright 2000 RJ Redelmeier GPL - NO WARRANTEE.

.globl init_module
.globl cleanup_module
.extern printk
 
.text
.align 4
init_module:
     pushl %ebp
     movl %esp,%ebp
# movl $0x000840E0, 0xFFFFE300
# movl $0x000840D0, 0xFFFFE300
     rdtsc
     pushl %eax
     pushl $strLoad
     call printk
     rdtsc
     pushl %eax
     pushl $strLoad
     call printk
     xorl %eax, %eax
     leave
     ret
     
cleanup_module:
     pushl %ebp
     movl %esp,%ebp
     movl $0x000840D0, 0xFFFFE300
     movl $0x000840E0, 0xFFFFE300
     rdtsc
     pushl %eax
     pushl $strUnload
     call printk
     rdtsc
     pushl %eax
     pushl $strUnload
     call printk
     xorl %eax, %eax
     leave
     ret

.section .modinfo
__module_kernel_version:
.ascii "kernel_version=2.2.15\0"

.section .rodata
.align 32
strLoad: .ascii "<1> Asm Module Loaded! @ %u\n\0"
strUnload: .ascii "<1> Asm Module Unloaded @ %u\n\0"
#
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Sep 30 2000 - 21:00:12 EST