Revert "ALSA: hda: Flush interrupts on disabling"
diff mbox series

Message ID 20191028081056.22010-1-tiwai@suse.de
State New
Headers show
Series
  • Revert "ALSA: hda: Flush interrupts on disabling"
Related show

Commit Message

Takashi Iwai Oct. 28, 2019, 8:10 a.m. UTC
This reverts commit caa8422d01e983782548648e125fd617cadcec3f.

It turned out that this commit caused a regression at shutdown /
reboot, as the synchronize_irq() calls seems blocking the whole
shutdown.  Also another part of the change about shuffling the call
order looks suspicious; the azx_stop_chip() call disables the CORB /
RIRB while the others may still need the CORB/RIRB update.

Since the original commit itself was a cargo-fix, let's revert the
whole patch.

BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=205333
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/hda/hdac_controller.c | 2 --
 sound/pci/hda/hda_intel.c   | 2 +-
 2 files changed, 1 insertion(+), 3 deletions(-)

Comments

Chris Wilson Oct. 28, 2019, 8:21 a.m. UTC | #1
Quoting Takashi Iwai (2019-10-28 08:10:56)
> This reverts commit caa8422d01e983782548648e125fd617cadcec3f.
> 
> It turned out that this commit caused a regression at shutdown /
> reboot, as the synchronize_irq() calls seems blocking the whole
> shutdown.  Also another part of the change about shuffling the call
> order looks suspicious; the azx_stop_chip() call disables the CORB /
> RIRB while the others may still need the CORB/RIRB update.
> 
> Since the original commit itself was a cargo-fix, let's revert the
> whole patch.

You will want to include a link to the bug you may be reintroducing so
you have that information for easy reference later.

Also do you know if you fixed the bug in any other way, because our CI
hasn't reported that GPF since the patch landed.
-Chris
Takashi Iwai Oct. 28, 2019, 8:24 a.m. UTC | #2
On Mon, 28 Oct 2019 09:21:07 +0100,
Chris Wilson wrote:
> 
> Quoting Takashi Iwai (2019-10-28 08:10:56)
> > This reverts commit caa8422d01e983782548648e125fd617cadcec3f.
> > 
> > It turned out that this commit caused a regression at shutdown /
> > reboot, as the synchronize_irq() calls seems blocking the whole
> > shutdown.  Also another part of the change about shuffling the call
> > order looks suspicious; the azx_stop_chip() call disables the CORB /
> > RIRB while the others may still need the CORB/RIRB update.
> > 
> > Since the original commit itself was a cargo-fix, let's revert the
> > whole patch.
> 
> You will want to include a link to the bug you may be reintroducing so
> you have that information for easy reference later.

Actually I forgot to put the Fixes tag where usually you can track the
original issue from there.  Will fix it.  I don't mind to put yet
another bug link tag, though.

> Also do you know if you fixed the bug in any other way, because our CI
> hasn't reported that GPF since the patch landed.

Well, let's see whether the GPF reappears with the revert at first.
It might be another fix that covered.


thanks,

Takashi
Takashi Iwai Oct. 28, 2019, 11:09 a.m. UTC | #3
On Mon, 28 Oct 2019 09:24:00 +0100,
Takashi Iwai wrote:
> 
> On Mon, 28 Oct 2019 09:21:07 +0100,
> Chris Wilson wrote:
> > 
> > Quoting Takashi Iwai (2019-10-28 08:10:56)
> > > This reverts commit caa8422d01e983782548648e125fd617cadcec3f.
> > > 
> > > It turned out that this commit caused a regression at shutdown /
> > > reboot, as the synchronize_irq() calls seems blocking the whole
> > > shutdown.  Also another part of the change about shuffling the call
> > > order looks suspicious; the azx_stop_chip() call disables the CORB /
> > > RIRB while the others may still need the CORB/RIRB update.
> > > 
> > > Since the original commit itself was a cargo-fix, let's revert the
> > > whole patch.
> > 
> > You will want to include a link to the bug you may be reintroducing so
> > you have that information for easy reference later.
> 
> Actually I forgot to put the Fixes tag where usually you can track the
> original issue from there.  Will fix it.  I don't mind to put yet
> another bug link tag, though.
> 
> > Also do you know if you fixed the bug in any other way, because our CI
> > hasn't reported that GPF since the patch landed.
> 
> Well, let's see whether the GPF reappears with the revert at first.
> It might be another fix that covered.

