Re: [PATCH v2] i2c: mxs: fix DMA channel leak on probe error
Frank Li <[email protected]>
| Newsgroups | dev.linux.lists.imx,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-i2c,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <aoMvbNkUFZR8hzr5@SMW015318> |
On Sat, Aug 15, 2026 at 11:17:20PM +0800, Ruoyu Wang wrote:
> mxs_i2c_probe() requests an exclusive DMA channel before resetting the
> controller and registering the I2C adapter. If either later operation
> fails, probe returns without releasing the channel because the remove
> callback is not invoked after a failed probe.
>
> Use devm_dma_request_chan() so the device core releases the channel on
> probe failure and driver detach. Remove the manual release from the
> remove callback because the channel is now device-managed.
>
> This issue was found by a static analysis checker and confirmed by
> manual source review.
>
> Fixes: 62885f59a261 ("MXS: Implement DMA support into mxs-i2c")
> Assisted-by: unnamed:claude-opus-4.8 typestate
> Signed-off-by: Ruoyu Wang <[email protected]>
>
> ---
Reviewed-by: Frank Li <[email protected]>
> Changes in v2:
> - Use devm_dma_request_chan() instead of explicit error unwinding.
> - Remove the now-redundant manual release in remove().
> - Add the Assisted-by tag.
>
> v1: https://lore.kernel.org/r/[email protected]/
> ---
> drivers/i2c/busses/i2c-mxs.c | 5 +----
> 1 file changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c
> index 4e07babea9c3f4..eee4fdcd9df31a 100644
> --- a/drivers/i2c/busses/i2c-mxs.c
> +++ b/drivers/i2c/busses/i2c-mxs.c
> @@ -839,7 +839,7 @@ static int mxs_i2c_probe(struct platform_device *pdev)
> }
>
> /* Setup the DMA */
> - i2c->dmach = dma_request_chan(dev, "rx-tx");
> + i2c->dmach = devm_dma_request_chan(dev, "rx-tx");
> if (IS_ERR(i2c->dmach)) {
> return dev_err_probe(dev, PTR_ERR(i2c->dmach),
> "Failed to request dma\n");
> @@ -877,9 +877,6 @@ static void mxs_i2c_remove(struct platform_device *pdev)
>
> i2c_del_adapter(&i2c->adapter);
>
> - if (i2c->dmach)
> - dma_release_channel(i2c->dmach);
> -
> writel(MXS_I2C_CTRL0_SFTRST, i2c->regs + MXS_I2C_CTRL0_SET);
> }
>
> --
> 2.51.0
>
>