summaryrefslogtreecommitdiff
path: root/drivers/dma/virt-dma.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2019-12-16 13:53:23 +0300
committerVinod Koul <vkoul@kernel.org>2019-12-26 07:34:18 +0300
commitf882101122aa110ef8e64be04472e5a47030300e (patch)
tree0efa92d461b35e0146ff7436646cfd99662b83ff /drivers/dma/virt-dma.c
parentdf660a2b6dfcf26001af6cd2441268c29416dd64 (diff)
downloadlinux-f882101122aa110ef8e64be04472e5a47030300e.tar.xz
dmaengine: virt-dma: Do not call desc_free() under a spin_lock
vchan_vdesc_fini() shouldn't be called under a spin_lock. This is done in two places, once in vchan_terminate_vdesc() and once in vchan_synchronize(). Instead of freeing the vdesc right away, collect the aborted vdescs on a separate list and free them along with the other vdescs. The terminated descs are also freed in vchan_synchronize as done before this patch. 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-5-s.hauer@pengutronix.de Signed-off-by: Vinod Koul <vkoul@kernel.org>
Diffstat (limited to 'drivers/dma/virt-dma.c')
-rw-r--r--drivers/dma/virt-dma.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/dma/virt-dma.c b/drivers/dma/virt-dma.c
index 7ba712888ac7..26e08c7a7465 100644
--- a/drivers/dma/virt-dma.c
+++ b/drivers/dma/virt-dma.c
@@ -138,6 +138,7 @@ void vchan_init(struct virt_dma_chan *vc, struct dma_device *dmadev)
INIT_LIST_HEAD(&vc->desc_submitted);
INIT_LIST_HEAD(&vc->desc_issued);
INIT_LIST_HEAD(&vc->desc_completed);
+ INIT_LIST_HEAD(&vc->desc_terminated);
tasklet_init(&vc->task, vchan_complete, (unsigned long)vc);