PCI IRQ Handler getting called twice!

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I have a strange observation that I can't quite determine the
cause for.

I have a PCI-based board that communicates with the
host CPU (Linux) via a memory mapped area and an interrupt
line. I can trigger a board-to-host interrupt from the host
via access to memory mapped registers.

If I write a loop that generates this interrupt, turn on debugging
in my driver to see how many times the IRQ handler gets
called, and parse /proc/interrupts for the IRQ count of
the board, and the ERR count, I see the following:

- either the IRQ count in /proc/interrupts increments by 2
   and the IRQ handler gets called twice (the first time
   through the handler clears the interrupt source, and
   the second time through it does nothing).

or

 - the IRQ count increments by 1, the IRQ handler gets
   called once, and the ERR counter in /proc/interrupts
   gets incremented. This last counter is isr_err_count
   which is incremented in arch/i386/kernel/i8259.c
   an is often associated with spurious interrupt
   messages in dmesg - however in this case the
   counter just gets incremented.

I looked at the interrupt line with a scope. The interrupt
is a single low pulse for about 10us. So there is no
double interrupt to generate the two observed interrupts.
(The machine is a 700MHz P-III).

One possibility is that the interrupt source is still valid
when the interrupt acknowledge is sent to the interrupt
controller. However, my interrupt handler follows
what appears to be the recommended format of
Linux drivers, so if I experience this problem, then
I'm sure others must have too! (However, ERR
doesn't seem to be counting up on my other
linux boxes!).

Also, if I add enough printk statements for debugging
in the ISR handler, the IRQ count increments by 1,
and ERR does not! So making the handler slower
helps! (Or perhaps it is the spin locks within the
printk code that disable interrupts ...).

I tried registering the handler with SA_INTERRUPT
to have the handler run with interrupts disabled,
however I still got two interrupts.

Any help/comments/tests!?

Thanks,
Dave Hawkins




--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux