From: sashiko-bot@kernel.org
To: "Allen Pais" <allen.lkml@gmail.com>
Cc: dmaengine@vger.kernel.org, vkoul@kernel.org, Frank.Li@kernel.org
Subject: Re: [PATCH v4 28/33] dmaengine: sf-pdma: route error callbacks through channel BH
Date: Tue, 10 Nov 2026 19:08:47 +0000 [thread overview]
Message-ID: <sashiko-outbox-207637@kernel.org> (raw)
In-Reply-To: <25d7826e0e6738356657f523e6f6cf3450e4b26c.1794315350.git.allen.lkml@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [High] dmaengine: sf-pdma: unlocked chan->desc read in
sf_pdma_errbh_tasklet()
- [Medium] dmaengine: sf-pdma: stale error tx_result on reused
descriptors
--
commit cbd0063b16af2f825d62b2888a259c514966e4ac
Author: Allen Pais <allen.lkml@gmail.com>
dmaengine: sf-pdma: route error callbacks through channel BH
This commit routes failed transfer completions in sf-pdma through
vchan_cookie_complete() with DMA_TRANS_ABORTED instead of invoking the
client callback directly from the error tasklet, and kills the driver
tasklets before killing the channel BH on removal.
> diff --git a/drivers/dma/sf-pdma/sf-pdma.c b/drivers/dma/sf-pdma/sf-pdma.c
> index ca60fb46ade00..992f9f1037028 100644
> --- a/drivers/dma/sf-pdma/sf-pdma.c
> +++ b/drivers/dma/sf-pdma/sf-pdma.c
> @@ -326,9 +326,21 @@ static void sf_pdma_errbh_tasklet(struct tasklet_struct *t)
>
> spin_lock_irqsave(&chan->lock, flags);
> if (chan->retries <= 0) {
> - /* fail to recover */
> + /* fail to recover: abort this descriptor and move on */
> + chan->retries = MAX_RETRY;
> + chan->xfer_err = false;
> spin_unlock_irqrestore(&chan->lock, flags);
> - dmaengine_desc_get_callback_invoke(desc->async_tx, NULL);
> +
> + spin_lock_irqsave(&chan->vchan.lock, flags);
> + list_del(&desc->vdesc.node);
[Severity: High]
Can this cause a use-after-free or NULL pointer dereference on desc?
sf_pdma_errbh_tasklet() reads desc = chan->desc at entry before acquiring
chan->vchan.lock, and neither sf_pdma_terminate_all() nor
sf_pdma_free_chan_resources() synchronizes with err_tasklet when freeing
chan->desc:
CPU0 CPU1
sf_pdma_errbh_tasklet()
desc = chan->desc;
sf_pdma_terminate_all()
spin_lock_irqsave(&chan->vchan.lock, ...)
kfree(chan->desc);
chan->desc = NULL;
spin_unlock_irqrestore(&chan->vchan.lock, ...)
...
spin_lock_irqsave(&chan->vchan.lock, ...)
list_del(&desc->vdesc.node); <-- use-after-free
vchan_cookie_complete(&desc->vdesc);
If sf_pdma_terminate_all() or sf_pdma_donebh_tasklet() clears or replaces
chan->desc before sf_pdma_errbh_tasklet() runs, desc can also be NULL or
already completed, corrupting the virt-dma descriptor lists. Re-reading
chan->desc under chan->vchan.lock and checking that it is non-NULL before
unlinking and completing it would avoid this.
> + desc->vdesc.tx_result.result = DMA_TRANS_ABORTED;
> + desc->vdesc.tx_result.residue = desc->xfer_size;
> + vchan_cookie_complete(&desc->vdesc);
[Severity: Medium]
Does a reusable descriptor (DMA_CTRL_REUSE) keep reporting
DMA_TRANS_ABORTED on later successful transfers after an abort?
sf_pdma_probe() sets pdma->dma_dev.descriptor_reuse = true, and
vchan_tx_prep() only initializes tx_result to DMA_TRANS_NOERROR and
residue 0 when the descriptor is first prepared. Once
sf_pdma_errbh_tasklet() overwrites desc->vdesc.tx_result here, neither
sf_pdma_xfer_desc() nor sf_pdma_donebh_tasklet() resets tx_result back to
DMA_TRANS_NOERROR with zero residue, so subsequent successful completions
of the reused descriptor will pass the stale error result and residue to
the client callback.
--
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1794315350.git.allen.lkml@gmail.com?part=28
next prev parent reply other threads:[~2026-11-10 19:08 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 13:13 [PATCH v4 00/33] dmaengine: migrate channel tasklets to WQ_BH Allen Pais
2026-11-10 13:13 ` [PATCH v4 01/33] dmaengine: add tasklet-backed channel BH helpers Allen Pais
2026-11-10 13:13 ` Allen Pais
2026-11-10 13:13 ` [PATCH v4 02/33] dmaengine: back channel BH helpers with WQ_BH Allen Pais
2026-11-10 14:15 ` sashiko-bot
2026-11-10 13:13 ` [PATCH v4 03/33] dmaengine: apple-admac: use dmaengine BH callback Allen Pais
2026-11-10 13:13 ` [PATCH v4 04/33] dmaengine: at_xdmac: move irq bottom half to dmaengine BH Allen Pais
2026-11-10 13:13 ` [PATCH v4 05/33] dmaengine: ep93xx: hook callbacks via " Allen Pais
2026-11-10 13:13 ` [PATCH v4 06/33] dmaengine: fsldma: migrate tasklet to " Allen Pais
2026-11-10 13:13 ` [PATCH v4 07/33] dmaengine: fsl_raid: run completions via " Allen Pais
2026-11-10 13:13 ` [PATCH v4 08/33] dmaengine: imx-dma: flip per-chan tasklet to " Allen Pais
2026-11-10 13:13 ` [PATCH v4 09/33] dmaengine: ioat: convert cleanup " Allen Pais
2026-11-10 13:13 ` [PATCH v4 10/33] dmaengine: mmp_pdma: replace per-chan tasklet with " Allen Pais
2026-11-10 13:13 ` [PATCH v4 11/33] dmaengine: mmp_tdma: hook completions to " Allen Pais
2026-11-10 13:13 ` [PATCH v4 12/33] dmaengine: mv_xor: convert irq tasklet " Allen Pais
2026-11-10 13:13 ` [PATCH v4 13/33] dmaengine: mxs-dma: use dmaengine BH scheduling Allen Pais
2026-11-10 13:13 ` [PATCH v4 14/33] dmaengine: nbpfaxi: switch callbacks to dmaengine BH Allen Pais
2026-11-10 13:13 ` [PATCH v4 15/33] dmaengine: pch_dma: convert tasklet " Allen Pais
2026-11-10 13:13 ` [PATCH v4 16/33] dmaengine: ppc4xx: replace irq tasklet with " Allen Pais
2026-11-10 13:13 ` [PATCH v4 17/33] dmaengine: ste_dma40: convert per-channel tasklet to " Allen Pais
2026-11-10 17:08 ` sashiko-bot
2026-11-10 13:13 ` [PATCH v4 18/33] dmaengine: xgene-dma: wire descriptor cleanup " Allen Pais
2026-11-10 13:13 ` [PATCH v4 19/33] dmaengine: xilinx-dma: use dmaengine BH instead of tasklets Allen Pais
2026-11-10 17:35 ` sashiko-bot
2026-11-10 13:13 ` [PATCH v4 20/33] dmaengine: xilinx-dpdma: kill vchan BH on remove Allen Pais
2026-11-10 13:13 ` [PATCH v4 21/33] dmaengine: zynqmp-dma: switch completion tasklet to dmaengine BH Allen Pais
2026-11-10 13:13 ` [PATCH v4 22/33] dmaengine: tegra20-apb: use channel BH helpers Allen Pais
2026-11-10 13:13 ` [PATCH v4 23/33] dmaengine: timb_dma: route callbacks via channel BH Allen Pais
2026-11-10 18:04 ` sashiko-bot
2026-11-10 13:13 ` [PATCH v4 24/33] dmaengine: txx9dmac: " Allen Pais
2026-11-10 13:13 ` [PATCH v4 25/33] dmaengine: mv_xor_v2: use channel BH helpers Allen Pais
2026-11-10 13:13 ` [PATCH v4 26/33] dmaengine: mpc512x: route callbacks via channel BH Allen Pais
2026-11-10 18:44 ` sashiko-bot
2026-11-10 13:13 ` [PATCH v4 27/33] dmaengine: plx_dma: use channel BH helpers Allen Pais
2026-11-10 13:13 ` [PATCH v4 28/33] dmaengine: sf-pdma: route error callbacks through channel BH Allen Pais
2026-11-10 13:13 ` Allen Pais
2026-11-10 19:08 ` sashiko-bot [this message]
2026-11-10 13:13 ` [PATCH v4 29/33] dmaengine: pl330: route callbacks via " Allen Pais
2026-11-10 13:13 ` [PATCH v4 30/33] dmaengine: altera-msgdma: use channel BH helpers Allen Pais
2026-11-11 2:39 ` NG, ADRIAN HO YIN
2026-11-10 13:13 ` [PATCH v4 31/33] dmaengine: hidma: defer callbacks via channel BH Allen Pais
2026-11-10 19:51 ` sashiko-bot
2026-11-10 13:13 ` [PATCH v4 32/33] dmaengine: qcom-gpi: defer callbacks via vchan Allen Pais
2026-11-10 13:13 ` [PATCH v4 33/33] dmaengine: switchtec: use channel BH helpers Allen Pais
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=sashiko-outbox-207637@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=Frank.Li@kernel.org \
--cc=allen.lkml@gmail.com \
--cc=dmaengine@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.