Message ID | 20210408110638.200761-1-yeweihua4@huawei.com |
---|---|
State | New |
Headers | show |
Series | [-next] i2c: imx: Fix PM reference leak in i2c_imx_reg_slave() | expand |
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 <hulkci@huawei.com> > Signed-off-by: Ye Weihua <yeweihua4@huawei.com> 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!
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;
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 <hulkci@huawei.com> Signed-off-by: Ye Weihua <yeweihua4@huawei.com> --- drivers/i2c/busses/i2c-imx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)