dmaengine: at_xdmac: Move the free desc to the tail of the desc list

Move the free desc to the tail of the list, so that the sequence of
descriptors is more track-able in case of debug. One would know which
descriptor should come next and could easier catch concurrency over
descriptors for example. virt-dma uses list_splice_tail_init() as well,
follow the core driver.

Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
Link: https://lore.kernel.org/r/20211215110115.191749-7-tudor.ambarus@microchip.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
Tudor Ambarus 2021-12-15 13:01:09 +02:00 committed by Vinod Koul
parent b63e5cb94a
commit 801db90bf2
1 changed files with 14 additions and 9 deletions

View File

@ -729,7 +729,8 @@ at_xdmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
if (!desc) { if (!desc) {
dev_err(chan2dev(chan), "can't get descriptor\n"); dev_err(chan2dev(chan), "can't get descriptor\n");
if (first) if (first)
list_splice_init(&first->descs_list, &atchan->free_descs_list); list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list);
goto spin_unlock; goto spin_unlock;
} }
@ -817,7 +818,8 @@ at_xdmac_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr,
if (!desc) { if (!desc) {
dev_err(chan2dev(chan), "can't get descriptor\n"); dev_err(chan2dev(chan), "can't get descriptor\n");
if (first) if (first)
list_splice_init(&first->descs_list, &atchan->free_descs_list); list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list);
spin_unlock_irqrestore(&atchan->lock, irqflags); spin_unlock_irqrestore(&atchan->lock, irqflags);
return NULL; return NULL;
} }
@ -1051,8 +1053,8 @@ at_xdmac_prep_interleaved(struct dma_chan *chan,
src_addr, dst_addr, src_addr, dst_addr,
xt, chunk); xt, chunk);
if (!desc) { if (!desc) {
list_splice_init(&first->descs_list, list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list); &atchan->free_descs_list);
return NULL; return NULL;
} }
@ -1132,7 +1134,8 @@ at_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
if (!desc) { if (!desc) {
dev_err(chan2dev(chan), "can't get descriptor\n"); dev_err(chan2dev(chan), "can't get descriptor\n");
if (first) if (first)
list_splice_init(&first->descs_list, &atchan->free_descs_list); list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list);
return NULL; return NULL;
} }
@ -1308,8 +1311,8 @@ at_xdmac_prep_dma_memset_sg(struct dma_chan *chan, struct scatterlist *sgl,
sg_dma_len(sg), sg_dma_len(sg),
value); value);
if (!desc && first) if (!desc && first)
list_splice_init(&first->descs_list, list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list); &atchan->free_descs_list);
if (!first) if (!first)
first = desc; first = desc;
@ -1701,7 +1704,8 @@ static void at_xdmac_tasklet(struct tasklet_struct *t)
spin_lock_irq(&atchan->lock); spin_lock_irq(&atchan->lock);
/* Move the xfer descriptors into the free descriptors list. */ /* Move the xfer descriptors into the free descriptors list. */
list_splice_init(&desc->descs_list, &atchan->free_descs_list); list_splice_tail_init(&desc->descs_list,
&atchan->free_descs_list);
at_xdmac_advance_work(atchan); at_xdmac_advance_work(atchan);
spin_unlock_irq(&atchan->lock); spin_unlock_irq(&atchan->lock);
} }
@ -1850,7 +1854,8 @@ static int at_xdmac_device_terminate_all(struct dma_chan *chan)
/* Cancel all pending transfers. */ /* Cancel all pending transfers. */
list_for_each_entry_safe(desc, _desc, &atchan->xfers_list, xfer_node) { list_for_each_entry_safe(desc, _desc, &atchan->xfers_list, xfer_node) {
list_del(&desc->xfer_node); list_del(&desc->xfer_node);
list_splice_init(&desc->descs_list, &atchan->free_descs_list); list_splice_tail_init(&desc->descs_list,
&atchan->free_descs_list);
} }
clear_bit(AT_XDMAC_CHAN_IS_PAUSED, &atchan->status); clear_bit(AT_XDMAC_CHAN_IS_PAUSED, &atchan->status);