ALSA: emu10k1: don't deadlock in proc-functions
PATCH 1/1 ALSA: emu10k1: don't deadlock in proc-functions
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.
--- sound/pci/emu10k1/emuproc.c | 10 ---------- 1 file changed, 10 deletions(-)
sound/pci/emu10k1/emuproc.c +0 -10
@@ -245,27 +245,19 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry,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 {
@@ -415,9 +407,7 @@ static void snd_emu_proc_emu1010_reg_read(struct snd_info_entry *entry,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 ); } }
Signature · 1 line
2.1.4
At Thu, 9 Apr 2015 23:42:15 +0200,
Quoted 9 lines · Michael Gernoth
The functions
snd_emu10k1_proc_spdif_readandsnd_emu1010_fpga_readacquire theemu_lockbefore accessing the FPGA. The function used to access the FPGA (snd_emu1010_fpga_read) also tries to take theemu_lockwhich causes a deadlock.
Remove the outer locking in the proc-functions (guarding only the already safe fpga read) to prevent this deadlock.Signed-off-by Michael Gernoth <[email protected]>
Oh, this is a really old bug. Thanks for spotting out. Applied now with additional fixes (removing superfluous flags variables causing compile warnings).
Takashi
Quoted 54 lines
--- sound/pci/emu10k1/emuproc.c | 10 ---------- 1 file changed, 10 deletions(-)sound/pci/emu10k1/emuproc.c +0
-10@@ -245,27 +245,19 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry,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 {@@ -415,9 +407,7 @@ static void snd_emu_proc_emu1010_reg_read(struct snd_info_entry *entry,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 ); } }Signature · 6 lines
2.1.4 _______________________________________________ Alsa-devel mailing list [email protected] http://mailman.alsa-project.org/mailman/listinfo/alsa-devel