A deadlock can be initiated by userspace via ioctl(SNDCTL_SEQ_OUTOFBAND)
on /dev/sequencer with TMR_ECHO midi event.
In this case the control flow is:
sound_ioctl()
-> case SND_DEV_SEQ:
case SND_DEV_SEQ2:
sequencer_ioctl()
-> case SNDCTL_SEQ_OUTOFBAND:
spin_lock_irqsave(&lock,flags);
play_event();
-> case EV_TIMING:
seq_timing_event()
-> case TMR_ECHO:
seq_copy_to_input()
-> spin_lock_irqsave(&lock,flags);
It seems that spin_lock_irqsave() around play_event() is not necessary,
because the only other call location in seq_startplay() makes the call
without acquiring spinlock.
So, the patch just removes spinlocks around play_event().
By the way, it removes unreachable code in seq_timing_event(),
since (seq_mode == SEQ_2) case is handled in the beginning.
Compile tested only.
Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||
|---|---|---|
| .. | ||
| dmasound | ||
| .gitignore | ||
| ad1848.c | ||
| ad1848.h | ||
| ad1848_mixer.h | ||
| aedsp16.c | ||
| audio.c | ||
| bin2hex.c | ||
| CHANGELOG | ||
| coproc.h | ||
| dev_table.c | ||
| dev_table.h | ||
| dmabuf.c | ||
| hex2hex.c | ||
| kahlua.c | ||
| Kconfig | ||
| Makefile | ||
| midi_ctrl.h | ||
| midi_synth.c | ||
| midi_synth.h | ||
| midibuf.c | ||
| mpu401.c | ||
| mpu401.h | ||
| msnd.c | ||
| msnd.h | ||
| msnd_classic.c | ||
| msnd_classic.h | ||
| msnd_pinnacle.c | ||
| msnd_pinnacle.h | ||
| opl3.c | ||
| opl3_hw.h | ||
| os.h | ||
| pas2.h | ||
| pas2_card.c | ||
| pas2_midi.c | ||
| pas2_mixer.c | ||
| pas2_pcm.c | ||
| pss.c | ||
| README.FIRST | ||
| sb.h | ||
| sb_audio.c | ||
| sb_card.c | ||
| sb_card.h | ||
| sb_common.c | ||
| sb_ess.c | ||
| sb_ess.h | ||
| sb_midi.c | ||
| sb_mixer.c | ||
| sb_mixer.h | ||
| sequencer.c | ||
| sleep.h | ||
| sound_calls.h | ||
| sound_config.h | ||
| sound_firmware.h | ||
| sound_timer.c | ||
| soundcard.c | ||
| soundvers.h | ||
| swarm_cs4297a.c | ||
| sys_timer.c | ||
| trix.c | ||
| tuning.h | ||
| uart401.c | ||
| uart6850.c | ||
| ulaw.h | ||
| v_midi.c | ||
| v_midi.h | ||
| vidc.c | ||
| vidc.h | ||
| vidc_fill.S | ||
| waveartist.c | ||
| waveartist.h | ||
The modular sound driver patches were funded by Red Hat Software (www.redhat.com). The sound driver here is thus a modified version of Hannu's code. Please bear that in mind when considering the appropriate forums for bug reporting. Alan Cox