diff mbox series

PM: sleep: core: Resume suspended device if direct-complete is disabled

Message ID 20201231060319.137133-1-kai.heng.feng@canonical.com
State New
Headers show
Series PM: sleep: core: Resume suspended device if direct-complete is disabled | expand

Commit Message

Kai-Heng Feng Dec. 31, 2020, 6:03 a.m. UTC
HDA controller can't be runtime-suspended after commit 215a22ed31a1
("ALSA: hda: Refactor codjc PM to use direct-complete optimization"),
which enables direct-complete for HDA codec.

The HDA codec driver doesn't expect direct-complete will be disabled
after it returns a positive value from prepare() callback. So freeze()
is called directly when it's runtime-suspended, breaks the balance of
its internal codec_powered counting.

So if a device is prepared for direct-complete but PM core breaks the
assumption, resume the device to keep PM operations balanced.

Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization")
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 drivers/base/power/main.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Takashi Iwai Jan. 28, 2021, 8:09 a.m. UTC | #1
On Thu, 31 Dec 2020 07:03:19 +0100,
Kai-Heng Feng wrote:
> 

> HDA controller can't be runtime-suspended after commit 215a22ed31a1

> ("ALSA: hda: Refactor codjc PM to use direct-complete optimization"),

> which enables direct-complete for HDA codec.

> 

> The HDA codec driver doesn't expect direct-complete will be disabled

> after it returns a positive value from prepare() callback. So freeze()

> is called directly when it's runtime-suspended, breaks the balance of

> its internal codec_powered counting.

> 

> So if a device is prepared for direct-complete but PM core breaks the

> assumption, resume the device to keep PM operations balanced.

> 

> Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization")

> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>


Kai-Heng, is this fix still needed for 5.11?

The description mentions about HD-audio controller, while the recent
revert was the HD-audio codec, so I suppose it's still affected?


thanks,

Takashi

> ---

>  drivers/base/power/main.c | 4 ++++

>  1 file changed, 4 insertions(+)

> 

> diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c

> index 46793276598d..9c0e25a92ad0 100644

> --- a/drivers/base/power/main.c

> +++ b/drivers/base/power/main.c

> @@ -1849,6 +1849,10 @@ static int device_prepare(struct device *dev, pm_message_t state)

>  		(ret > 0 || dev->power.no_pm_callbacks) &&

>  		!dev_pm_test_driver_flags(dev, DPM_FLAG_NO_DIRECT_COMPLETE);

>  	spin_unlock_irq(&dev->power.lock);

> +

> +	if (ret > 0 && !dev->power.direct_complete)

> +		pm_runtime_resume(dev);

> +

>  	return 0;

>  }

>  

> -- 

> 2.29.2

>
Kai-Heng Feng Jan. 28, 2021, 8:15 a.m. UTC | #2
On Thu, Jan 28, 2021 at 4:09 PM Takashi Iwai <tiwai@suse.de> wrote:
>

> On Thu, 31 Dec 2020 07:03:19 +0100,

> Kai-Heng Feng wrote:

> >

> > HDA controller can't be runtime-suspended after commit 215a22ed31a1

> > ("ALSA: hda: Refactor codjc PM to use direct-complete optimization"),

> > which enables direct-complete for HDA codec.

> >

> > The HDA codec driver doesn't expect direct-complete will be disabled

> > after it returns a positive value from prepare() callback. So freeze()

> > is called directly when it's runtime-suspended, breaks the balance of

> > its internal codec_powered counting.

> >

> > So if a device is prepared for direct-complete but PM core breaks the

> > assumption, resume the device to keep PM operations balanced.

> >

> > Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization")

> > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>

>

> Kai-Heng, is this fix still needed for 5.11?


No it's not needed anymore because "ALSA: hda: Balance runtime/system
PM if direct-complete is disabled" is in place.

>

> The description mentions about HD-audio controller, while the recent

> revert was the HD-audio codec, so I suppose it's still affected?


Not affected anymore if above mentioned patch is applied.

Kai-Heng

>

>

> thanks,

>

> Takashi

>

> > ---

> >  drivers/base/power/main.c | 4 ++++

> >  1 file changed, 4 insertions(+)

> >

> > diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c

> > index 46793276598d..9c0e25a92ad0 100644

> > --- a/drivers/base/power/main.c

> > +++ b/drivers/base/power/main.c

> > @@ -1849,6 +1849,10 @@ static int device_prepare(struct device *dev, pm_message_t state)

> >               (ret > 0 || dev->power.no_pm_callbacks) &&

