Skip to content

Commit

Permalink
dmaengine: at_xdmac: Move the free desc to the tail of the desc list
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tudor Ambarus authored and Vinod Koul committed Jan 5, 2022
1 parent b63e5cb commit 801db90
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/dma/at_xdmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,8 @@ at_xdmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
if (!desc) {
dev_err(chan2dev(chan), "can't get descriptor\n");
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;
}

Expand Down Expand Up @@ -817,7 +818,8 @@ at_xdmac_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr,
if (!desc) {
dev_err(chan2dev(chan), "can't get descriptor\n");
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);
return NULL;
}
Expand Down Expand Up @@ -1051,8 +1053,8 @@ at_xdmac_prep_interleaved(struct dma_chan *chan,
src_addr, dst_addr,
xt, chunk);
if (!desc) {
list_splice_init(&first->descs_list,
&atchan->free_descs_list);
list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list);
return NULL;
}

Expand Down Expand Up @@ -1132,7 +1134,8 @@ at_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
if (!desc) {
dev_err(chan2dev(chan), "can't get descriptor\n");
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;
}

Expand Down Expand Up @@ -1308,8 +1311,8 @@ at_xdmac_prep_dma_memset_sg(struct dma_chan *chan, struct scatterlist *sgl,
sg_dma_len(sg),
value);
if (!desc && first)
list_splice_init(&first->descs_list,
&atchan->free_descs_list);
list_splice_tail_init(&first->descs_list,
&atchan->free_descs_list);

if (!first)
first = desc;
Expand Down Expand Up @@ -1701,7 +1704,8 @@ static void at_xdmac_tasklet(struct tasklet_struct *t)

spin_lock_irq(&atchan->lock);
/* 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);
spin_unlock_irq(&atchan->lock);
}
Expand Down Expand Up @@ -1850,7 +1854,8 @@ static int at_xdmac_device_terminate_all(struct dma_chan *chan)
/* Cancel all pending transfers. */
list_for_each_entry_safe(desc, _desc, &atchan->xfers_list, 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);
Expand Down

0 comments on commit 801db90

Please sign in to comment.