From: Takashi Iwai <tiwai@suse.de>
To: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Cc: alsa-devel@alsa-project.org, intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH] ALSA: hda: fix general protection fault in azx_runtime_idle
Date: Fri, 12 Nov 2021 11:02:50 +0100 [thread overview]
Message-ID: <s5hczn53d4l.wl-tiwai@suse.de> (raw)
In-Reply-To: <alpine.DEB.2.22.394.2111111920450.3554566@eliteleevi.tm.intel.com>
On Thu, 11 Nov 2021 18:39:36 +0100,
Kai Vehmanen wrote:
>
> Hi,
>
> On Thu, 11 Nov 2021, Takashi Iwai wrote:
>
> > A potential problem with the current code is that it doesn't disable
> > the runtime PM at the release procedure. Could you try the patch
> > below? You can put WARN_ON(!chip) at azx_runtime_idle(), too, for
> > catching the invalid runtime call.
> [...]
> > --- a/sound/pci/hda/hda_intel.c
> > +++ b/sound/pci/hda/hda_intel.c
> > @@ -1347,8 +1347,13 @@ static void azx_free(struct azx *chip)
> > if (hda->freed)
> > return;
> >
> > - if (azx_has_pm_runtime(chip) && chip->running)
> > + if (azx_has_pm_runtime(chip) && chip->running) {
> > pm_runtime_get_noresume(&pci->dev);
> > + pm_runtime_forbid(&pci->dev);
> > + pm_runtime_dont_use_autosuspend(&pci->dev);
> > + pm_runtime_disable(&pci->dev);
> > + }
> > +
> > chip->running = 0;
>
> Tested with next-20211019 (first next tag where I've seen test failures)
> and your patch, and this seems to do the trick. I didn't have my drvdata
> patch included when I ran the test. No rpm_idle() calls
> anymore after azx_remove(), so the bug is not hit.
So far, so good...
> > azx_del_card_list(chip);
> > @@ -2320,6 +2325,7 @@ static int azx_probe_continue(struct azx *chip)
> > set_default_power_save(chip);
> >
> > if (azx_has_pm_runtime(chip)) {
> > + pm_runtime_enable(&pci->dev);
> > pm_runtime_use_autosuspend(&pci->dev);
>
> This does generate warnings
> [ 13.495059] snd_hda_intel 0000:00:1f.3: Unbalanced pm_runtime_enable!
>
> And later
> [ 54.770701] Enabling runtime PM for inactive device (0000:00:1f.3) with active children
> [ 54.770718] WARNING: CPU: 0 PID: 10 at drivers/base/power/runtime.c:1439 pm_runtime_enable+0x98/0xb0
>
> Adding a "pm_runtime_set_active(&pci->dev)" to both azx_free() and
> azx_probe_continue() seems to help and fix still works.
Ah yes, I was confused as if it were already called in hdac_device.c,
but this was about the HD-audio bus controller, not the codec.
Below is the revised one.
Takashi
-- 8< --
From: Takashi Iwai <tiwai@suse.de>
Subject: [PATCH] ALSA: hda: intel: More comprehensive PM runtime setup for
controller driver
Currently we haven't explicitly enable and allow/forbid the runtime PM
at the probe and the remove phases of HD-audio controller driver, and
this was the reason of a GPF mentioned in the commit e81478bbe7a1
("ALSA: hda: fix general protection fault in azx_runtime_idle");
namely, even after the resources are released, the runtime PM might be
still invoked by the bound graphics driver during the remove of the
controller driver. Although we've fixed it by clearing the drvdata
reference, it'd be also better to cover the runtime PM issue more
properly.
This patch adds a few more pm_runtime_*() calls at the probe and the
remove time for setting and cleaning up the runtime PM. Particularly,
now more explicitly pm_runtime_enable() and _disable() get called as
well as pm_runtime_forbid() call at the remove callback, so that a
use-after-free should be avoided.
Reported-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
sound/pci/hda/hda_intel.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index fe51163f2d82..45e85180048c 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1347,8 +1347,14 @@ static void azx_free(struct azx *chip)
if (hda->freed)
return;
- if (azx_has_pm_runtime(chip) && chip->running)
+ if (azx_has_pm_runtime(chip) && chip->running) {
pm_runtime_get_noresume(&pci->dev);
+ pm_runtime_disable(&pci->dev);
+ pm_runtime_set_suspended(&pci->dev);
+ pm_runtime_forbid(&pci->dev);
+ pm_runtime_dont_use_autosuspend(&pci->dev);
+ }
+
chip->running = 0;
azx_del_card_list(chip);
@@ -2322,6 +2328,8 @@ static int azx_probe_continue(struct azx *chip)
if (azx_has_pm_runtime(chip)) {
pm_runtime_use_autosuspend(&pci->dev);
pm_runtime_allow(&pci->dev);
+ pm_runtime_set_active(&pci->dev);
+ pm_runtime_enable(&pci->dev);
pm_runtime_put_autosuspend(&pci->dev);
}
--
2.31.1
next prev parent reply other threads:[~2021-11-12 10:02 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-10 21:03 [Intel-gfx] [PATCH] ALSA: hda: fix general protection fault in azx_runtime_idle Kai Vehmanen
2021-11-10 21:55 ` Takashi Iwai
2021-11-10 22:15 ` Kai Vehmanen
2021-11-11 13:29 ` Takashi Iwai
2021-11-11 17:39 ` Kai Vehmanen
2021-11-12 10:02 ` Takashi Iwai [this message]
2021-11-12 12:27 ` Kai Vehmanen
2021-11-15 7:57 ` Takashi Iwai
2021-11-10 21:57 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2021-11-10 22:27 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-11-10 23:45 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2021-11-11 15:33 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for ALSA: hda: fix general protection fault in azx_runtime_idle (rev2) Patchwork
2021-11-11 15:37 ` [Intel-gfx] ✗ Fi.CI.DOCS: " Patchwork
2021-11-11 16:01 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2021-11-12 10:28 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for ALSA: hda: fix general protection fault in azx_runtime_idle (rev3) Patchwork
2021-11-12 10:32 ` [Intel-gfx] ✗ Fi.CI.DOCS: " Patchwork
2021-11-12 10:57 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-11-12 15:04 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=s5hczn53d4l.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=kai.vehmanen@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox