[PATCH v2 2/3] dmaengine: altera-msgdma: cleanup after completing all descriptors

From: Olivier Dautricourt
Date: Sat Jun 08 2024 - 17:33:02 EST


msgdma_chan_desc_cleanup iterates the done list for each completed
descriptor while we need to do it once after all descriptors are
completed.

This fixes a Sparse warning because we first take the lock in
msgdma_tasklet.
- Move locking to msgdma_chan_desc_cleanup.
- Move call to msgdma_chan_desc_cleanup outside of the critical section of
msgdma_tasklet.

Inspired by: commit 16ed0ef3e931 ("dmaengine: zynqmp_dma: cleanup after
completing all descriptors")

Signed-off-by: Olivier Dautricourt <olivierdautricourt@xxxxxxxxx>
Tested-by: Olivier Dautricourt <olivierdautricourt@xxxxxxxxx>
Suggested-by: Eric Schwarz <eas@xxxxxxxxxxxxxxxxxxx>
---
drivers/dma/altera-msgdma.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/altera-msgdma.c b/drivers/dma/altera-msgdma.c
index 160a465b06dd..f32453c97dac 100644
--- a/drivers/dma/altera-msgdma.c
+++ b/drivers/dma/altera-msgdma.c
@@ -585,6 +585,8 @@ static void msgdma_chan_desc_cleanup(struct msgdma_device *mdev)
struct msgdma_sw_desc *desc, *next;
unsigned long irqflags;

+ spin_lock_irqsave(&mdev->lock, irqflags);
+
list_for_each_entry_safe(desc, next, &mdev->done_list, node) {
struct dmaengine_desc_callback cb;

@@ -600,6 +602,8 @@ static void msgdma_chan_desc_cleanup(struct msgdma_device *mdev)
/* Run any dependencies, then free the descriptor */
msgdma_free_descriptor(mdev, desc);
}
+
+ spin_unlock_irqrestore(&mdev->lock, irqflags);
}

/**
@@ -714,10 +718,11 @@ static void msgdma_tasklet(struct tasklet_struct *t)
}

msgdma_complete_descriptor(mdev);
- msgdma_chan_desc_cleanup(mdev);
}

spin_unlock_irqrestore(&mdev->lock, flags);
+
+ msgdma_chan_desc_cleanup(mdev);
}

/**
--
2.45.0