From: sashiko-bot@kernel.org
To: "Nathan Lynch" <nathan.lynch@amd.com>
Cc: Frank.Li@kernel.org, dmaengine@vger.kernel.org, vkoul@kernel.org
Subject: Re: [PATCH 3/4] dmaengine: dmatest: Terminate channel before freeing threads
Date: Wed, 22 Jul 2026 16:23:12 +0000 [thread overview]
Message-ID: <20260722162313.1CFE51F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260722-dmatest-fixes-and-fatal-errors-v1-3-8287709987ea@amd.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [High] Spurious WARN_ON due to racing callback execution and thread shutdown.
Pre-existing issues:
- [High] Incomplete fix leaves Use-After-Free for drivers lacking terminate_all support.
--
--- Patch [3]: [PATCH 3/4] dmaengine: dmatest: Terminate channel before freeing threads ---
commit 45380ad31d07f2d946845ad6c99217e3ae5ea8ae
Author: Nathan Lynch <nathan.lynch@amd.com>
dmaengine: dmatest: Terminate channel before freeing threads
This commit modifies dmatest_cleanup_channel() to stop all threads first,
flush the channel, and only then free the thread memory. This prevents
pending callbacks from accessing freed memory.
> diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
> index 3267c7e86f5d5..0d7752c2451a9 100644
> --- a/drivers/dma/dmatest.c
> +++ b/drivers/dma/dmatest.c
> @@ -959,18 +959,23 @@ static void dmatest_cleanup_channel(struct dmatest_chan *dtc)
> struct dmatest_thread *_thread;
> int ret;
>
> - list_for_each_entry_safe(thread, _thread, &dtc->threads, node) {
> + /* stop all threads first */
> + list_for_each_entry(thread, &dtc->threads, node) {
> ret = kthread_stop(thread->task);
> pr_debug("thread %s exited with status %d\n",
> thread->task->comm, ret);
> + }
> +
> + /* flush the channel (e.g. vchan_synchronize() -> tasklet_kill()) */
> + dmaengine_terminate_sync(dtc->chan);
[Severity: High]
Could this trigger a spurious WARN_ON when flushing pending callbacks?
When a test is stopped, kthread_stop() runs, and dmatest_func() sets
thread->done to true before exiting.
dmatest_cleanup_channel() then calls dmaengine_terminate_sync() which flushes
any pending callbacks.
Since thread->done is already true, will the pending dmatest_callback() read
it and incorrectly fall into the warning path?
drivers/dma/dmatest.c:dmatest_callback() {
...
} else {
/* ... */
WARN(1, "dmatest: Kernel memory may be corrupted!!\n");
}
}
[Severity: High]
This is a pre-existing issue, but does ignoring the return value of
dmaengine_terminate_sync() leave a use-after-free risk for drivers that lack
terminate_all support?
If a driver doesn't support device_terminate_all, dmaengine_terminate_sync()
returns -EINVAL and skips dmaengine_synchronize():
include/linux/dmaengine.h:dmaengine_terminate_sync() {
...
ret = dmaengine_terminate_async(chan);
if (ret)
return ret;
dmaengine_synchronize(chan);
return 0;
}
If synchronization is skipped, couldn't the hardware transfer still finish
and fire the tasklet after we proceed to kfree(thread) below, causing
dmatest_callback() to access freed memory?
> +
> + /* now it is safe to free the thread memory */
> + list_for_each_entry_safe(thread, _thread, &dtc->threads, node) {
> list_del(&thread->node);
> put_task_struct(thread->task);
> kfree(thread);
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260722-dmatest-fixes-and-fatal-errors-v1-0-8287709987ea@amd.com?part=3
next prev parent reply other threads:[~2026-07-22 16:23 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-22 15:47 [PATCH 0/4] dmatest: shared channel fixes and fatal errors option Nathan Lynch via B4 Relay
2026-07-22 15:47 ` Nathan Lynch
2026-07-22 15:47 ` [PATCH 1/4] dmaengine: dmatest: Don't forcibly terminate channel in polled mode Nathan Lynch via B4 Relay
2026-07-22 15:47 ` Nathan Lynch
2026-07-22 15:57 ` sashiko-bot
2026-07-22 15:47 ` [PATCH 2/4] dmaengine: dmatest: Suppress bogus failures when stopping a run Nathan Lynch via B4 Relay
2026-07-22 15:47 ` Nathan Lynch
2026-07-22 16:09 ` sashiko-bot
2026-07-22 15:47 ` [PATCH 3/4] dmaengine: dmatest: Terminate channel before freeing threads Nathan Lynch via B4 Relay
2026-07-22 15:47 ` Nathan Lynch
2026-07-22 16:23 ` sashiko-bot [this message]
2026-07-22 15:47 ` [PATCH 4/4] dmaengine: dmatest: Optionally make test errors fatal Nathan Lynch via B4 Relay
2026-07-22 15:47 ` Nathan Lynch
2026-07-22 16:33 ` sashiko-bot
2026-07-22 19:58 ` Tycho Andersen
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=20260722162313.1CFE51F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=Frank.Li@kernel.org \
--cc=dmaengine@vger.kernel.org \
--cc=nathan.lynch@amd.com \
--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.