diff mbox series

[23/28] iio: pressure: zpa2326: fix potential extra call of runtime suspend.

Message ID 20210509113354.660190-24-jic23@kernel.org (mailing list archive)
State New, archived
Headers show
Series IIO: Runtime PM related cleanups. | expand

Commit Message

Jonathan Cameron May 9, 2021, 11:33 a.m. UTC
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>

This case illustrates why the new pm_runtime_sync_and_get() is good
in that it makes clear the correct way to handle errors.

Calling pm_runtime_put() on failure of the _get() in pm_runtime_get_sync()
will potentially result in powering down an already powered down device
(as we never successfully powered it up.  Unlikely to cause any problems
in reality.

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 drivers/iio/pressure/zpa2326.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

Comments

Mauro Carvalho Chehab May 12, 2021, 2:49 p.m. UTC | #1
Em Sun,  9 May 2021 12:33:49 +0100
Jonathan Cameron <jic23@kernel.org> escreveu:

> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> 
> This case illustrates why the new pm_runtime_sync_and_get() is good
> in that it makes clear the correct way to handle errors.
> 
> Calling pm_runtime_put() on failure of the _get() in pm_runtime_get_sync()
> will potentially result in powering down an already powered down device
> (as we never successfully powered it up.  Unlikely to cause any problems
> in reality.
> 
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

This one seems a little odd on my eyes, although I don't know much about
IIO, as it calls RPM get only at:

	zpa2326_init_runtime()

on a balanced way, as the routine starts with RPM get() ends with RPM put().

Then it does a put at zpa2326_suspend() and a get at zpa2326_resume().

Can RPM usage_count be zero at suspend (or are there some other part
of IIO core that increments it?). Because, if after resume, usage_count
would be equal to 1, as I guess RPM core prevent negative values.

Regards,
Mauro



> ---
>  drivers/iio/pressure/zpa2326.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c
> index 89295c90f801..97ac3ba399f7 100644
> --- a/drivers/iio/pressure/zpa2326.c
> +++ b/drivers/iio/pressure/zpa2326.c
> @@ -664,11 +664,9 @@ static int zpa2326_resume(const struct iio_dev *indio_dev)
>  {
>  	int err;
>  
> -	err = pm_runtime_get_sync(indio_dev->dev.parent);
> -	if (err < 0) {
> -		pm_runtime_put(indio_dev->dev.parent);
> +	err = pm_runtime_resume_and_get(indio_dev->dev.parent);
> +	if (err < 0)
>  		return err;
> -	}
>  
>  	if (err > 0) {
>  		/*



Thanks,
Mauro
Jonathan Cameron May 16, 2021, 4:08 p.m. UTC | #2
On Wed, 12 May 2021 16:49:58 +0200
Mauro Carvalho Chehab <mchehab+huawei@kernel.org> wrote:

> Em Sun,  9 May 2021 12:33:49 +0100
> Jonathan Cameron <jic23@kernel.org> escreveu:
> 
> > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > 
> > This case illustrates why the new pm_runtime_sync_and_get() is good
> > in that it makes clear the correct way to handle errors.
> > 
> > Calling pm_runtime_put() on failure of the _get() in pm_runtime_get_sync()
> > will potentially result in powering down an already powered down device
> > (as we never successfully powered it up.  Unlikely to cause any problems
> > in reality.
> > 
> > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>  
> 
> This one seems a little odd on my eyes, although I don't know much about
> IIO, as it calls RPM get only at:
> 
> 	zpa2326_init_runtime()
> 
> on a balanced way, as the routine starts with RPM get() ends with RPM put().
> 
> Then it does a put at zpa2326_suspend() and a get at zpa2326_resume().
> 
> Can RPM usage_count be zero at suspend (or are there some other part
> of IIO core that increments it?). Because, if after resume, usage_count
> would be equal to 1, as I guess RPM core prevent negative values.

I've stared at this for a few minutes and gotten nowhere in figuring out
the intent.   As such I'm going to drop the patch for now and revisit
at a later date.

Jonathan



> 
> Regards,
> Mauro
> 
> 
> 
> > ---
> >  drivers/iio/pressure/zpa2326.c | 6 ++----
> >  1 file changed, 2 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c
> > index 89295c90f801..97ac3ba399f7 100644
> > --- a/drivers/iio/pressure/zpa2326.c
> > +++ b/drivers/iio/pressure/zpa2326.c
> > @@ -664,11 +664,9 @@ static int zpa2326_resume(const struct iio_dev *indio_dev)
> >  {
> >  	int err;
> >  
> > -	err = pm_runtime_get_sync(indio_dev->dev.parent);
> > -	if (err < 0) {
> > -		pm_runtime_put(indio_dev->dev.parent);
> > +	err = pm_runtime_resume_and_get(indio_dev->dev.parent);
> > +	if (err < 0)
> >  		return err;
> > -	}
> >  
> >  	if (err > 0) {
> >  		/*  
> 
> 
> 
> Thanks,
> Mauro
diff mbox series

Patch

diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c
index 89295c90f801..97ac3ba399f7 100644
--- a/drivers/iio/pressure/zpa2326.c
+++ b/drivers/iio/pressure/zpa2326.c
@@ -664,11 +664,9 @@  static int zpa2326_resume(const struct iio_dev *indio_dev)
 {
 	int err;
 
-	err = pm_runtime_get_sync(indio_dev->dev.parent);
-	if (err < 0) {
-		pm_runtime_put(indio_dev->dev.parent);
+	err = pm_runtime_resume_and_get(indio_dev->dev.parent);
+	if (err < 0)
 		return err;
-	}
 
 	if (err > 0) {
 		/*