dmaengine: at_xdmac: Move the free desc to the tail of the desc list
authorTudor Ambarus <tudor.ambarus@microchip.com>
Wed, 15 Dec 2021 11:01:09 +0000 (13:01 +0200)
committerVinod Koul <vkoul@kernel.org>
Wed, 5 Jan 2022 10:20:03 +0000 (15:50 +0530)
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>
drivers/dma/at_xdmac.c

index d5b37459f9067e8a17a6f518a1ba0ee376f084fe..b6547f1b5645a0b6187e850ec9328c06dce6ce3b 100644 (file)
@@ -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;
                }
 
@@ -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;
                }
@@ -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;
                        }
 
@@ -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;
                }
 
@@ -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;
@@ -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);
        }
@@ -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);