From: sashiko-bot@kernel.org
To: Frank.Li@oss.nxp.com
Cc: vkoul@kernel.org, dmaengine@vger.kernel.org,
linux-pci@vger.kernel.org, Frank.Li@kernel.org,
imx@lists.linux.dev
Subject: Re: [PATCH v6 07/10] dmaengine: dw-edma: Add non_ll_start() callback
Date: Fri, 10 Jul 2026 17:04:55 +0000 [thread overview]
Message-ID: <20260710170455.A9A311F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260710-edma_ll-v6-7-1471d278b73a@nxp.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] The DMA engine control callbacks (dw_edma_device_resume, dw_edma_device_pause, and dw_edma_device_terminate_all) modify channel state locklessly and perform unsafe virt-dma list operations without holding the required virtual channel lock.
--
--- Patch [7]: [PATCH v6 07/10] dmaengine: dw-edma: Add non_ll_start() callback ---
commit 659e1f56ed5af4e60c5ded05c2fdc117d6a334f9
Author: Frank Li <Frank.Li@nxp.com>
dmaengine: dw-edma: Add non_ll_start() callback
Add a non_ll_start() callback and move the common non-linked-list channel
handling into the EDMA core so it can be shared by both the EDMA and HDMA.
Prepare for the upcoming reorganization of the burst and chunk structures.
> diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-edma-core.h
> index bab4d49c92feb..e18d6e827c2c9 100644
> --- a/drivers/dma/dw-edma/dw-edma-core.h
> +++ b/drivers/dma/dw-edma/dw-edma-core.h
[ ... ]
> @@ -201,7 +202,16 @@ dw_edma_core_handle_int(struct dw_edma_irq *dw_irq, enum dw_edma_dir dir,
> static inline
> void dw_edma_core_start(struct dw_edma *dw, struct dw_edma_chunk *chunk, bool first)
> {
> - dw->core->start(chunk, first);
> + if (chunk->chan->non_ll) {
> + struct dw_edma_burst *child;
> +
> + child = list_first_entry_or_null(&chunk->burst->list,
> + struct dw_edma_burst, list);
> + if (child)
> + dw->core->non_ll_start(chunk->chan, child);
> + } else {
> + dw->core->start(chunk, first);
> + }
> }
[Severity: High]
This is a pre-existing issue, but while refactoring the start routines, are
there some missing virt-dma lock protections in the broader EDMA core?
For instance, in drivers/dma/dw-edma/dw-edma-core.c, dw_edma_device_resume()
seems to call dw_edma_start_transfer() without holding the virtual channel
lock:
drivers/dma/dw-edma/dw-edma-core.c:dw_edma_device_resume() {
...
chan->status = EDMA_ST_BUSY;
dw_edma_start_transfer(chan);
...
}
Because dw_edma_start_transfer() pops elements via vchan_next_desc(), could
this lead to list corruption on the virt-dma list when a client driver resumes
the engine?
Similarly, does dw_edma_device_pause() modify the channel request state
locklessly?
drivers/dma/dw-edma/dw-edma-core.c:dw_edma_device_pause() {
...
} else {
chan->request = EDMA_REQ_PAUSE;
}
...
}
Could this cause a data race with the interrupt handler
dw_edma_done_interrupt() which runs concurrently?
Finally, in dw_edma_device_terminate_all() the state is also updated
locklessly:
drivers/dma/dw-edma/dw-edma-core.c:dw_edma_device_terminate_all() {
...
} else {
chan->request = EDMA_REQ_STOP;
}
...
}
Does this fail to call vchan_get_all_descriptors() to clean up pending
virt-dma lists? Could this cause descriptors to leak or mistakenly execute
later?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260710-edma_ll-v6-0-1471d278b73a@nxp.com?part=7
next prev parent reply other threads:[~2026-07-10 17:04 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-10 16:47 [PATCH v6 00/10] dmaengine: dw-edma: flatten desc structions and simplify code Frank.Li
2026-07-10 16:47 ` [PATCH v6 01/10] dmaengine: dw-edma: Move control field update of DMA link to the last step Frank.Li
2026-07-10 16:57 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 02/10] dmaengine: dw-edma: Add xfer_sz field to struct dw_edma_chunk Frank.Li
2026-07-10 16:56 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 03/10] dmaengine: dw-edma: Move ll_region from struct dw_edma_chunk to struct dw_edma_chan Frank.Li
2026-07-10 17:05 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 04/10] dmaengine: dw-edma: Pass down dw_edma_chan to reduce one level of indirection Frank.Li
2026-07-10 16:56 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 05/10] dmaengine: dw-edma: Add helper dw_(edma|hdma)_v0_core_ch_enable() Frank.Li
2026-07-10 16:56 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 06/10] dmaengine: dw-edma: Add callbacks to fill link list entries Frank.Li
2026-07-10 16:59 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 07/10] dmaengine: dw-edma: Add non_ll_start() callback Frank.Li
2026-07-10 17:04 ` sashiko-bot [this message]
2026-07-10 16:47 ` [PATCH v6 08/10] dmaengine: dw-edma: Use common dw_edma_core_start() for both eDMA and HDMA Frank.Li
2026-07-10 17:03 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 09/10] dmaengine: dw-edma: Use burst array instead of linked list Frank.Li
2026-07-10 17:07 ` sashiko-bot
2026-07-10 16:47 ` [PATCH v6 10/10] dmaengine: dw-edma: Remove struct dw_edma_chunk Frank.Li
2026-07-10 17:08 ` sashiko-bot
2026-07-10 17:23 ` [PATCH v6 00/10] dmaengine: dw-edma: flatten desc structions and simplify code Verma, Devendra
2026-07-10 17:28 ` Verma, Devendra
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=20260710170455.A9A311F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=Frank.Li@kernel.org \
--cc=Frank.Li@oss.nxp.com \
--cc=dmaengine@vger.kernel.org \
--cc=imx@lists.linux.dev \
--cc=linux-pci@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.