Commit d3ddfab0 authored by Olivier Dautricourt's avatar Olivier Dautricourt Committed by Vinod Koul
Browse files

dmaengine: altera-msgdma: cleanup after completing all descriptors



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 16ed0ef3 ("dmaengine: zynqmp_dma: cleanup after
                                   completing all descriptors")

Signed-off-by: default avatarOlivier Dautricourt <olivierdautricourt@gmail.com>
Tested-by: default avatarOlivier Dautricourt <olivierdautricourt@gmail.com>
Suggested-by: default avatarEric Schwarz <eas@sw-optimization.com>
Link: https://lore.kernel.org/r/20240608213216.25087-2-olivierdautricourt@gmail.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 261d3a85
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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);
}

/**