2021-04-08 11:07:41

by Ye Weihua

[permalink] [raw]
Subject: [PATCH -next] i2c: imx: Fix PM reference leak in i2c_imx_reg_slave()

The PM reference count is not expected to be incremented on return in
these functions.

However, pm_runtime_get_sync() will increment the PM reference count
even on failure. forgetting to put the reference again will result in
a leak.

Replace it with pm_runtime_resume_and_get() to keep the usage counter
balanced.

Reported-by: Hulk Robot <[email protected]>
Signed-off-by: Ye Weihua <[email protected]>
---
drivers/i2c/busses/i2c-imx.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index b80fdc1f0092..dc5ca71906db 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -801,7 +801,7 @@ static int i2c_imx_reg_slave(struct i2c_client *client)
i2c_imx->last_slave_event = I2C_SLAVE_STOP;

/* Resume */
- ret = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
+ ret = pm_runtime_resume_and_get(i2c_imx->adapter.dev.parent);
if (ret < 0) {
dev_err(&i2c_imx->adapter.dev, "failed to resume i2c controller");
return ret;
@@ -1253,7 +1253,7 @@ static int i2c_imx_xfer(struct i2c_adapter *adapter,
struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(adapter);
int result;

- result = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
+ result = pm_runtime_resume_and_get(i2c_imx->adapter.dev.parent);
if (result < 0)
return result;

@@ -1496,7 +1496,7 @@ static int i2c_imx_remove(struct platform_device *pdev)
struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev);
int irq, ret;

- ret = pm_runtime_get_sync(&pdev->dev);
+ ret = pm_runtime_resume_and_get(&pdev->dev);
if (ret < 0)
return ret;

--
2.17.1


2021-04-14 20:08:30

by Wolfram Sang

[permalink] [raw]
Subject: Re: [PATCH -next] i2c: imx: Fix PM reference leak in i2c_imx_reg_slave()

On Thu, Apr 08, 2021 at 07:06:38PM +0800, Ye Weihua wrote:
> The PM reference count is not expected to be incremented on return in
> these functions.
>
> However, pm_runtime_get_sync() will increment the PM reference count
> even on failure. forgetting to put the reference again will result in
> a leak.
>
> Replace it with pm_runtime_resume_and_get() to keep the usage counter
> balanced.
>
> Reported-by: Hulk Robot <[email protected]>
> Signed-off-by: Ye Weihua <[email protected]>

After rebasing, only one hunk was left:

> @@ -801,7 +801,7 @@ static int i2c_imx_reg_slave(struct i2c_client *client)
> i2c_imx->last_slave_event = I2C_SLAVE_STOP;
>
> /* Resume */
> - ret = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
> + ret = pm_runtime_resume_and_get(i2c_imx->adapter.dev.parent);
> if (ret < 0) {
> dev_err(&i2c_imx->adapter.dev, "failed to resume i2c controller");
> return ret;

I applied this to for-next, thanks!


Attachments:
(No filename) (981.00 B)
signature.asc (849.00 B)
Download all attachments