All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Slavin Liu" <bolin.liu@seu.edu.cn>
Cc: vkoul@kernel.org, dmaengine@vger.kernel.org, imx@lists.linux.dev,
	Frank.Li@kernel.org
Subject: Re: [PATCH RFC] dmaengine: fsl-edma: check channel acquisition before use
Date: Fri, 11 Sep 2026 06:26:09 +0000	[thread overview]
Message-ID: <20260911062609.D49AE1F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260911060902.94153-1-bolin.liu@seu.edu.cn>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:

New issues:
- [High] Premature abortion of channel multiplexing search when channel acquisition fails.

Pre-existing issues:
- [High] Double-increment of device privatecnt causes a reference leak and lockless data race.
- [High] Acquired DMA channel is permanently leaked on error path in fsl_edma_xlate.
- [High] Channel state flags like `srcid` and `is_remote` are updated locklessly during resource free, racing with channel allocation logic.
- [High] Failure to verify the return value of `dma_pool_create()` leads to a latent NULL pointer dereference.
--

commit fd5b3c44a24930a11481b00458a1c4c8b54e5433
Author: Slavin Liu <bolin.liu@seu.edu.cn>

    dmaengine: fsl-edma: check channel acquisition before use
    
    dma_get_slave_channel() can return NULL when acquiring a channel fails,
    for example if fsl_edma_alloc_chan_resources() cannot request an IRQ.
    fsl_edma3_xlate() dereferences that return value to update privatecnt.

> diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c
> index d9fb717b5b53c..6934ac8826976 100644
> --- a/drivers/dma/fsl-edma-main.c
> +++ b/drivers/dma/fsl-edma-main.c
> @@ -326,13 +326,16 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec,
>  		if ((dma_spec->args[2] & FSL_EDMA_ODD_CH) && !(i & 0x1))
>  			continue;
>  
> +		chan = dma_get_slave_channel(chan);
> +		if (!chan)
> +			return NULL;

[Severity: High]
Does returning NULL here prematurely abort the channel multiplexing search?

If the first eligible channel fails dma_get_slave_channel() (e.g., due to an 
IRQ allocation error), returning NULL prevents the loop from checking other 
available channels. 

In multiplexed environments, should this use continue instead of return NULL to 
attempt acquiring the next available channel in the list?

> +
>  		fsl_chan->srcid = dma_spec->args[0];
>  		fsl_chan->priority = dma_spec->args[1];
>  		fsl_chan->is_rxchan = dma_spec->args[2] & FSL_EDMA_RX;
>  		fsl_chan->is_remote = dma_spec->args[2] & FSL_EDMA_REMOTE;
>  		fsl_chan->is_multi_fifo = dma_spec->args[2] & FSL_EDMA_MULTI_FIFO;
>  
> -		chan = dma_get_slave_channel(chan);
>  		chan->device->privatecnt++;

[Severity: High]
This is a pre-existing issue, but does this cause a reference leak and lockless
data race on the device privatecnt?

Since dma_get_slave_channel() safely increments privatecnt under 
dma_list_mutex, manually incrementing it again here without holding the lock 
appears redundant. This double-increment could permanently leak the private 
capability counter.

The same unprotected double-increment is also present in the legacy translation 
function fsl_edma_xlate().

[ ... ]

[Severity: High]
This is a pre-existing issue, but does fsl_edma_xlate() permanently leak the
acquired DMA channel on this error path?

drivers/dma/fsl-edma-main.c:fsl_edma_xlate() {
    ...
				if (!fsl_chan->srcid) {
					dev_err(&fsl_chan->pdev->dev, "Invalidate srcid %d\n",
						fsl_chan->srcid);
					return NULL;
				}
    ...
}

If a device tree specifies a 0 source ID, the function directly returns NULL
without unwinding and releasing the previously acquired dma_chan via
dma_release_channel().


[Severity: High]
This is a pre-existing issue, but do these lockless updates in 
fsl_edma_free_chan_resources() race with channel allocation logic?

drivers/dma/fsl-edma-common.c:fsl_edma_free_chan_resources() {
    ...
    fsl_chan->srcid = 0;
    fsl_chan->is_remote = false;
    ...
}

These shared state fields are updated without holding fsl_edma_mutex. If one 
device releases its DMA channel while another requests a channel for the same 
source ID, could fsl_edma3_xlate() observe a stale non-zero value? 

This could cause a spurious failure in fsl_edma_srcid_in_use():

drivers/dma/fsl-edma-main.c:fsl_edma_srcid_in_use() {
    ...
    if (fsl_chan->srcid && srcid == fsl_chan->srcid)
    ...
}


[Severity: High]
This is a pre-existing issue, but does fsl_edma_alloc_chan_resources() fail to 
verify the return value of dma_pool_create()?

drivers/dma/fsl-edma-common.c:fsl_edma_alloc_chan_resources() {
    ...
	fsl_chan->tcd_pool = dma_pool_create("tcd_pool", chan->device->dev,
				fsl_edma_drvflags(fsl_chan) & FSL_EDMA_DRV_TCD64 ?
				sizeof(struct fsl_edma_hw_tcd64) : sizeof(struct fsl_edma_hw_tcd),
				32, 0);

	if (fsl_chan->txirq)
    ...
}

If dma_pool_create() fails under memory pressure and returns NULL, the function
ignores the error and returns success to the DMA framework. 

Subsequent DMA transfer preparations would pass the NULL pool pointer to 
dma_pool_alloc(), causing a null pointer dereference when accessing the pool's 
internal spinlock.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260911060902.94153-1-bolin.liu@seu.edu.cn?part=1

  reply	other threads:[~2026-09-11  6:26 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-11  6:09 [PATCH RFC] dmaengine: fsl-edma: check channel acquisition before use Slavin Liu
2026-09-11  6:26 ` sashiko-bot [this message]
2026-09-11 14:56 ` Frank Li

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=20260911062609.D49AE1F00893@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=Frank.Li@kernel.org \
    --cc=bolin.liu@seu.edu.cn \
    --cc=dmaengine@vger.kernel.org \
    --cc=imx@lists.linux.dev \
    --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.