aboutsummaryrefslogtreecommitdiffstats
path: root/sound/core/pcm.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2012-10-16 16:43:39 +0200
committerTakashi Iwai <tiwai@suse.de>2012-10-30 11:07:15 +0100
commit0914f7961babbf28aaa2f19b453951fb4841c03f (patch)
treefe5c14256a1d7b2116341300dd1e8ed94ac5f576 /sound/core/pcm.c
parentALSA: Add a reference counter to card instance (diff)
downloadlinux-dev-0914f7961babbf28aaa2f19b453951fb4841c03f.tar.xz
linux-dev-0914f7961babbf28aaa2f19b453951fb4841c03f.zip
ALSA: Avoid endless sleep after disconnect
When disconnect callback is called, each component should wake up sleepers and check card->shutdown flag for avoiding the endless sleep blocking the proper resource release. Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to '')
-rw-r--r--sound/core/pcm.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sound/core/pcm.c b/sound/core/pcm.c
index 993b2405fdfe..030102caeee9 100644
--- a/sound/core/pcm.c
+++ b/sound/core/pcm.c
@@ -1087,12 +1087,16 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
goto unlock;
mutex_lock(&pcm->open_mutex);
+ wake_up(&pcm->open_wait);
list_del_init(&pcm->list);
for (cidx = 0; cidx < 2; cidx++)
for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) {
snd_pcm_stream_lock_irq(substream);
- if (substream->runtime)
+ if (substream->runtime) {
substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED;
+ wake_up(&substream->runtime->sleep);
+ wake_up(&substream->runtime->tsleep);
+ }
snd_pcm_stream_unlock_irq(substream);
}
list_for_each_entry(notify, &snd_pcm_notify_list, list) {