From: Frank Li <Frank.li@oss.nxp.com>
To: sashiko-reviews@lists.linux.dev
Cc: vkoul@kernel.org, linux-pci@vger.kernel.org,
dmaengine@vger.kernel.org, imx@lists.linux.dev,
Frank.Li@kernel.org
Subject: Re: [PATCH v7 01/10] dmaengine: dw-edma: Move control field update of DMA link to the last step
Date: Mon, 13 Jul 2026 13:22:33 -0500 [thread overview]
Message-ID: <alUs6X2OnZjzE4dF@SMW015318> (raw)
In-Reply-To: <20260713171252.03DA81F000E9@smtp.kernel.org>
On Mon, Jul 13, 2026 at 05:12:51PM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] Non-atomic update of the DMA descriptor trigger field (`control`) due to `__packed` struct layout and lack of `WRITE_ONCE()`, which undermines the safe concurrent DMA updates intended by the patch.
> --
>
> --- Patch [1]: [PATCH v7 01/10] dmaengine: dw-edma: Move control field update of DMA link to the last step ---
> commit bd1de63f1d8dc07b26abcdf63111eb18b82af133
> Author: Frank Li <Frank.Li@nxp.com>
>
> dmaengine: dw-edma: Move control field update of DMA link to the last step
>
> This patch reorders the initialization of the DMA link list entries to write
> the control field last, followed by a dma_wmb() barrier. This is intended
> to safely signal readiness to the hardware and prepare the driver for updating
> descriptors while the DMA is actively running.
>
> > diff --git a/drivers/dma/dw-edma/dw-edma-v0-core.c b/drivers/dma/dw-edma/dw-edma-v0-core.c
> > index cfdd6463252e6..ee5c3c317557b 100644
> > --- a/drivers/dma/dw-edma/dw-edma-v0-core.c
> > +++ b/drivers/dma/dw-edma/dw-edma-v0-core.c
> > @@ -284,17 +284,18 @@ static void dw_edma_v0_write_ll_data(struct dw_edma_chunk *chunk, int i,
> > if (chunk->chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) {
> > struct dw_edma_v0_lli *lli = chunk->ll_region.vaddr.mem + ofs;
> >
> > - lli->control = control;
> > lli->transfer_size = size;
> > lli->sar.reg = sar;
> > lli->dar.reg = dar;
> > + dma_wmb();
> > + lli->control = control;
>
> [Severity: Medium]
> Will this assignment safely guarantee an atomic update for the hardware?
>
> Since struct dw_edma_v0_lli is defined as __packed, the compiler might emit
> byte-wise stores or tear the write instead of doing a single 32-bit store.
> Without WRITE_ONCE(), the compiler could also potentially reorder or split
> the store.
This problem is not existing because each field is 32bit aligned.
Frank
>
> If the goal is to safely update descriptors while the DMA is running, does
> this need to use WRITE_ONCE() (along with ensuring proper alignment) so the
> hardware doesn't observe a partially updated control field?
>
> > } else {
> > struct dw_edma_v0_lli __iomem *lli = chunk->ll_region.vaddr.io + ofs;
> >
> > - writel(control, &lli->control);
> > writel(size, &lli->transfer_size);
> > writeq(sar, &lli->sar.reg);
> > writeq(dar, &lli->dar.reg);
> > + writel(control, &lli->control);
> > }
> > }
>
> [ ... ]
>
> > @@ -306,13 +307,14 @@ static void dw_edma_v0_write_ll_link(struct dw_edma_chunk *chunk,
> > if (chunk->chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) {
> > struct dw_edma_v0_llp *llp = chunk->ll_region.vaddr.mem + ofs;
> >
> > - llp->control = control;
> > llp->llp.reg = pointer;
> > + dma_wmb();
> > + llp->control = control;
>
> [Severity: Medium]
> Would this also need WRITE_ONCE() since struct dw_edma_v0_llp is a __packed
> struct?
>
> [ ... ]
>
> > diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw-hdma-v0-core.c
> > index 632abb8b481cf..1201f1ab5f359 100644
> > --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c
> > +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c
> > @@ -160,17 +160,18 @@ static void dw_hdma_v0_write_ll_data(struct dw_edma_chunk *chunk, int i,
> > if (chunk->chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) {
> > struct dw_hdma_v0_lli *lli = chunk->ll_region.vaddr.mem + ofs;
> >
> > - lli->control = control;
> > lli->transfer_size = size;
> > lli->sar.reg = sar;
> > lli->dar.reg = dar;
> > + dma_wmb();
> > + lli->control = control;
>
> [Severity: Medium]
> Similar to the v0_lli struct above, dw_hdma_v0_lli is also __packed. Could this
> store tear and cause the DMA hardware to observe an incomplete control field?
>
> > } else {
> > struct dw_hdma_v0_lli __iomem *lli = chunk->ll_region.vaddr.io + ofs;
> >
> > - writel(control, &lli->control);
> > writel(size, &lli->transfer_size);
> > writeq(sar, &lli->sar.reg);
> > writeq(dar, &lli->dar.reg);
> > + writel(control, &lli->control);
> > }
> > }
>
> [ ... ]
>
> > @@ -182,13 +183,14 @@ static void dw_hdma_v0_write_ll_link(struct dw_edma_chunk *chunk,
> > if (chunk->chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) {
> > struct dw_hdma_v0_llp *llp = chunk->ll_region.vaddr.mem + ofs;
> >
> > - llp->control = control;
> > llp->llp.reg = pointer;
> > + dma_wmb();
> > + llp->control = control;
>
> [Severity: Medium]
> Could this assignment to the __packed dw_hdma_v0_llp struct tear as well?
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260713-edma_ll-v7-0-6fb7498c901e@nxp.com?part=1
next prev parent reply other threads:[~2026-07-13 18:22 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 17:03 [PATCH v7 00/10] dmaengine: dw-edma: flatten desc structions and simplify code Frank.Li
2026-07-13 17:03 ` [PATCH v7 01/10] dmaengine: dw-edma: Move control field update of DMA link to the last step Frank.Li
2026-07-13 17:12 ` sashiko-bot
2026-07-13 18:22 ` Frank Li [this message]
2026-07-13 17:03 ` [PATCH v7 02/10] dmaengine: dw-edma: Add xfer_sz field to struct dw_edma_chunk Frank.Li
2026-07-13 17:17 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 03/10] dmaengine: dw-edma: Move ll_region from struct dw_edma_chunk to struct dw_edma_chan Frank.Li
2026-07-13 17:11 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 04/10] dmaengine: dw-edma: Pass down dw_edma_chan to reduce one level of indirection Frank.Li
2026-07-13 17:10 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 05/10] dmaengine: dw-edma: Add helper dw_(edma|hdma)_v0_core_ch_enable() Frank.Li
2026-07-13 17:09 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 06/10] dmaengine: dw-edma: Add callbacks to fill link list entries Frank.Li
2026-07-13 17:10 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 07/10] dmaengine: dw-edma: Add non_ll_start() callback Frank.Li
2026-07-13 17:21 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 08/10] dmaengine: dw-edma: Use common dw_edma_core_start() for both eDMA and HDMA Frank.Li
2026-07-13 17:21 ` sashiko-bot
2026-07-13 17:03 ` [PATCH v7 09/10] dmaengine: dw-edma: Use burst array instead of linked list Frank.Li
2026-07-13 17:25 ` sashiko-bot
2026-07-13 18:27 ` Frank Li
2026-07-13 17:03 ` [PATCH v7 10/10] dmaengine: dw-edma: Remove struct dw_edma_chunk Frank.Li
2026-07-13 17:22 ` sashiko-bot
2026-07-13 18:34 ` Frank Li
2026-07-14 12:36 ` [PATCH v7 00/10] dmaengine: dw-edma: flatten desc structions and simplify code Vinod Koul
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=alUs6X2OnZjzE4dF@SMW015318 \
--to=frank.li@oss.nxp.com \
--cc=Frank.Li@kernel.org \
--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.