]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
spi: dw: fix race between IRQ handler and error handler on SMP
authorPeng Yang <pyangyyd@gmail.com>
Mon, 8 Jun 2026 09:58:49 +0000 (17:58 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 9 Jun 2026 23:07:39 +0000 (00:07 +0100)
On SMP systems, dw_spi_handle_err() can be called from the SPI core
kthread while the IRQ handler is still accessing the FIFO on another
CPU. Resetting the chip via dw_spi_reset_chip() during an active FIFO
read/write causes a bus error.

Fix this by calling disable_irq() before the chip reset, which masks
the IRQ and waits for any in-flight handler to complete via
synchronize_irq(). This ensures no handler is accessing the FIFO when
the reset occurs.

Signed-off-by: Peng Yang <pyangyyd@amazon.com>
Suggested-by: Jonathan Chocron <jonnyc@amazon.com>
Link: https://patch.msgid.link/20260608095849.3446-1-pyangyyd@amazon.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-dw-core.c

index b47637888c5c6f650e2f840748cf4e10ad96e377..4672bc2a873a714b38d8ee5597f17c70b9269b61 100644 (file)
@@ -472,7 +472,9 @@ static inline void dw_spi_abort(struct spi_controller *ctlr)
        if (dws->dma_mapped)
                dws->dma_ops->dma_stop(dws);
 
+       disable_irq(dws->irq);
        dw_spi_reset_chip(dws);
+       enable_irq(dws->irq);
 }
 
 static void dw_spi_handle_err(struct spi_controller *ctlr,