diff mbox series

[v2,3/3] dmaengine: altera-msgdma: properly free descriptor in msgdma_free_descriptor

Message ID 20240608213216.25087-3-olivierdautricourt@gmail.com (mailing list archive)
State Accepted
Commit 54e4ada1a4206f878e345ae01cf37347d803d1b1
Headers show
Series [v2,1/3] dmaengine: altera-msgdma: use irq variant of spin_lock/unlock while invoking callbacks | expand

Commit Message

Olivier Dautricourt June 8, 2024, 9:31 p.m. UTC
Remove list_del call in msgdma_chan_desc_cleanup, this should be the role
of msgdma_free_descriptor. In consequence replace list_add_tail with
list_move_tail in msgdma_free_descriptor.

This fixes the path:
   msgdma_free_chan_resources -> msgdma_free_descriptors ->
   msgdma_free_desc_list -> msgdma_free_descriptor

which does not correctly free the descriptors as first nodes were not
removed from the list.

Signed-off-by: Olivier Dautricourt <olivierdautricourt@gmail.com>
Tested-by: Olivier Dautricourt <olivierdautricourt@gmail.com>
---
 drivers/dma/altera-msgdma.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

Comments

Markus Elfring June 9, 2024, 5:30 p.m. UTC | #1
> Remove list_del call in msgdma_chan_desc_cleanup, this should be the role
> of msgdma_free_descriptor. In consequence replace list_add_tail with
> list_move_tail in msgdma_free_descriptor.
…

Would you like to add the tag “Fixes”?

Regards,
Markus
Olivier Dautricourt June 9, 2024, 8:36 p.m. UTC | #2
On Sun, Jun 09, 2024 at 07:30:04PM +0200, Markus Elfring wrote:
> > Remove list_del call in msgdma_chan_desc_cleanup, this should be the role
> > of msgdma_free_descriptor. In consequence replace list_add_tail with
> > list_move_tail in msgdma_free_descriptor.
> …
> 
> Would you like to add the tag “Fixes”?

Right, the Fixes tag will target the first commit
introducing this driver (a85c6f1b2921)

Thanks,
Olivier
diff mbox series

Patch

diff --git a/drivers/dma/altera-msgdma.c b/drivers/dma/altera-msgdma.c
index f32453c97dac..0968176f323d 100644
--- a/drivers/dma/altera-msgdma.c
+++ b/drivers/dma/altera-msgdma.c
@@ -233,7 +233,7 @@  static void msgdma_free_descriptor(struct msgdma_device *mdev,
 	struct msgdma_sw_desc *child, *next;
 
 	mdev->desc_free_cnt++;
-	list_add_tail(&desc->node, &mdev->free_list);
+	list_move_tail(&desc->node, &mdev->free_list);
 	list_for_each_entry_safe(child, next, &desc->tx_list, node) {
 		mdev->desc_free_cnt++;
 		list_move_tail(&child->node, &mdev->free_list);
@@ -590,8 +590,6 @@  static void msgdma_chan_desc_cleanup(struct msgdma_device *mdev)
 	list_for_each_entry_safe(desc, next, &mdev->done_list, node) {
 		struct dmaengine_desc_callback cb;
 
-		list_del(&desc->node);
-
 		dmaengine_desc_get_callback(&desc->async_tx, &cb);
 		if (dmaengine_desc_callback_valid(&cb)) {
 			spin_unlock_irqrestore(&mdev->lock, irqflags);