From: sashiko-bot@kernel.org
To: "Allen Pais" <allen.lkml@gmail.com>
Cc: dmaengine@vger.kernel.org, Frank.Li@kernel.org, vkoul@kernel.org
Subject: Re: [PATCH v2 62/64] dmaengine: hidma: defer callbacks via channel BH
Date: Mon, 27 Jul 2026 21:25:43 +0000 [thread overview]
Message-ID: <20260727212544.1BC011F000E9@smtp.kernel.org> (raw)
In-Reply-To: <1648cb3a6b6c85009831e1dd263a6336bd31638a.1785183549.git.allen.lkml@gmail.com>
Thank you for your contribution! Sashiko AI review found 6 potential issue(s) to consider:
New issues:
- [Critical] The per-channel bottom-half (BH) is cancelled too late during driver unbind, allowing it to execute after the hardware context is destroyed and dereference a NULL pointer.
- [High] Missing synchronization and cancellation of BH during channel termination leads to use-after-free and memory leaks.
Pre-existing issues:
- [Critical] List manipulation without holding the channel lock in `hidma_terminate_channel` causes list corruption and data races.
- [High] Sleeping function called in atomic context and unsafe PM hardware access.
- [High] Unbalanced pm_runtime usage counter causing premature device suspension.
- [High] Invalid pointer dereference due to missing list emptiness check in `hidma_callback`.
--
--- Patch [62]: [PATCH v2 62/64] dmaengine: hidma: defer callbacks via channel BH ---
commit 3c9c3e0127e064313b46165b6ad21a91d6575ed1
Author: Allen Pais <allen.lkml@gmail.com>
Subject: dmaengine: hidma: defer callbacks via channel BH
Move descriptor callback processing out of the low-level completion
path and schedule it through per-channel BH work. Drain that work while
freeing channels so callbacks cannot outlive channel storage.
> diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c
> index c939635be21d2..1f875a499ab3f 100644
> --- a/drivers/dma/qcom/hidma.c
> +++ b/drivers/dma/qcom/hidma.c
> @@ -90,7 +90,13 @@ static inline struct hidma_chan *to_hidma_chan(struct dma_chan *dmach)
>
> static void hidma_free(struct hidma_dev *dmadev)
> {
> - INIT_LIST_HEAD(&dmadev->ddev.channels);
> + struct hidma_chan *mchan, *next;
> +
> + list_for_each_entry_safe(mchan, next, &dmadev->ddev.channels,
> + chan.device_node) {
> + dma_chan_kill_bh(&mchan->chan);
[Severity: Critical]
Does flushing the bottom half here happen too late in the teardown sequence?
During driver unbind, hidma_remove() calls hidma_ll_uninit() before
hidma_free().
hidma_ll_uninit() explicitly sets lldev->trepool = NULL. When hidma_free()
then calls dma_chan_kill_bh(), it synchronously flushes the pending bottom
half:
hidma_chan_bh()
hidma_process_completed()
hidma_ll_status()
tre = &lldev->trepool[tre_ch];
Since trepool is already NULL, won't this cause a deterministic NULL pointer
dereference?
> + list_del(&mchan->chan.device_node);
> + }
> }
>
> static unsigned int nr_desc_prm;
[ ... ]
> @@ -155,6 +161,13 @@ static void hidma_process_completed(struct hidma_chan *mchan)
> }
> }
>
> +static void hidma_chan_bh(struct dma_chan *chan)
> +{
> + struct hidma_chan *mchan = to_hidma_chan(chan);
> +
> + hidma_process_completed(mchan);
> +}
> +
[Severity: High]
Does the bottom half work need to be cancelled when a client terminates the
channel?
When a client calls dma_release_channel() or dmaengine_terminate_sync(), the
framework eventually calls hidma_free_chan_resources(), which frees the
descriptors.
If the bottom half executes concurrently or after this teardown:
hidma_chan_bh()
hidma_process_completed()
list_for_each_entry_safe(mdesc, next, &list, node) {
dmaengine_desc_callback_invoke(&cb, &result);
}
Won't it dereference descriptors that were just freed, causing a use-after-free,
and subsequently leak orphaned descriptors onto mchan->free?
> /*
> * Called once for each submitted descriptor.
> * PM is locked once for each descriptor that is currently
> @@ -181,7 +194,7 @@ static void hidma_callback(void *data)
> }
> spin_unlock_irqrestore(&mchan->lock, irqflags);
[Severity: Critical]
This is a pre-existing issue, but does hidma_terminate_channel() safely
handle concurrent callbacks?
In hidma_terminate_channel(), the lock is dropped before the hardware is
paused:
hidma_terminate_channel()
spin_unlock_irqrestore(&mchan->lock, irqflags);
rc = hidma_ll_disable(dmadev->lldev);
During this window, a completed transaction can trigger hidma_callback()
which modifies the list without holding a lock on the local list:
hidma_callback()
if (mdesc->node.next) {
list_move_tail(&mdesc->node, &mchan->completed);
}
Since hidma_terminate_channel() subsequently modifies the same list
locklessly, can this race with hidma_prep_dma_memcpy() and cause severe
list corruption?
[Severity: High]
This is a pre-existing issue, but does hidma_callback() correctly handle an
empty active list?
When updating the running descriptor, the code uses list_first_entry():
hidma_callback()
mchan->running = list_first_entry(&mchan->active,
struct hidma_desc, node);
If mchan->active is empty, list_first_entry() does not return NULL but
rather an invalid pointer computed from the list head itself.
If hidma_tx_status() is subsequently called, won't it dereference this
invalid pointer via mchan->running->desc.cookie and cause an out-of-bounds
memory read?
> - hidma_process_completed(mchan);
> + dma_chan_schedule_bh(&mchan->chan);
>
> if (queued) {
> pm_runtime_mark_last_busy(dmadev->ddev.dev);
> pm_runtime_put_autosuspend(dmadev->ddev.dev);
[Severity: High]
This isn't a bug introduced by this patch, but is the pm_runtime usage
counter decrement balanced with the increment?
In hidma_issue_pending(), pm_runtime_get() is called only once per
submitted batch of descriptors.
However, the hardware triggers hidma_callback() for each individual
descriptor, and pm_runtime_put_autosuspend() is unconditionally called here
for every single descriptor.
If a client submits a batch of multiple descriptors, won't this underflow
the PM usage count and trigger device auto-suspension while hardware
operations are still in flight?
[Severity: High]
This is a pre-existing issue, but does the tasklet safely call sleeping PM
functions?
The driver implements hidma_issue_task() as a tasklet, which runs in
softirq (atomic) context, but it calls pm_runtime_get_sync():
hidma_issue_task()
pm_runtime_get_sync(dmadev->ddev.dev);
Since pm_runtime_get_sync() will sleep if the device is suspended, doesn't
this trigger a sleeping in atomic bug?
Furthermore, in hidma_issue_pending(), if the asynchronous pm_runtime_get()
returns 0, the code falls through and immediately calls hidma_ll_start().
Doesn't this access hardware registers while the device is still unclocked
or powered off?
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1785183549.git.allen.lkml@gmail.com?part=62
next prev parent reply other threads:[~2026-07-27 21:25 UTC|newest]
Thread overview: 142+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-08 8:03 [RFC PATCH 0/1] dmaengine: introduce dmaengine_bh_wq and bh helpers Allen Pais
2026-01-08 8:03 ` [RFC PATCH 1/1] " Allen Pais
2026-01-08 10:26 ` Arnd Bergmann
2026-01-08 19:22 ` Allen
2026-01-09 16:42 ` Arnd Bergmann
2026-01-12 22:20 ` Allen
2026-01-13 7:33 ` Arnd Bergmann
2026-01-13 19:31 ` Allen
2026-01-12 6:26 ` kernel test robot
2026-01-14 7:13 ` kernel test robot
2026-01-14 7:35 ` kernel test robot
2026-01-14 8:49 ` kernel test robot
2026-07-27 20:28 ` [PATCH v2 00/64] dmaengine: migrate channel tasklets to WQ_BH Allen Pais
2026-07-27 20:28 ` [PATCH v2 01/64] dmaengine: add tasklet-backed channel BH helpers Allen Pais
2026-07-27 20:56 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 02/64] dmaengine: back channel BH helpers with WQ_BH Allen Pais
2026-07-27 20:28 ` [PATCH v2 03/64] dmaengine: apple-admac: use dma_chan BH callback Allen Pais
2026-07-27 20:28 ` [PATCH v2 04/64] dmaengine: at_xdmac: move irq bottom half to dma_chan BH Allen Pais
2026-07-27 20:56 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 05/64] dmaengine: ep93xx: hook callbacks via " Allen Pais
2026-07-27 20:59 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 06/64] dmaengine: fsldma: migrate tasklet to " Allen Pais
2026-07-27 20:56 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 07/64] dmaengine: fsl_raid: run completions via " Allen Pais
2026-07-27 20:55 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 08/64] dmaengine: imx-dma: flip per-chan tasklet to " Allen Pais
2026-07-27 20:57 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 09/64] dmaengine: ioat: convert cleanup " Allen Pais
2026-07-27 20:38 ` Dave Jiang
2026-07-27 21:02 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 10/64] dmaengine: mmp_pdma: replace per-chan tasklet with " Allen Pais
2026-07-27 20:54 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 11/64] dmaengine: mmp_tdma: hook completions to " Allen Pais
2026-07-27 20:55 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 12/64] dmaengine: mv_xor: convert irq tasklet " Allen Pais
2026-07-27 20:57 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 13/64] dmaengine: mxs-dma: use dma_chan BH scheduling Allen Pais
2026-07-27 20:59 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 14/64] dmaengine: nbpfaxi: switch callbacks to dma_chan BH Allen Pais
2026-07-27 20:28 ` [PATCH v2 15/64] dmaengine: pch_dma: convert tasklet " Allen Pais
2026-07-27 20:57 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 16/64] dmaengine: ppc4xx: replace irq tasklet with " Allen Pais
2026-07-27 20:54 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 17/64] dmaengine: ste_dma40: convert per-channel tasklet to " Allen Pais
2026-07-27 21:00 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 18/64] dmaengine: xgene-dma: wire descriptor cleanup " Allen Pais
2026-07-27 20:59 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 19/64] dmaengine: xilinx-dma: use dma_chan BH instead of tasklets Allen Pais
2026-07-27 20:59 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 20/64] dmaengine: xilinx-dpdma: kill vchan BH on remove Allen Pais
2026-07-27 20:59 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 21/64] dmaengine: zynqmp-dma: switch completion tasklet to dma_chan BH Allen Pais
2026-07-27 20:54 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 22/64] dmaengine: tegra20-apb: use channel BH helpers Allen Pais
2026-07-27 20:28 ` [PATCH v2 23/64] dmaengine: timb_dma: route callbacks via channel BH Allen Pais
2026-07-27 21:09 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 24/64] dmaengine: txx9dmac: " Allen Pais
2026-07-27 21:00 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 25/64] dmaengine: mv_xor_v2: use channel BH helpers Allen Pais
2026-07-27 21:02 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 26/64] dmaengine: mpc512x: route callbacks via channel BH Allen Pais
2026-07-27 21:07 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 27/64] dmaengine: k3dma: kill vchan BH on remove Allen Pais
2026-07-27 21:02 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 28/64] dmaengine: plx_dma: use channel BH helpers Allen Pais
2026-07-27 20:38 ` Logan Gunthorpe
2026-07-27 21:09 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 29/64] dmaengine: sf-pdma: route error callbacks through channel BH Allen Pais
2026-07-27 20:28 ` Allen Pais
2026-07-27 21:06 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 30/64] dmaengine: sa11x0-dma: kill vchan BH on remove Allen Pais
2026-07-27 21:07 ` sashiko-bot
2026-07-27 20:28 ` [PATCH v2 31/64] dmaengine: pl330: route callbacks via channel BH Allen Pais
2026-07-27 20:34 ` Allen Pais
2026-07-27 21:07 ` sashiko-bot
2026-07-27 20:34 ` [PATCH v2 32/64] dmaengine: k3-udma: use channel BH for vchan completions Allen Pais
2026-07-27 21:10 ` sashiko-bot
2026-07-27 20:36 ` [PATCH v2 33/64] dmaengine: sun6i: kill vchan BH on teardown Allen Pais
2026-07-27 21:08 ` sashiko-bot
2026-07-27 20:37 ` [PATCH v2 34/64] dmaengine: mtk-cqdma: " Allen Pais
2026-07-27 21:09 ` sashiko-bot
2026-07-27 20:38 ` [PATCH v2 35/64] dmaengine: altera-msgdma: use channel BH helpers Allen Pais
2026-07-27 21:06 ` sashiko-bot
2026-07-27 20:38 ` [PATCH v2 36/64] dmaengine: sprd-dma: kill vchan BH on teardown Allen Pais
2026-07-27 21:07 ` sashiko-bot
2026-07-27 20:38 ` [PATCH v2 37/64] dmaengine: idma64: " Allen Pais
2026-07-27 21:07 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 38/64] dmaengine: img-mdc-dma: " Allen Pais
2026-07-27 21:09 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 39/64] dmaengine: fsl-edma-common: " Allen Pais
2026-07-27 21:14 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 40/64] dmaengine: dw-axi-dmac: " Allen Pais
2026-07-27 21:11 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 41/64] dmaengine: hsu: " Allen Pais
2026-07-27 21:10 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 42/64] dmaengine: jz4780: " Allen Pais
2026-07-27 21:09 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 43/64] dmaengine: pxa_dma: " Allen Pais
2026-07-27 21:10 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 44/64] dmaengine: mtk-hsdma: " Allen Pais
2026-07-27 21:09 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 45/64] dmaengine: mtk-uart-apdma: " Allen Pais
2026-07-27 21:14 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 46/64] dmaengine: imx-sdma: " Allen Pais
2026-07-27 21:17 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 47/64] dmaengine: loongson1-apb: " Allen Pais
2026-07-27 21:17 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 48/64] dmaengine: owl-dma: " Allen Pais
2026-07-27 21:17 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 49/64] dmaengine: hisi: " Allen Pais
2026-07-27 21:20 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 50/64] dmaengine: dw-edma: " Allen Pais
2026-07-27 21:18 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 51/64] dmaengine: bcm2835: " Allen Pais
2026-07-27 21:20 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 52/64] dmaengine: tegra210-adma: " Allen Pais
2026-07-27 21:17 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 53/64] dmaengine: fsl-qdma: use dma_chan_kill_bh Allen Pais
2026-07-27 21:17 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 54/64] dmaengine: st_fdma: " Allen Pais
2026-07-27 21:18 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 55/64] dmaengine: dma-axi-dmac: " Allen Pais
2026-07-27 21:18 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 56/64] dmaengine: omap-dma: " Allen Pais
2026-07-27 21:25 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 57/64] dmaengine: edma: " Allen Pais
2026-07-27 21:20 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 58/64] dmaengine: qcom-adm: " Allen Pais
2026-07-27 21:17 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 59/64] dmaengine: tegra186-gpc: " Allen Pais
2026-07-27 21:23 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 60/64] dmaengine: bam-dma: " Allen Pais
2026-07-27 21:19 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 61/64] dmaengine: dw: defer callbacks via channel BH Allen Pais
2026-07-27 21:31 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 62/64] dmaengine: hidma: " Allen Pais
2026-07-27 21:25 ` sashiko-bot [this message]
2026-07-27 20:39 ` [PATCH v2 63/64] dmaengine: qcom-gpi: defer callbacks via vchan Allen Pais
2026-07-27 21:24 ` sashiko-bot
2026-07-27 20:39 ` [PATCH v2 64/64] dmaengine: switchtec: use channel BH helpers Allen Pais
2026-07-27 21:08 ` Logan Gunthorpe
2026-07-27 21: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=20260727212544.1BC011F000E9@smtp.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.