[alsa-devel] New snd-hda warning spew
Takashi Iwai
tiwai at suse.de
Thu Mar 17 15:39:59 CET 2016
On Thu, 17 Mar 2016 15:25:10 +0100,
Ville Syrjälä wrote:
>
> On Thu, Mar 17, 2016 at 03:12:22PM +0100, Takashi Iwai wrote:
> > On Thu, 17 Mar 2016 14:38:42 +0100,
> > Takashi Iwai wrote:
> > >
> > > On Wed, 16 Mar 2016 15:04:20 +0100,
> > > Ville Syrjälä wrote:
> > > >
> > > > But now I got a lockdep spew when I enabled the HDMI video output [1]
> > > >
> > > > And sure enough mplayer got stuck in the kernel when I tried to use
> > > > the HDMI audio device [2]
> > > >
> > > > [1]
> > > > [ 1939.476458] =============================================
> > > > [ 1939.476460] [ INFO: possible recursive locking detected ]
> > > > [ 1939.476463] 4.5.0-vga+ #13 Not tainted
> > > > [ 1939.476464] ---------------------------------------------
> > > > [ 1939.476466] kworker/2:2/1016 is trying to acquire lock:
> > > > [ 1939.476469] (&spec->pcm_lock){+.+...}, at: [<ffffffffa020b868>] hdmi_present_sense+0x38/0x300 [snd_hda_codec_hdmi]
> > > > [ 1939.476480]
> > > > but task is already holding lock:
> > > > [ 1939.476482] (&spec->pcm_lock){+.+...}, at: [<ffffffffa020b868>] hdmi_present_sense+0x38/0x300 [snd_hda_codec_hdmi]
> > > > [ 1939.476489]
> > > > other info that might help us debug this:
> > > > [ 1939.476491] Possible unsafe locking scenario:
> > > >
> > > > [ 1939.476493] CPU0
> > > > [ 1939.476495] ----
> > > > [ 1939.476496] lock(&spec->pcm_lock);
> > > > [ 1939.476499] lock(&spec->pcm_lock);
> > > > [ 1939.476502]
> > > > *** DEADLOCK ***
> > > >
> > > > [ 1939.476504] May be due to missing lock nesting notation
> > >
> > > Unfortunately, no this is a real deadlock.
> > > Let's see below: hdmi_present_sense() gets called twice because the
> > > function issues a verb that does self-resume and it invokes
> > > hdmi_present_sense() again in runtime resume.
> > >
> > > > [ 1939.476622] [<ffffffffa020b868>] hdmi_present_sense+0x38/0x300 [snd_hda_codec_hdmi]
> > > ....
> > > > [ 1939.476642] [<ffffffffa020bd6d>] generic_hdmi_resume+0x4d/0x60 [snd_hda_codec_hdmi]
> > > ....
> > > > [ 1939.476690] [<ffffffffa017de62>] snd_hdac_power_up_pm+0x52/0x60 [snd_hda_core]
> > > > [ 1939.476694] [<ffffffffa020b9c3>] hdmi_present_sense+0x193/0x300 [snd_hda_codec_hdmi]
> > > > [ 1939.476699] [<ffffffffa020bba0>] check_presence_and_report+0x70/0x90 [snd_hda_codec_hdmi]
> > > > [ 1939.476703] [<ffffffffa020bcba>] hdmi_unsol_event+0x9a/0xb0 [snd_hda_codec_hdmi]
> > >
> > > This wasn't seen until now because the code path using i915 audio
> > > notifier doesn't need to power up the codec. Now we switched to the
> > > old method for old chips, and the bug is revealed. It's good to have
> > > caught it now, because basically this hits all non-Intel chips.
> >
> > ... and the fix patch is attached below.
> >
> >
> > Takashi
> >
> > -- 8< --
> > From: Takashi Iwai <tiwai at suse.de>
> > Subject: [PATCH] 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: a76056f2e57e ('ALSA: hda - hdmi dynamically bind PCM to pin when monitor hotplug')
> > Reported-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > Signed-off-by: Takashi Iwai <tiwai at suse.de>
>
> Yep, my ILK seems happy with this. No deadlocks, and HDMI audio works.
>
> Tested-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Great, now queued with your tested-by tag. Thanks for quick testing!
Takashi
More information about the Alsa-devel
mailing list