linux_dsm_epyc7002/sound/pci/hda
Takashi Iwai 222bde0388 ALSA: hda - Fix mutex deadlock at HDMI/DP hotplug
The recent change in HD-audio HDMI/DP codec driver for allowing the
dynamic PCM binding introduced a new spec->pcm_mutex.  One of the
protected area by this mutex is hdmi_present_sense().  As reported by
Intel CI tests, unfortunately, the new mutex causes a deadlock when
the hotplug/unplug is triggered during the codec is in runtime
suspend.  The buggy code path is like the following:

  hdmi_unsol_event() -> ...
    -> hdmi_present_sense()
==>     ** here taking pcm_mutex
      -> hdmi_present_sense_via_verbs()
        -> snd_hda_power_up_pm() -> ... (runtime resume calls)
          -> generic_hdmi_resume()
            -> hdmi_present_sense()
==>           ** here taking pcm_mutex again!

As we can see here, the problem is that the mutex is taken before
snd_hda_power_up_pm() call that triggers the runtime resume.  That is,
the obvious solution is to move the power up/down call outside the
mutex; it is exactly what this patch provides.

The patch also clarifies why this bug wasn't caught beforehand.  We
used to have the i915 audio component for hotplug for all Intel chips,
and in that code path, there is no power up required but the
information is taken directly from the graphics side.  However, we
recently switched back to the old method for some old Intel chips due
to regressions, and now the deadlock issue is surfaced.

Fixes: a76056f2e5 ('ALSA: hda - hdmi dynamically bind PCM to pin when monitor hotplug')
Reported-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Tested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2016-03-17 15:38:35 +01:00
..
ca0132_regs.h ALSA: hda: ca0132_regs.h: Fix typo in include guard 2014-08-22 11:24:11 +02:00
dell_wmi_helper.c ALSA: hda - add mic mute led hook for dell machines 2014-07-31 09:21:42 +02:00
hda_auto_parser.c ALSA: hda - remove no physical connection pins from pin_quirk table 2015-08-03 10:16:20 +02:00
hda_auto_parser.h ALSA: hda - Sort input pins depending on amp caps 2014-09-23 15:57:32 +02:00
hda_beep.c ALSA: hda-beep: Update authors dead email address 2015-06-13 09:13:26 +02:00
hda_beep.h ALSA: hda-beep: Update authors dead email address 2015-06-20 09:24:40 +02:00
hda_bind.c ALSA: hda - Fix missing module loading with model=generic option 2016-01-20 15:56:42 +01:00
hda_codec.c ASoC: Updates for v4.4 2015-10-26 12:14:49 +01:00
hda_codec.h Merge branch 'topic/hda-modalias' into for-next 2015-10-20 10:19:40 +02:00
hda_controller_trace.h ALSA: hda - rename hda_intel_trace.h to hda_controller_trace.h 2015-05-18 10:06:32 +02:00
hda_controller.c ALSA: hda - Loop interrupt handling until really cleared 2016-02-26 08:50:31 +01:00
hda_controller.h ALSA: hda - Drop unused AZX_DCAPS_REVERSE_ASSIGN 2015-12-17 12:47:18 +01:00
hda_eld.c ALSA: hda - Use snd_hdac namespace prefix for chmap exported APIs 2016-03-07 15:46:06 +01:00
hda_generic.c ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
hda_generic.h ALSA: hda - Make snd_hda_parse_nid_path() local 2015-12-08 11:48:39 +01:00
hda_hwdep.c ALSA: hda - Add card field to hda_codec struct 2015-03-03 11:25:16 +01:00
hda_intel_trace.h ALSA: hda - add hda_intel_trace.h 2015-05-18 10:06:44 +02:00
hda_intel.c Merge branch 'for-linus' into for-next 2016-02-26 20:26:09 +01:00
hda_intel.h ALSA: hda - Spell vga_switcheroo consistently 2015-10-19 11:00:45 +02:00
hda_jack.c ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
hda_jack.h ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
hda_local.h ALSA: hda: make use of core codec fns 2015-10-08 19:09:36 +02:00
hda_proc.c ALSA: hda/proc - Fix racy string access for power states 2015-08-17 15:12:04 +02:00
hda_sysfs.c ALSA: hda - consolidate chip rename functions 2015-10-15 14:05:28 +02:00
hda_tegra.c ALSA: hda - Raise AZX_DCAPS_RIRB_DELAY handling into top drivers 2015-12-17 12:47:10 +01:00
Kconfig ALSA: jack: Allow building the jack layer without input device 2016-02-23 09:03:07 +01:00
local.h ALSA: hda - Move a part of hda_codec stuff into hdac_device 2015-03-23 13:17:17 +01:00
Makefile ALSA: replace CONFIG_PROC_FS with CONFIG_SND_PROC_FS 2015-05-27 21:25:19 +02:00
patch_analog.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_ca0110.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_ca0132.c ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
patch_cirrus.c ALSA: hda - Fix unconditional GPIO toggle via automute 2016-03-15 16:44:55 +01:00
patch_cmedia.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_conexant.c ALSA: hda - Apply reboot D3 fix for CX20724 codec, too 2016-03-10 11:37:44 +01:00
patch_hdmi.c ALSA: hda - Fix mutex deadlock at HDMI/DP hotplug 2016-03-17 15:38:35 +01:00
patch_realtek.c ALSA: hda - fix the mic mute button and led problem for a Lenovo AIO 2016-03-11 08:22:18 +01:00
patch_si3054.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
patch_sigmatel.c ALSA: hda - Fix bad dereference of jack object 2016-02-09 12:16:31 +01:00
patch_via.c ALSA: hda - convert to hda_device_id 2015-10-20 10:15:20 +02:00
thinkpad_helper.c ALSA: hda - Use acpi_dev_present() 2016-02-21 09:16:00 +01:00