Patch "dmaengine: mediatek: Fix deadlock caused by synchronize_irq()" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    dmaengine: mediatek: Fix deadlock caused by synchronize_irq()

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     dmaengine-mediatek-fix-deadlock-caused-by-synchroniz.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 516331dc0acf580658daee4dc5cd8819590a9346
Author: Duoming Zhou <duoming@xxxxxxxxxx>
Date:   Sun Aug 6 11:25:11 2023 +0800

    dmaengine: mediatek: Fix deadlock caused by synchronize_irq()
    
    [ Upstream commit 01f1ae2733e2bb4de92fefcea5fda847d92aede1 ]
    
    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: 9135408c3ace ("dmaengine: mediatek: Add MediaTek UART APDMA support")
    Signed-off-by: Duoming Zhou <duoming@xxxxxxxxxx>
    Reviewed-by: Eugen Hristev <eugen.hristev@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230806032511.45263-1-duoming@xxxxxxxxxx
    Signed-off-by: Vinod Koul <vkoul@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/dma/mediatek/mtk-uart-apdma.c b/drivers/dma/mediatek/mtk-uart-apdma.c
index a1517ef1f4a01..0acf6a92a4ad3 100644
--- a/drivers/dma/mediatek/mtk-uart-apdma.c
+++ b/drivers/dma/mediatek/mtk-uart-apdma.c
@@ -451,9 +451,8 @@ static int mtk_uart_apdma_device_pause(struct dma_chan *chan)
 	mtk_uart_apdma_write(c, VFF_EN, VFF_EN_CLR_B);
 	mtk_uart_apdma_write(c, VFF_INT_EN, VFF_INT_EN_CLR_B);
 
-	synchronize_irq(c->irq);
-
 	spin_unlock_irqrestore(&c->vc.lock, flags);
+	synchronize_irq(c->irq);
 
 	return 0;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux