mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2026-11-10 20:48:12 +00: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:
|
History
|
|
|---|---|---|
| .. | ||
| 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 | ||