linux/drivers/dma/mediatek
Duoming Zhou 01f1ae2733 dmaengine: mediatek: Fix deadlock caused by synchronize_irq()
The synchronize_irq(c->irq) will not return until the IRQ handler
mtk_uart_apdma_irq_handler() is completed. If the synchronize_irq()
holds a spin_lock and waits the IRQ handler to complete, but the
IRQ handler also needs the same spin_lock. The deadlock will happen.
The process is shown below:

          cpu0                        cpu1
mtk_uart_apdma_device_pause() | mtk_uart_apdma_irq_handler()
  spin_lock_irqsave()         |
                              |   spin_lock_irqsave()
  //hold the lock to wait     |
  synchronize_irq()           |

This patch reorders the synchronize_irq(c->irq) outside the spin_lock
in order to mitigate the bug.

Fixes: 9135408c3a ("dmaengine: mediatek: Add MediaTek UART APDMA support")
Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
Reviewed-by: Eugen Hristev <eugen.hristev@collabora.com>
Link: https://lore.kernel.org/r/20230806032511.45263-1-duoming@zju.edu.cn
Signed-off-by: Vinod Koul <vkoul@kernel.org>
2023-10-04 19:26:36 +05:30
..
Kconfig treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
Makefile dmaengine updates for v5.3-rc1 2019-07-17 09:55:43 -07:00
mtk-cqdma.c dmaengine: Explicitly include correct DT includes 2023-08-01 23:51:27 +05:30
mtk-hsdma.c dmaengine: Explicitly include correct DT includes 2023-08-01 23:51:27 +05:30
mtk-uart-apdma.c dmaengine: mediatek: Fix deadlock caused by synchronize_irq() 2023-10-04 19:26:36 +05:30