DMA Engine development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Srinivas Neeli" <srinivas.neeli@amd.com>
Cc: vkoul@kernel.org, Frank.Li@kernel.org, dmaengine@vger.kernel.org
Subject: Re: [PATCH v4 2/4] dmaengine: xilinx_dma: Move descriptors to done list based on completion bit
Date: Tue, 14 Jul 2026 07:22:42 +0000	[thread overview]
Message-ID: <20260714072242.ACE7D1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260713072146.45269-3-srinivas.neeli@amd.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [High] Unconditionally setting `chan->idle = true` after an early loop break causes the driver to incorrectly assume the DMA hardware has stopped, leading to channel corruption.
- [High] Missing read memory barrier (`dma_rmb()`) after polling the DMA descriptor completion bit from coherent memory.

Pre-existing issues:
- [High] MCDMA delay interrupt does not complete descriptors, causing descriptors stranded on `active_list` to hang indefinitely.
--

--- Patch [2]: [PATCH v4 2/4] dmaengine: xilinx_dma: Move descriptors to done list based on completion bit ---
commit 8891a603d60f283d523f7e4fb993dc400bd9bd8e
Author: Srinivas Neeli <srinivas.neeli@amd.com>
Subject: dmaengine: xilinx_dma: Move descriptors to done list based on completion bit

This commit modifies the MCDMA completion logic to check the descriptor
completion bit before moving entries from the active list to the done list.
This addresses an issue where interrupt coalescing could cause descriptors
to be reported as completed prematurely.

> diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
> index 965fb69a2a3ad..9b8b6f1acd4ea 100644
> --- a/drivers/dma/xilinx/xilinx_dma.c
> +++ b/drivers/dma/xilinx/xilinx_dma.c
> @@ -1773,6 +1773,17 @@ static void xilinx_dma_complete_descriptor(struct xilinx_dma_chan *chan)
>  					      struct xilinx_axidma_tx_segment, node);
>  			if (!(seg->hw.status & XILINX_DMA_BD_COMP_MASK) && chan->has_sg)
>  				break;
> +		} else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) {
> +			struct xilinx_aximcdma_tx_segment *seg;
> +			u32 status;
> +
> +			seg = list_last_entry(&desc->segments,
> +					      struct xilinx_aximcdma_tx_segment,
> +					      node);
> +			status = (chan->direction == DMA_DEV_TO_MEM) ?
> +				seg->hw.s2mm_status : seg->hw.mm2s_status;
> +			if (!(status & XILINX_DMA_BD_COMP_MASK))
> +				break;

[Severity: High]
Does this code need a read memory barrier (dma_rmb()) here?

Since the status is read from coherent memory, weakly-ordered CPU
architectures might speculatively reorder the reads of the segment payloads
and status fields to occur before the completion bit check resolves. This
could lead to reading stale, pre-transfer data from the descriptor or the
actual DMA buffer, causing incorrect residue reporting or corrupted network
packets.

[Severity: High]
Also, when this breaks early, unfinished descriptors are left in active_list.
Will this cause a DMA channel hang? Looking at xilinx_mcdma_irq_handler():

xilinx_mcdma_irq_handler() {
    ...
    if (status & XILINX_MCDMA_IRQ_IOC_MASK) {
        spin_lock(&chan->lock);
        xilinx_dma_complete_descriptor(chan);
        chan->idle = true;
        chan->start_transfer(chan);
        spin_unlock(&chan->lock);
    }
    ...
}

The interrupt handler unconditionally sets chan->idle = true and calls
chan->start_transfer(), even if active descriptors are still running due to
the early break.

Since chan->idle is true, start_transfer() attempts to program the CDESC
and TDESC registers with new, unlinked descriptors from pending_list while
the hardware is actively processing active_list, which seems invalid and
likely to cause a complete hardware desynchronization.

[Severity: High]
This is a pre-existing issue, but this patch highlights a fatal flaw for small
transfers. Unlike the standard AXI DMA handler, xilinx_mcdma_irq_handler() does
not invoke xilinx_dma_complete_descriptor() on a delay interrupt:

xilinx_mcdma_irq_handler() {
    ...
    if (status & XILINX_MCDMA_IRQ_DELAY_MASK) {
        /*
         * Device takes too long to do the transfer when user requires
         * responsiveness.
         */
        dev_dbg(chan->dev, "Inter-packet latency too long\n");
    }
    ...
}

If the number of submitted descriptors is below the interrupt coalescing
threshold, the hardware triggers a delay interrupt instead of an IOC interrupt.
Since the delay interrupt doesn't complete descriptors, trailing segments will
remain stranded in active_list indefinitely because they are never processed,
causing a channel hang.

>  		}
>  		if (chan->has_sg && chan->xdev->dma_config->dmatype !=
>  		    XDMA_TYPE_VDMA)

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260713072146.45269-1-srinivas.neeli@amd.com?part=2

  reply	other threads:[~2026-07-14  7:22 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-13  7:21 [PATCH v4 0/4] dmaengine: xilinx_dma: MCDMA descriptor and metadata handling improvements Srinivas Neeli
2026-07-13  7:21 ` [PATCH v4 1/4] dmaengine: xilinx_dma: Fix MCDMA descriptor fields based on DMA direction Srinivas Neeli
2026-07-13  7:21 ` [PATCH v4 2/4] dmaengine: xilinx_dma: Move descriptors to done list based on completion bit Srinivas Neeli
2026-07-14  7:22   ` sashiko-bot [this message]
2026-07-13  7:21 ` [PATCH v4 3/4] net: xilinx: axienet: Derive RX frame length from residue in dmaengine path Srinivas Neeli
2026-07-13  9:44   ` Pandey, Radhey Shyam
2026-07-14  7:22   ` sashiko-bot
2026-07-13  7:21 ` [PATCH v4 4/4] dmaengine: xilinx_dma: Extend metadata handling for AXI DMA and MCDMA Srinivas Neeli
2026-07-13  9:50   ` Pandey, Radhey Shyam
2026-07-14  7:22   ` sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260714072242.ACE7D1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=Frank.Li@kernel.org \
    --cc=dmaengine@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=srinivas.neeli@amd.com \
    --cc=vkoul@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox