mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
The interrupt-emulation virtual IRQ uses handle_level_irq(), but the IRQ
descriptor has not been marked with IRQ_LEVEL.
The interrupt emulation is somewhat unusual: the eDMA interrupt handlers
dispatch the virtual IRQ for every edma_int[] interrupt because software
cannot reliably tell an interrupt-emulation event from one caused solely
by DONE/ABORT status. If an interrupt arrives before the doorbell
handler is registered for the virtual IRQ, the IRQ core marks it
pending. When the IRQ is later started, check_irq_resend() treats it as
non-level and replays the pending interrupt, causing the newly
registered handler to run for a stale event.
Mark the virtual IRQ with IRQ_LEVEL so the stale pending state is
cleared without being replayed. This was observed in pci_endpoint_test
as two doorbell handler calls when the DMA-variant test ran before
DOORBELL_TEST.
Fixes:
|
||
|---|---|---|
| .. | ||
| dw-edma-core.c | ||
| dw-edma-core.h | ||
| dw-edma-pcie.c | ||
| dw-edma-v0-core.c | ||
| dw-edma-v0-core.h | ||
| dw-edma-v0-debugfs.c | ||
| dw-edma-v0-debugfs.h | ||
| dw-edma-v0-regs.h | ||
| dw-hdma-v0-core.c | ||
| dw-hdma-v0-core.h | ||
| dw-hdma-v0-debugfs.c | ||
| dw-hdma-v0-debugfs.h | ||
| dw-hdma-v0-regs.h | ||
| Kconfig | ||
| Makefile | ||