Thinking over this again, the patch below should cover this kind of
races (hopefully).  I'm going to queue this together with the revert.


thanks,

Takashi

-- 8< --
From: Takashi Iwai <tiwai@suse.de>
Subject: [PATCH] ALSA: hda - Fix pending unsol events at shutdown

This is an alternative fix attemp for the issue reported in the commit
caa8422d01e9 ("ALSA: hda: Flush interrupts on disabling") that was
reverted later due to regressions.  Instead of tweaking the hardware
disablement order and the enforced irq flushing, do calling
cancel_work_sync() of the unsol work early enough, and explicitly
ignore the unsol events during the shutdown by checking the
bus->shutdown flag.

Fixes: caa8422d01e9 ("ALSA: hda: Flush interrupts on disabling")
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/hda/hda_bind.c  | 4 ++++
 sound/pci/hda/hda_intel.c | 3 +++
 2 files changed, 7 insertions(+)

diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c
index 8272b50b8349..6a8564566375 100644
--- a/sound/pci/hda/hda_bind.c
+++ b/sound/pci/hda/hda_bind.c
@@ -43,6 +43,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev)
 {
 	struct hda_codec *codec = container_of(dev, struct hda_codec, core);
 
+	/* ignore unsol events during shutdown */
+	if (codec->bus->shutdown)
+		return;
+
 	if (codec->patch_ops.unsol_event)
 		codec->patch_ops.unsol_event(codec, ev);
 }
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index cf53fbd872ee..7304a92559a3 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1382,8 +1382,11 @@ static int azx_free(struct azx *chip)
 static int azx_dev_disconnect(struct snd_device *device)
 {
 	struct azx *chip = device->device_data;
+	struct hdac_bus *bus = azx_bus(chip);
 
 	chip->bus.shutdown = 1;
+	cancel_work_sync(&bus->unsol_work);
+
 	return 0;
 }
Jonas Witschel Oct. 28, 2019, 6:18 p.m. UTC | #4
On 2019-10-28 12:09, Takashi Iwai wrote:
> Thinking over this again, the patch below should cover this kind of
> races (hopefully).  I'm going to queue this together with the revert.
> 
> [...]
> 
> From: Takashi Iwai <tiwai@suse.de>
> Subject: [PATCH] ALSA: hda - Fix pending unsol events at shutdown

I tested your current for-next branch up until commit
91636a82044a2821201b54faac4d1d2425260842, which includes this commit as
well as the revert of caa8422d01e983782548648e125fd617cadcec3f. Shutdown
and reboot worked as expected on my system.

Cheers,
Jonas

Patch
diff mbox series

diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
index d3999e7b0705..7e7be8e4dcf9 100644
--- a/sound/hda/hdac_controller.c
+++ b/sound/hda/hdac_controller.c
@@ -447,8 +447,6 @@  static void azx_int_disable(struct hdac_bus *bus)
 	list_for_each_entry(azx_dev, &bus->stream_list, list)
 		snd_hdac_stream_updateb(azx_dev, SD_CTL, SD_INT_MASK, 0);
 
-	synchronize_irq(bus->irq);
-
 	/* disable SIE for all streams */
 	snd_hdac_chip_writeb(bus, INTCTL, 0);
 
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index a815bc811799..cf53fbd872ee 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1348,9 +1348,9 @@  static int azx_free(struct azx *chip)
 	}
 
 	if (bus->chip_init) {
-		azx_stop_chip(chip);
 		azx_clear_irq_pending(chip);
 		azx_stop_all_streams(chip);
+		azx_stop_chip(chip);
 	}
 
 	if (bus->irq >= 0)