dmaengine: virt-dma: Add missing locking around list operations
authorSascha Hauer <s.hauer@pengutronix.de>
Mon, 16 Dec 2019 10:53:24 +0000 (11:53 +0100)
committerVinod Koul <vkoul@kernel.org>
Thu, 26 Dec 2019 04:34:18 +0000 (10:04 +0530)
All list operations are protected by &vc->lock. As vchan_vdesc_fini()
is called unlocked add the missing locking around the list operations.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Reviewed-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Tested-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Link: https://lore.kernel.org/r/20191216105328.15198-6-s.hauer@pengutronix.de
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/virt-dma.h

index e213137..e9f5250 100644 (file)
@@ -113,10 +113,15 @@ static inline void vchan_vdesc_fini(struct virt_dma_desc *vd)
 {
        struct virt_dma_chan *vc = to_virt_chan(vd->tx.chan);
 
-       if (dmaengine_desc_test_reuse(&vd->tx))
+       if (dmaengine_desc_test_reuse(&vd->tx)) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&vc->lock, flags);
                list_add(&vd->node, &vc->desc_allocated);
-       else
+               spin_unlock_irqrestore(&vc->lock, flags);
+       } else {
                vc->desc_free(vd);
+       }
 }
 
 /**