]> git.baikalelectronics.ru Git - kernel.git/commit
ALSA: hda - Fix mutex deadlock at HDMI/DP hotplug
authorTakashi Iwai <tiwai@suse.de>
Thu, 17 Mar 2016 13:48:13 +0000 (14:48 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 17 Mar 2016 14:38:35 +0000 (15:38 +0100)
commit4cdc325c448172ac48c2f4c7ca62a364fc1cf54f
tree42308cac88baba0e3400ea2414514320a44e532e
parenta33ad7b4563ce7425d8f86d9bfb1e67b4cd4e10d
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: 95a68bf02428 ('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>
sound/pci/hda/patch_hdmi.c