]> git.baikalelectronics.ru Git - kernel.git/commit
x86/ioapic: Implement irq_get_irqchip_state() callback
authorThomas Gleixner <tglx@linutronix.de>
Fri, 28 Jun 2019 11:11:52 +0000 (13:11 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 3 Jul 2019 08:12:30 +0000 (10:12 +0200)
commita91e93180118d0190a721a2e562e9df71e980afa
tree5fd083dcb940eaeb0ff83497373508caec6bf352
parent2736c4c8e4c7b9356b10b8cb9e9a31bf4408414f
x86/ioapic: Implement irq_get_irqchip_state() callback

When an interrupt is shut down in free_irq() there might be an inflight
interrupt pending in the IO-APIC remote IRR which is not yet serviced. That
means the interrupt has been sent to the target CPUs local APIC, but the
target CPU is in a state which delays the servicing.

So free_irq() would proceed to free resources and to clear the vector
because synchronize_hardirq() does not see an interrupt handler in
progress.

That can trigger a spurious interrupt warning, which is harmless and just
confuses users, but it also can leave the remote IRR in a stale state
because once the handler is invoked the interrupt resources might be freed
already and therefore acknowledgement is not possible anymore.

Implement the irq_get_irqchip_state() callback for the IO-APIC irq chip. The
callback is invoked from free_irq() via __synchronize_hardirq(). Check the
remote IRR bit of the interrupt and return 'in flight' if it is set and the
interrupt is configured in level mode. For edge mode the remote IRR has no
meaning.

As this is only meaningful for level triggered interrupts this won't cure
the potential spurious interrupt warning for edge triggered interrupts, but
the edge trigger case does not result in stale hardware state. This has to
be addressed at the vector/interrupt entry level seperately.

Fixes: 1bdf385f90e1 ("x86/vector: Switch IOAPIC to global reservation mode")
Reported-by: Robert Hodaszi <Robert.Hodaszi@digi.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Link: https://lkml.kernel.org/r/20190628111440.370295517@linutronix.de
arch/x86/kernel/apic/io_apic.c