diff options
author | Ioan-Adrian Ratiu <adi@adirat.com> | 2017-01-05 00:37:46 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2017-01-05 07:35:00 +0100 |
commit | 1d0f953086f090a022f2c0e1448300c15372db46 (patch) | |
tree | 96e89154873d3b08b73e18d717e33631cb050f67 /include/linux/irq.h | |
parent | c7efff9284dfde95a11aaa811c9d8ec8167f0f6e (diff) | |
download | op-kernel-dev-1d0f953086f090a022f2c0e1448300c15372db46.zip op-kernel-dev-1d0f953086f090a022f2c0e1448300c15372db46.tar.gz |
ALSA: usb-audio: Fix irq/process data synchronization
Commit 16200948d83 ("ALSA: usb-audio: Fix race at stopping the stream") was
incomplete causing another more severe kernel panic, so it got reverted.
This fixes both the original problem and its fallout kernel race/crash.
The original fix is to move the endpoint member NULL clearing logic inside
wait_clear_urbs() so the irq triggering the urb completion doesn't call
retire_capture/playback_urb() after the NULL clearing and generate a panic.
However this creates a new race between snd_usb_endpoint_start()'s call
to wait_clear_urbs() and the irq urb completion handler which again calls
retire_capture/playback_urb() leading to a new NULL dereference.
We keep the EP deactivation code in snd_usb_endpoint_start() because
removing it will break the EP reference counting (see [1] [2] for info),
however we don't need the "can_sleep" mechanism anymore because a new
function was introduced (snd_usb_endpoint_sync_pending_stop()) which
synchronizes pending stops and gets called inside the pcm prepare callback.
It also makes sense to remove can_sleep because it was also removed from
deactivate_urbs() signature in [3] so we benefit from more simplification.
[1] commit 015618b90 ("ALSA: snd-usb: Fix URB cancellation at stream start")
[2] commit e9ba389c5 ("ALSA: usb-audio: Fix scheduling-while-atomic bug in PCM capture stream")
[3] commit ccc1696d5 ("ALSA: usb-audio: simplify endpoint deactivation code")
Fixes: f8114f8583bb ("Revert "ALSA: usb-audio: Fix race at stopping the stream"")
Signed-off-by: Ioan-Adrian Ratiu <adi@adirat.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'include/linux/irq.h')
0 files changed, 0 insertions, 0 deletions