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 17/33] dmaengine: ste_dma40: convert per-channel tasklet to dmaengine BH
Date: Tue, 10 Nov 2026 17:08:14 +0000 [thread overview]
Message-ID: <sashiko-outbox-207449@kernel.org> (raw)
In-Reply-To: <33ed46c14f6be61dd5c839b3b307512749e0d067.1794315350.git.allen.lkml@gmail.com>
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] dmaengine: ste_dma40: incomplete BH teardown in d40_kill_bh()
on self-requeue
--
commit 04d3037c70d29e8460f8499e686daa8b7686fd6c
Author: Allen Pais <allen.lkml@gmail.com>
dmaengine: ste_dma40: convert per-channel tasklet to dmaengine BH
This commit replaces the per-channel tasklet in ste_dma40 with the shared
dmaengine bottom-half helper.
> diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c
> index 8b89d44f9b0d3..a06008d8dd275 100644
> --- a/drivers/dma/ste_dma40.c
> +++ b/drivers/dma/ste_dma40.c
[ ... ]
> @@ -1730,13 +1727,13 @@ static void dma_tc_handle(struct d40_chan *d40c)
> }
>
> d40c->pending_tx += callbacks;
> - tasklet_schedule(&d40c->tasklet);
> + dmaengine_schedule_bh(&d40c->chan);
>
> }
>
> -static void dma_tasklet(struct tasklet_struct *t)
> +static void dma_tasklet(struct dma_chan *chan)
> {
> - struct d40_chan *d40c = from_tasklet(d40c, t, tasklet);
> + struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
> struct d40_desc *d40d;
> unsigned long flags;
> bool callback_active;
> @@ -1786,7 +1783,7 @@ static void dma_tasklet(struct tasklet_struct *t)
> d40c->pending_tx--;
>
> if (d40c->pending_tx)
> - tasklet_schedule(&d40c->tasklet);
> + dmaengine_schedule_bh(&d40c->chan);
>
> spin_unlock_irqrestore(&d40c->lock, flags);
>
> @@ -3076,14 +3073,14 @@ static void __init d40_chan_init(struct d40_base *base, struct dma_device *dma,
> INIT_LIST_HEAD(&d40c->client);
> INIT_LIST_HEAD(&d40c->prepare_queue);
>
> - tasklet_setup(&d40c->tasklet, dma_tasklet);
> + dmaengine_init_bh(&d40c->chan, dma_tasklet);
>
> list_add_tail(&d40c->chan.device_node,
> &dma->channels);
> }
> }
>
> -static void d40_kill_tasklets(void *data)
> +static void d40_kill_bh(void *data)
> {
> struct dma_device *dma = data;
> struct d40_chan *d40c;
> @@ -3091,7 +3088,7 @@ static void d40_kill_tasklets(void *data)
>
> list_for_each_entry(chan, &dma->channels, device_node) {
> d40c = container_of(chan, struct d40_chan, chan);
> - tasklet_kill(&d40c->tasklet);
> + dmaengine_kill_bh(&d40c->chan);
> }
> }
[Severity: Medium]
Can d40_kill_bh() return while d40c->chan.bh_work is still queued if
dma_tasklet() re-schedules itself?
dma_tasklet() processes a single transfer per invocation and calls
dmaengine_schedule_bh(&d40c->chan) when d40c->pending_tx remains non-zero
(for instance, after multiple elapsed cyclic periods in dma_tc_handle()).
Previously, tasklet_kill() held TASKLET_STATE_SCHED while waiting for
TASKLET_STATE_RUN to clear, preventing dma_tasklet() from re-scheduling
itself during teardown.
dmaengine_kill_bh() calls dmaengine_flush_bh_work(), which only runs
flush_work(&chan->bh_work). Because process_one_work() clears
WORK_STRUCT_PENDING_BIT before invoking dma_tasklet(), a self-requeue in
dma_tasklet() queues chan->bh_work behind the flush barrier:
CPU0 CPU1 (dmaengine_bh_wq)
d40_kill_bh()
dmaengine_kill_bh(&d40c->chan)
flush_work(&chan->bh_work)
process_one_work()
dma_tasklet()
d40c->pending_tx--;
if (d40c->pending_tx)
dmaengine_schedule_bh(...)
/* flush barrier completes */
destroy_cache() / devres release
process_one_work()
dma_tasklet() <-- use-after-free
When d40_kill_bh() runs during probe unwind, d40c->chan.bh_work can
execute after base->desc_slab, base->lcla_pool, and base have been freed,
causing a use-after-free. Using disable_work_sync() or cancel_work_sync()
in dmaengine_kill_bh(), or draining all pending transfers inside
dma_tasklet() instead of re-scheduling, would avoid leaving bh_work queued
after teardown.
--
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1794315350.git.allen.lkml@gmail.com?part=17
next prev parent reply other threads:[~2026-11-10 17: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 [this message]
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
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-207449@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.