This is a note to let you know that I've just added the patch titled

    ALSA: emu10k1: Fix deadlock in synth voice lookup

to the 3.17-stable tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     alsa-emu10k1-fix-deadlock-in-synth-voice-lookup.patch
and it can be found in the queue-3.17 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.


>From 95926035b187cc9fee6fb61385b7da9c28123f74 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <ti...@suse.de>
Date: Mon, 13 Oct 2014 23:18:02 +0200
Subject: ALSA: emu10k1: Fix deadlock in synth voice lookup

From: Takashi Iwai <ti...@suse.de>

commit 95926035b187cc9fee6fb61385b7da9c28123f74 upstream.

The emu10k1 voice allocator takes voice_lock spinlock.  When there is
no empty stream available, it tries to release a voice used by synth,
and calls get_synth_voice.  The callback function,
snd_emu10k1_synth_get_voice(), however, also takes the voice_lock,
thus it deadlocks.

The fix is simply removing the voice_lock holds in
snd_emu10k1_synth_get_voice(), as this is always called in the
spinlock context.

Reported-and-tested-by: Arthur Marsh <arthur.ma...@internode.on.net>
Signed-off-by: Takashi Iwai <ti...@suse.de>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 sound/pci/emu10k1/emu10k1_callback.c |    6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

--- a/sound/pci/emu10k1/emu10k1_callback.c
+++ b/sound/pci/emu10k1/emu10k1_callback.c
@@ -85,6 +85,8 @@ snd_emu10k1_ops_setup(struct snd_emux *e
  * get more voice for pcm
  *
  * terminate most inactive voice and give it as a pcm voice.
+ *
+ * voice_lock is already held.
  */
 int
 snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw)
@@ -92,12 +94,10 @@ snd_emu10k1_synth_get_voice(struct snd_e
        struct snd_emux *emu;
        struct snd_emux_voice *vp;
        struct best_voice best[V_END];
-       unsigned long flags;
        int i;
 
        emu = hw->synth;
 
-       spin_lock_irqsave(&emu->voice_lock, flags);
        lookup_voices(emu, hw, best, 1); /* no OFF voices */
        for (i = 0; i < V_END; i++) {
                if (best[i].voice >= 0) {
@@ -113,11 +113,9 @@ snd_emu10k1_synth_get_voice(struct snd_e
                        vp->emu->num_voices--;
                        vp->ch = -1;
                        vp->state = SNDRV_EMUX_ST_OFF;
-                       spin_unlock_irqrestore(&emu->voice_lock, flags);
                        return ch;
                }
        }
-       spin_unlock_irqrestore(&emu->voice_lock, flags);
 
        /* not found */
        return -ENOMEM;


Patches currently in stable-queue which might be from ti...@suse.de are

queue-3.17/alsa-bebob-fix-failure-to-detect-source-of-clock-for-terratec-phase-88.patch
queue-3.17/alsa-pcm-use-the-same-dma-mmap-codepath-both-for-arm-and-arm64.patch
queue-3.17/alsa-usb-audio-add-support-for-steinberg-ur22-usb-interface.patch
queue-3.17/alsa-hda-add-missing-terminating-entry-to-snd_hda_pin_quirk-macro.patch
queue-3.17/alsa-hda-fix-inverted-led-gpio-setup-for-lenovo-ideapad.patch
queue-3.17/alsa-emu10k1-fix-deadlock-in-synth-voice-lookup.patch
queue-3.17/alsa-hda-hdmi-fix-missing-eld-change-event-on-plug-unplug.patch
queue-3.17/alsa-alc283-codec-avoid-pop-noise-on-headphones-during-suspend-resume.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to