ALSA: hda - Fix possible races in HDMI driver - lockup on shutdown when radeon.audio=1 after using audacity

Arthur Marsh arthur.marsh at internode.on.net
Tue Jan 21 13:57:55 PST 2014



Takashi Iwai wrote, on 21/01/14 21:43:
> At Tue, 21 Jan 2014 11:50:43 +1030,
> Arthur Marsh wrote:
>>
>>
>>
>> Takashi Iwai wrote, on 20/01/14 19:22:
>>> At Sun, 19 Jan 2014 17:32:16 +1030,
>>> Arthur Marsh wrote:
>>>>
>>>> I have had reproducible lock-ups on shut-down (at the shutting down ALSA
>>>> stage) of my AMD64 machine (Asus M3A78Pro motherboard, BIOS 1701
>>>> 01/27/2011, CPU AMD Athlon(tm) II X4 640 Processor) running the 64 bit
>>>> Linux kernel more recent than 3.12 when *both* radeon.audio=1 was set
>>>> and I had been running audacity 2.0.5. (iommu=noaperture is also set).
>>>>
>>>> The problem was reproducible with the stock Debian kernel
>>>> linux-image-3.13-rc6-amd64 version 3.13~rc6-1~exp1.
>>>>
>>>> The machine is using an ATI/AMD 3850HD video card with a DVI cable to a
>>>> DVI input on my monitor, and the default audio device is the
>>>> motherboard's on-board audio device:
>>>>
>>>> 00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] SBx00
>>>> Azalia (Intel HDA)
>>>>
>>>> 01:00.0 VGA compatible controller: Advanced Micro Devices, Inc.
>>>> [AMD/ATI] RV670 [Radeon HD 3690/3850]
>>>> 01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] RV670/680
>>>> HDMI Audio [Radeon HD 3690/3800 Series]
>>>>
>>>> $ git bisect bad
>>>> cbbaa603a03cc46681e24d6b2804b62fde95a2af is the first bad commit
>>>> commit cbbaa603a03cc46681e24d6b2804b62fde95a2af
>>>> Author: Takashi Iwai <tiwai at suse.de>
>>>> Date:   Thu Oct 17 18:03:24 2013 +0200
>>>>
>>>>        ALSA: hda - Fix possible races in HDMI driver
>>>>
>>>>        Some per_pin fields and ELD contents might be changed dynamically in
>>>>        multiple ways where the concurrent accesses are still opened in the
>>>>        current code.  This patch fixes such possible races by using eld->lock
>>>>        in appropriate places.
>>>>
>>>>        Reported-by: Anssi Hannula <anssi.hannula at iki.fi>
>>>>        Signed-off-by: Takashi Iwai <tiwai at suse.de>
>>>>
>>>> :040000 040000 0c29281f82a3ebd9a704d481114f9cfcefea07c8
>>>> d71fd101125cd29a628cb5e66c7ee4f56e28329b M      sound
>>>>
>>>> When running audacity from the command line there was the following output:
>>>>
>>>> ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
>>>> ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
>>>> ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
>>>> ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
>>>> ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
>>>> ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
>>>> Expression 'stream->playback.pcm' failed in
>>>> 'src/hostapi/alsa/pa_linux_alsa.c', line: 4611
>>>> Expression 'stream->playback.pcm' failed in
>>>> 'src/hostapi/alsa/pa_linux_alsa.c', line: 4611
>>>> Expression 'stream->playback.pcm' failed in
>>>> 'src/hostapi/alsa/pa_linux_alsa.c', line: 4611
>>>>
>>>> I am happy to supply further information or run further tests to help in
>>>> isolating the problem and verifying a solution.
>>>
>>> Could you build the kernel with lockdep kconfig and see whether it
>>> reports errors?
>>>
>>> Reverting the commit doesn't work cleanly.  Instead, you can try to
>>> simply comment out all mutex_lock(&per_pin->lock) and
>>> mutex_unlock(&per_pin->lock) calls in patch_hdmi.c to see whether it's
>>> a mutex deadlock.
>>>
>>>
>>> thanks,
>>>
>>> Takashi
>>>
>>
>> I rebuilt the kernel after commenting out all mutex_lock(&per_pin->lock)
>> and mutex_unlock(&per_pin->lock) calls in patch_hdmi.c, and the
>> resulting kernel shutdown without hanging.
>
> Thanks.  Could you try the patch below?  It's already queued for
> 3.14.  If this patch really fixes the issue, I'm going to send it to
> stable 3.13.x.
>
>
> Takashi
>
> -- 8< --
> From: David Henningsson <david.henningsson at canonical.com>
> Subject: [PATCH] ALSA: hda - Explicitly keep codec powered up in
>   hdmi_present_sense
>
> This should help us avoid the following mutex deadlock:
>
> [] mutex_lock+0x2a/0x50
> [] hdmi_present_sense+0x53/0x3a0 [snd_hda_codec_hdmi]
> [] generic_hdmi_resume+0x5a/0x70 [snd_hda_codec_hdmi]
> [] hda_call_codec_resume+0xec/0x1d0 [snd_hda_codec]
> [] snd_hda_power_save+0x1e4/0x280 [snd_hda_codec]
> [] codec_exec_verb+0x5f/0x290 [snd_hda_codec]
> [] snd_hda_codec_read+0x5b/0x90 [snd_hda_codec]
> [] snd_hdmi_get_eld_size+0x1e/0x20 [snd_hda_codec_hdmi]
> [] snd_hdmi_get_eld+0x2c/0xd0 [snd_hda_codec_hdmi]
> [] hdmi_present_sense+0x9a/0x3a0 [snd_hda_codec_hdmi]
> [] hdmi_repoll_eld+0x34/0x50 [snd_hda_codec_hdmi]
>
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
>   sound/pci/hda/patch_hdmi.c | 6 +++++-
>   1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index f5060fc7c303..977db17db26c 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -1496,11 +1496,14 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
>   	 * specification worked this way. Hence, we just ignore the data in
>   	 * the unsolicited response to avoid custom WARs.
>   	 */
> -	int present = snd_hda_pin_sense(codec, pin_nid);
> +	int present;
>   	bool update_eld = false;
>   	bool eld_changed = false;
>   	bool ret;
>
> +	snd_hda_power_up(codec);
> +	present = snd_hda_pin_sense(codec, pin_nid);
> +
>   	mutex_lock(&per_pin->lock);
>   	pin_eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE);
>   	if (pin_eld->monitor_present)
> @@ -1573,6 +1576,7 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
>   		jack->block_report = !ret;
>
>   	mutex_unlock(&per_pin->lock);
> +	snd_hda_power_down(codec);
>   	return ret;
>   }
>
>

The patch worked thanks.

I had to revert this patch to update the kernel to the current Linus' 
git head.

Regards,

Arthur.


More information about the xorg-driver-ati mailing list