From: sashiko-bot@kernel.org
To: "Guangshuo Li" <lgs201920130244@gmail.com>
Cc: imx@lists.linux.dev, Frank.Li@kernel.org
Subject: Re: [PATCH] i2c: imx: disable autosuspend on remove
Date: Mon, 14 Sep 2026 09:27:47 +0000 [thread overview]
Message-ID: <20260914092748.6248F1F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260914091544.1667137-1-lgs201920130244@gmail.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
Pre-existing issues:
- [High] The shared interrupt handler accesses hardware registers without checking if the device is active, causing a potential system crash.
- [High] DMA channels are permanently leaked if `i2c_add_numbered_adapter()` fails during probe.
- [High] Race condition in `i2c_imx_unreg_slave()` allows `slave_timer` to be re-armed after cancellation, leading to a use-after-free.
--
commit 37a8cb58f3db8dddb256f2da1347377502c8b5b3
Author: Guangshuo Li <lgs201920130244@gmail.com>
Subject: i2c: imx: disable autosuspend on remove
This commit adds a missing pm_runtime_dont_use_autosuspend() call in the
remove path to properly clean up runtime PM state. This ensures that the
autosuspend flag is cleared when the driver is unbound.
> diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
> index 19ec056b00afe..4dc3df6a41a4f 100644
> --- a/drivers/i2c/busses/i2c-imx.c
> +++ b/drivers/i2c/busses/i2c-imx.c
> @@ -1920,6 +1920,7 @@ static void i2c_imx_remove(struct platform_device *pdev)
>
> pm_runtime_put_noidle(&pdev->dev);
> pm_runtime_disable(&pdev->dev);
> + pm_runtime_dont_use_autosuspend(&pdev->dev);
> }
>
> static int i2c_imx_runtime_suspend(struct device *dev)
[Severity: High]
This isn't a bug introduced by this patch, but does this runtime suspend
callback need to call synchronize_irq() before the clock is disabled?
Since the driver requests the IRQ with IRQF_SHARED, if another device on the
shared line triggers an interrupt while the I2C device is runtime suspended,
i2c_imx_isr() executes and reads the IMX_I2C_I2SR register:
drivers/i2c/busses/i2c-imx.c:i2c_imx_isr() {
[ ... ]
status = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR);
[ ... ]
}
Could this unconditional read of hardware registers while the controller's
clock is disabled potentially cause a fatal external abort?
[Severity: High]
This isn't a bug introduced by this patch, but is there a potential DMA
channel resource leak in the probe function?
In i2c_imx_probe(), i2c_imx_dma_request() successfully requests TX and RX DMA
channels. If the subsequent call to i2c_add_numbered_adapter() fails:
drivers/i2c/busses/i2c-imx.c:i2c_imx_probe() {
[ ... ]
ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
if (ret < 0)
goto clk_notifier_unregister;
[ ... ]
}
This jump appears to bypass calling i2c_imx_dma_free(). Does this leak the
channels permanently since they are not devm-managed?
[Severity: High]
This isn't a bug introduced by this patch, but is there a potential race
condition in i2c_imx_unreg_slave() that could lead to a use-after-free?
The function cancels the timer and clears the slave pointer without holding
the slave lock:
drivers/i2c/busses/i2c-imx.c:i2c_imx_unreg_slave() {
[ ... ]
hrtimer_cancel(&i2c_imx->slave_timer);
i2c_imx->slave = NULL;
[ ... ]
}
If a hardware interrupt executes concurrently between these operations, could
i2c_imx_isr() acquire the lock, see i2c_imx->slave as non-NULL, and invoke
i2c_imx_slave_handle() which restarts the timer via hrtimer_restart()? Since
the device is subsequently freed, would this leave a pending timer referencing
freed memory?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260914091544.1667137-1-lgs201920130244@gmail.com?part=1
next prev parent reply other threads:[~2026-09-14 9:27 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 9:15 [PATCH] i2c: imx: disable autosuspend on remove Guangshuo Li
2026-09-14 9:27 ` sashiko-bot [this message]
2026-09-14 14:02 ` Frank Li
2026-09-16 5:28 ` Andi Shyti
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=20260914092748.6248F1F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=Frank.Li@kernel.org \
--cc=imx@lists.linux.dev \
--cc=lgs201920130244@gmail.com \
--cc=sashiko-reviews@lists.linux.dev \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox