| From 91bf0c2dcb935a87e5c0795f5047456b965fd143 Mon Sep 17 00:00:00 2001 |
| From: Michael Gernoth <michael@gernoth.net> |
| Date: Thu, 9 Apr 2015 23:42:15 +0200 |
| Subject: ALSA: emu10k1: don't deadlock in proc-functions |
| |
| From: Michael Gernoth <michael@gernoth.net> |
| |
| commit 91bf0c2dcb935a87e5c0795f5047456b965fd143 upstream. |
| |
| The functions snd_emu10k1_proc_spdif_read and snd_emu1010_fpga_read |
| acquire the emu_lock before accessing the FPGA. The function used |
| to access the FPGA (snd_emu1010_fpga_read) also tries to take |
| the emu_lock which causes a deadlock. |
| Remove the outer locking in the proc-functions (guarding only the |
| already safe fpga read) to prevent this deadlock. |
| |
| [removed superfluous flags variables too -- tiwai] |
| |
| Signed-off-by: Michael Gernoth <michael@gernoth.net> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/emu10k1/emuproc.c | 12 ------------ |
| 1 file changed, 12 deletions(-) |
| |
| --- a/sound/pci/emu10k1/emuproc.c |
| +++ b/sound/pci/emu10k1/emuproc.c |
| @@ -241,31 +241,22 @@ static void snd_emu10k1_proc_spdif_read( |
| struct snd_emu10k1 *emu = entry->private_data; |
| u32 value; |
| u32 value2; |
| - unsigned long flags; |
| u32 rate; |
| |
| if (emu->card_capabilities->emu_model) { |
| - spin_lock_irqsave(&emu->emu_lock, flags); |
| snd_emu1010_fpga_read(emu, 0x38, &value); |
| - spin_unlock_irqrestore(&emu->emu_lock, flags); |
| if ((value & 0x1) == 0) { |
| - spin_lock_irqsave(&emu->emu_lock, flags); |
| snd_emu1010_fpga_read(emu, 0x2a, &value); |
| snd_emu1010_fpga_read(emu, 0x2b, &value2); |
| - spin_unlock_irqrestore(&emu->emu_lock, flags); |
| rate = 0x1770000 / (((value << 5) | value2)+1); |
| snd_iprintf(buffer, "ADAT Locked : %u\n", rate); |
| } else { |
| snd_iprintf(buffer, "ADAT Unlocked\n"); |
| } |
| - spin_lock_irqsave(&emu->emu_lock, flags); |
| snd_emu1010_fpga_read(emu, 0x20, &value); |
| - spin_unlock_irqrestore(&emu->emu_lock, flags); |
| if ((value & 0x4) == 0) { |
| - spin_lock_irqsave(&emu->emu_lock, flags); |
| snd_emu1010_fpga_read(emu, 0x28, &value); |
| snd_emu1010_fpga_read(emu, 0x29, &value2); |
| - spin_unlock_irqrestore(&emu->emu_lock, flags); |
| rate = 0x1770000 / (((value << 5) | value2)+1); |
| snd_iprintf(buffer, "SPDIF Locked : %d\n", rate); |
| } else { |
| @@ -410,14 +401,11 @@ static void snd_emu_proc_emu1010_reg_rea |
| { |
| struct snd_emu10k1 *emu = entry->private_data; |
| u32 value; |
| - unsigned long flags; |
| int i; |
| snd_iprintf(buffer, "EMU1010 Registers:\n\n"); |
| |
| for(i = 0; i < 0x40; i+=1) { |
| - spin_lock_irqsave(&emu->emu_lock, flags); |
| snd_emu1010_fpga_read(emu, i, &value); |
| - spin_unlock_irqrestore(&emu->emu_lock, flags); |
| snd_iprintf(buffer, "%02X: %08X, %02X\n", i, value, (value >> 8) & 0x7f); |
| } |
| } |