> >               !dev_pm_test_driver_flags(dev, DPM_FLAG_NO_DIRECT_COMPLETE);

> >       spin_unlock_irq(&dev->power.lock);

> > +

> > +     if (ret > 0 && !dev->power.direct_complete)

> > +             pm_runtime_resume(dev);

> > +

> >       return 0;

> >  }

> >

> > --

> > 2.29.2

> >
Takashi Iwai Jan. 28, 2021, 8:19 a.m. UTC | #3
On Thu, 28 Jan 2021 09:15:10 +0100,
Kai-Heng Feng wrote:
> 

> On Thu, Jan 28, 2021 at 4:09 PM Takashi Iwai <tiwai@suse.de> wrote:

> >

> > On Thu, 31 Dec 2020 07:03:19 +0100,

> > Kai-Heng Feng wrote:

> > >

> > > HDA controller can't be runtime-suspended after commit 215a22ed31a1

> > > ("ALSA: hda: Refactor codjc PM to use direct-complete optimization"),

> > > which enables direct-complete for HDA codec.

> > >

> > > The HDA codec driver doesn't expect direct-complete will be disabled

> > > after it returns a positive value from prepare() callback. So freeze()

> > > is called directly when it's runtime-suspended, breaks the balance of

> > > its internal codec_powered counting.

> > >

> > > So if a device is prepared for direct-complete but PM core breaks the

> > > assumption, resume the device to keep PM operations balanced.

> > >

> > > Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization")

> > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>

> >

> > Kai-Heng, is this fix still needed for 5.11?

> 

> No it's not needed anymore because "ALSA: hda: Balance runtime/system

> PM if direct-complete is disabled" is in place.

> 

> >

> > The description mentions about HD-audio controller, while the recent

> > revert was the HD-audio codec, so I suppose it's still affected?

> 

> Not affected anymore if above mentioned patch is applied.


OK, thanks for clarification!


Takashi
Rafael J. Wysocki Jan. 28, 2021, 10:23 a.m. UTC | #4
On Thu, Jan 28, 2021 at 9:11 AM Takashi Iwai <tiwai@suse.de> wrote:
>

> On Thu, 31 Dec 2020 07:03:19 +0100,

> Kai-Heng Feng wrote:

> >

> > HDA controller can't be runtime-suspended after commit 215a22ed31a1

> > ("ALSA: hda: Refactor codjc PM to use direct-complete optimization"),

> > which enables direct-complete for HDA codec.

> >

> > The HDA codec driver doesn't expect direct-complete will be disabled

> > after it returns a positive value from prepare() callback. So freeze()

> > is called directly when it's runtime-suspended, breaks the balance of

> > its internal codec_powered counting.

> >

> > So if a device is prepared for direct-complete but PM core breaks the

> > assumption, resume the device to keep PM operations balanced.

> >

> > Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization")

> > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>

>

> Kai-Heng, is this fix still needed for 5.11?

>

> The description mentions about HD-audio controller, while the recent

> revert was the HD-audio codec, so I suppose it's still affected?


Regardless, this is not the right fix, because it doesn't take driver
flags into account AFAICS.

> > ---

> >  drivers/base/power/main.c | 4 ++++

> >  1 file changed, 4 insertions(+)

> >

> > diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c

> > index 46793276598d..9c0e25a92ad0 100644

> > --- a/drivers/base/power/main.c

> > +++ b/drivers/base/power/main.c

> > @@ -1849,6 +1849,10 @@ static int device_prepare(struct device *dev, pm_message_t state)

> >               (ret > 0 || dev->power.no_pm_callbacks) &&

> >               !dev_pm_test_driver_flags(dev, DPM_FLAG_NO_DIRECT_COMPLETE);

> >       spin_unlock_irq(&dev->power.lock);

> > +

> > +     if (ret > 0 && !dev->power.direct_complete)

> > +             pm_runtime_resume(dev);

> > +

> >       return 0;

> >  }

> >

> > --

> > 2.29.2

> >
diff mbox series

Patch

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 46793276598d..9c0e25a92ad0 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1849,6 +1849,10 @@  static int device_prepare(struct device *dev, pm_message_t state)
 		(ret > 0 || dev->power.no_pm_callbacks) &&
 		!dev_pm_test_driver_flags(dev, DPM_FLAG_NO_DIRECT_COMPLETE);
 	spin_unlock_irq(&dev->power.lock);
+
+	if (ret > 0 && !dev->power.direct_complete)
+		pm_runtime_resume(dev);
+
 	return 0;
 }