[bug report] potential deadlock in snd_emu10k1_voice_alloc()
Takashi Iwai
tiwai at suse.de
Tue Feb 2 09:18:50 CET 2021
On Tue, 02 Feb 2021 06:56:08 +0100,
Dan Carpenter wrote:
>
> Hello ALSA devs,
>
> The patch 1da177e4c3f4: "Linux-2.6.12-rc2" from Apr 16, 2005, leads
> to the following static checker warning:
>
> sound/pci/emu10k1/voice.c:112 snd_emu10k1_voice_alloc()
> warn: called with lock held. '&emu->voice_lock'
>
> sound/pci/emu10k1/voice.c
> 101 int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int number,
> 102 struct snd_emu10k1_voice **rvoice)
> 103 {
> 104 unsigned long flags;
> 105 int result;
> 106
> 107 if (snd_BUG_ON(!rvoice))
> 108 return -EINVAL;
> 109 if (snd_BUG_ON(!number))
> 110 return -EINVAL;
> 111
> 112 spin_lock_irqsave(&emu->voice_lock, flags);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> This lock is already held in the caller.
>
> 113 for (;;) {
> 114 result = voice_alloc(emu, type, number, rvoice);
> 115 if (result == 0 || type == EMU10K1_SYNTH || type == EMU10K1_MIDI)
> 116 break;
> 117
> 118 /* free a voice from synth */
> 119 if (emu->get_synth_voice) {
>
> The call tree is:
>
> snd_emux_note_on()
> takes the lock: spin_lock_irqsave(&emu->voice_lock, flags);
> calls vp = emu->ops.get_voice(emu, port);
> --> get_voice()
> --> snd_emu10k1_voice_alloc()
This report looks like a false-positive, too.
Both are from different structs, one is from struct snd_emu10k1 and
another is struct snd_emux.
thanks,
Takashi
More information about the Alsa-devel
mailing list