Message ID | 20200521070507.13015-1-dinghao.liu@zju.edu.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | i2c: stm32f7: Fix runtime PM imbalance in stm32f7_i2c_reg_slave | expand |
Hi Dinghao, Thanks for the patch. Indeed, this should be fixed. Overall, there are several other calls to pm_runtime_get_sync within this driver, would you like to fix them all at once ? On Thu, May 21, 2020 at 03:05:07PM +0800, Dinghao Liu wrote: > pm_runtime_get_sync() increments the runtime PM usage counter even > the call returns an error code. Thus a pairing decrement is needed > on the error handling path to keep the counter balanced. > > Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn> > --- > drivers/i2c/busses/i2c-stm32f7.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c > index 330ffed011e0..602cf35649c8 100644 > --- a/drivers/i2c/busses/i2c-stm32f7.c > +++ b/drivers/i2c/busses/i2c-stm32f7.c > @@ -1767,8 +1767,10 @@ static int stm32f7_i2c_reg_slave(struct i2c_client *slave) > return ret; > > ret = pm_runtime_get_sync(dev); > - if (ret < 0) > + if (ret < 0) { > + pm_runtime_put_autosuspend(dev); Considering that if we fail here there is a very good chance that this is due to the resume failing, pm_runtime_put_noidle would probably make more sense since pm_runtime_put_autosuspend will most probably fail as well. > return ret; > + } > > if (!stm32f7_i2c_is_slave_registered(i2c_dev)) > stm32f7_i2c_enable_wakeup(i2c_dev, true); > -- > 2.17.1 >
> Overall, there are several other calls to pm_runtime_get_sync within this > driver, would you like to fix them all at once ? > Sure, I will send a new patch to merge them all. > On Thu, May 21, 2020 at 03:05:07PM +0800, Dinghao Liu wrote: > > pm_runtime_get_sync() increments the runtime PM usage counter even > > the call returns an error code. Thus a pairing decrement is needed > > on the error handling path to keep the counter balanced. > > > > Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn> > > --- > > drivers/i2c/busses/i2c-stm32f7.c | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c > > index 330ffed011e0..602cf35649c8 100644 > > --- a/drivers/i2c/busses/i2c-stm32f7.c > > +++ b/drivers/i2c/busses/i2c-stm32f7.c > > @@ -1767,8 +1767,10 @@ static int stm32f7_i2c_reg_slave(struct i2c_client *slave) > > return ret; > > > > ret = pm_runtime_get_sync(dev); > > - if (ret < 0) > > + if (ret < 0) { > > + pm_runtime_put_autosuspend(dev); > > Considering that if we fail here there is a very good chance that this is due > to the resume failing, pm_runtime_put_noidle would probably make more sense > since pm_runtime_put_autosuspend will most probably fail as well. > Agree. Thank you for your advice! Regards. Dinghao
On Tue, May 26, 2020 at 09:00:23PM +0800, dinghao.liu@zju.edu.cn wrote: > > > Overall, there are several other calls to pm_runtime_get_sync within this > > driver, would you like to fix them all at once ? > > > > Sure, I will send a new patch to merge them all. Thanks, you might want to add a Fixes: tag in your commit message as well. > > > On Thu, May 21, 2020 at 03:05:07PM +0800, Dinghao Liu wrote: > > > pm_runtime_get_sync() increments the runtime PM usage counter even > > > the call returns an error code. Thus a pairing decrement is needed > > > on the error handling path to keep the counter balanced. > > > > > > Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn> > > > --- > > > drivers/i2c/busses/i2c-stm32f7.c | 4 +++- > > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c > > > index 330ffed011e0..602cf35649c8 100644 > > > --- a/drivers/i2c/busses/i2c-stm32f7.c > > > +++ b/drivers/i2c/busses/i2c-stm32f7.c > > > @@ -1767,8 +1767,10 @@ static int stm32f7_i2c_reg_slave(struct i2c_client *slave) > > > return ret; > > > > > > ret = pm_runtime_get_sync(dev); > > > - if (ret < 0) > > > + if (ret < 0) { > > > + pm_runtime_put_autosuspend(dev); > > > > Considering that if we fail here there is a very good chance that this is due > > to the resume failing, pm_runtime_put_noidle would probably make more sense > > since pm_runtime_put_autosuspend will most probably fail as well. > > > > Agree. Thank you for your advice! > > Regards. > Dinghao
diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c index 330ffed011e0..602cf35649c8 100644 --- a/drivers/i2c/busses/i2c-stm32f7.c +++ b/drivers/i2c/busses/i2c-stm32f7.c @@ -1767,8 +1767,10 @@ static int stm32f7_i2c_reg_slave(struct i2c_client *slave) return ret; ret = pm_runtime_get_sync(dev); - if (ret < 0) + if (ret < 0) { + pm_runtime_put_autosuspend(dev); return ret; + } if (!stm32f7_i2c_is_slave_registered(i2c_dev)) stm32f7_i2c_enable_wakeup(i2c_dev, true);
pm_runtime_get_sync() increments the runtime PM usage counter even the call returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced. Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn> --- drivers/i2c/busses/i2c-stm32f7.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)