You are seeing the cluster-f*** on IRQ 9 because your machine has installed the
ACPI HAL, and this is what that HAL does. The ACPI HAL can cause a lot of
problems on some installations. You can replace this hal by using device mangler
and selecting computer, and update driver. However, this is not recommended by MS
– the only recommended way is to reinstall the OS. There is a hotkey that you
can press during NT setup to force setup not to check for ACPI, can’t recall it
right now (IIRC it’s F7). It would be interesting to see the effect of replacing
the HAL on interrupt latency…
Regards,
Paul Bunn, UltraBac.com, 425-644-6000
Microsoft MVP - WindowsNT/2000
http://www.ultrabac.com
-----Original Message-----
From: Jan Bottorff [mailto:xxxxx@pmatrix.com]
Sent: Tuesday, October 31, 2000 6:36 PM
To: NT Developers Interest List
Subject: [ntdev] Re: A question about Interrupt Service Routine
At 02:22 AM 11/1/2000 +0300, Maxim S. Shatskih wrote:
> moment while fooling with level specific stuff. If I have 4 cards
> generating a large numbers of interrupts, all on a shared level, I fully
> would expect a 4 processor machine to spread the load. Seems like the
Move the majority of your logic from ISRs to DPCs - DPCs can run
concurrently on different processors.
I’m thinking in terms of how drivers co-exist with each other. Some drivers
do major work in the ISR (sometimes because the hardware is stupid and
critical timing loops have to happen in the ISR), and as a result, can
seriously degrade the interrupt response latency for ISR’s farther down the
shared level chain. It seems kind of bogus to think on some systems, there
is an idle processor, and my driver might have degraded performance because
some ISR up the chain takes it’s time.
I just happen to have built a new Win2000 machine, and noticed no less than
NINE devices are all assigned to interrupt level 9, not to mention there
are at least 4 free interrupt levels. Offhand, it looks like MANY devices
on an interrupt level is common. This is just a bland workstation machine,
on a very modern chipset (Intel D815EEA motherboard), a video card, and two
PCI cards (a dual serial port, and a PCCard controller). If we believe the
execution time for a typical ISR is like 15 uSec (PCI uncached device
accesses can take a significant fraction of a microsecond each), the last
device on this chain is looking at a latency of 120 uSec. If it happens to
be the serial port, running at 900k baud, the interrupt rate will be about
6250 interrupts/sec. For 9 devices to service 15 uSec ISR’s, 6250 times/sec
suggest the system will spend 84% if it’s time servicing ISR’s. If we think
the ISR can run in 5 uSec, that’s still over 28% of the CPU consumed if the
last device in the chain generated 6250 interrupts/sec. My rule of thumb is
6250 interrupts/sec is not excessive, although in this example it looks
pretty unpleasant. Is my calculator broken, or does this really suggest my
system may experience very serious performance degradation if I run a
serial port at a high speed. Network cards OFTEN generate 6250
interrupts/sec, so it doesn’t seem like an issue specific to serial ports.
The issue seems like long chains of shared interrupt ISR’s, with devices
down the chain generating more than trivial activity. Perhaps the ordering
of calling shared ISR’s should be adjusted dynamically to put the most
recent ISR to process an interrupt at the head of the poll chain (or maybe
this happens already?).