At Thu, 01 Nov 2012 10:13:00 -0700, <gre...@linuxfoundation.org> wrote: > > > This is a note to let you know that I've just added the patch titled > > ALSA: Avoid endless sleep after disconnect > > to the 3.0-stable tree which can be found at: > > http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
Could you hold on this? I'm going to rebase the whole patchset, so this one should be applied better with other patches altogether. Ditto for the patch alsa-pcm-fix-some-races-at-disconnection.patch. These two belong to other usb-audio disconnect fix patch series. thanks, Takashi > > The filename of the patch is: > alsa-avoid-endless-sleep-after-disconnect.patch > and it can be found in the queue-3.0 subdirectory. > > If you, or anyone else, feels it should not be added to the stable tree, > please let <stable@vger.kernel.org> know about it. > > > >From 0914f7961babbf28aaa2f19b453951fb4841c03f Mon Sep 17 00:00:00 2001 > From: Takashi Iwai <ti...@suse.de> > Date: Tue, 16 Oct 2012 16:43:39 +0200 > Subject: ALSA: Avoid endless sleep after disconnect > > From: Takashi Iwai <ti...@suse.de> > > commit 0914f7961babbf28aaa2f19b453951fb4841c03f upstream. > > 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. > > Signed-off-by: Takashi Iwai <ti...@suse.de> > Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org> > > --- > sound/core/control.c | 2 ++ > sound/core/hwdep.c | 7 +++++++ > sound/core/oss/pcm_oss.c | 4 ++++ > sound/core/pcm.c | 6 +++++- > sound/core/pcm_native.c | 8 ++++++++ > sound/core/rawmidi.c | 20 ++++++++++++++++++++ > 6 files changed, 46 insertions(+), 1 deletion(-) > > --- a/sound/core/control.c > +++ b/sound/core/control.c > @@ -1360,6 +1360,8 @@ static ssize_t snd_ctl_read(struct file > spin_unlock_irq(&ctl->read_lock); > schedule(); > remove_wait_queue(&ctl->change_sleep, &wait); > + if (ctl->card->shutdown) > + return -ENODEV; > if (signal_pending(current)) > return -ERESTARTSYS; > spin_lock_irq(&ctl->read_lock); > --- a/sound/core/hwdep.c > +++ b/sound/core/hwdep.c > @@ -128,6 +128,10 @@ static int snd_hwdep_open(struct inode * > mutex_unlock(&hw->open_mutex); > schedule(); > mutex_lock(&hw->open_mutex); > + if (hw->card->shutdown) { > + err = -ENODEV; > + break; > + } > if (signal_pending(current)) { > err = -ERESTARTSYS; > break; > @@ -451,12 +455,15 @@ static int snd_hwdep_dev_disconnect(stru > mutex_unlock(®ister_mutex); > return -EINVAL; > } > + mutex_lock(&hwdep->open_mutex); > + wake_up(&hwdep->open_wait); > #ifdef CONFIG_SND_OSSEMUL > if (hwdep->ossreg) > snd_unregister_oss_device(hwdep->oss_type, hwdep->card, > hwdep->device); > #endif > snd_unregister_device(SNDRV_DEVICE_TYPE_HWDEP, hwdep->card, > hwdep->device); > list_del_init(&hwdep->list); > + mutex_unlock(&hwdep->open_mutex); > mutex_unlock(®ister_mutex); > return 0; > } > --- a/sound/core/oss/pcm_oss.c > +++ b/sound/core/oss/pcm_oss.c > @@ -2441,6 +2441,10 @@ static int snd_pcm_oss_open(struct inode > mutex_unlock(&pcm->open_mutex); > schedule(); > mutex_lock(&pcm->open_mutex); > + if (pcm->card->shutdown) { > + err = -ENODEV; > + break; > + } > if (signal_pending(current)) { > err = -ERESTARTSYS; > break; > --- a/sound/core/pcm.c > +++ b/sound/core/pcm.c > @@ -1046,12 +1046,16 @@ static int snd_pcm_dev_disconnect(struct > 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) { > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -1507,6 +1507,10 @@ static int snd_pcm_drain(struct snd_pcm_ > down_read(&snd_pcm_link_rwsem); > snd_pcm_stream_lock_irq(substream); > remove_wait_queue(&to_check->sleep, &wait); > + if (card->shutdown) { > + result = -ENODEV; > + break; > + } > if (tout == 0) { > if (substream->runtime->status->state == > SNDRV_PCM_STATE_SUSPENDED) > result = -ESTRPIPE; > @@ -2153,6 +2157,10 @@ static int snd_pcm_open(struct file *fil > mutex_unlock(&pcm->open_mutex); > schedule(); > mutex_lock(&pcm->open_mutex); > + if (pcm->card->shutdown) { > + err = -ENODEV; > + break; > + } > if (signal_pending(current)) { > err = -ERESTARTSYS; > break; > --- a/sound/core/rawmidi.c > +++ b/sound/core/rawmidi.c > @@ -437,6 +437,10 @@ static int snd_rawmidi_open(struct inode > mutex_unlock(&rmidi->open_mutex); > schedule(); > mutex_lock(&rmidi->open_mutex); > + if (rmidi->card->shutdown) { > + err = -ENODEV; > + break; > + } > if (signal_pending(current)) { > err = -ERESTARTSYS; > break; > @@ -1006,6 +1010,8 @@ static ssize_t snd_rawmidi_read(struct f > spin_unlock_irq(&runtime->lock); > schedule(); > remove_wait_queue(&runtime->sleep, &wait); > + if (rfile->rmidi->card->shutdown) > + return -ENODEV; > if (signal_pending(current)) > return result > 0 ? result : -ERESTARTSYS; > if (!runtime->avail) > @@ -1249,6 +1255,8 @@ static ssize_t snd_rawmidi_write(struct > spin_unlock_irq(&runtime->lock); > timeout = schedule_timeout(30 * HZ); > remove_wait_queue(&runtime->sleep, &wait); > + if (rfile->rmidi->card->shutdown) > + return -ENODEV; > if (signal_pending(current)) > return result > 0 ? result : -ERESTARTSYS; > if (!runtime->avail && !timeout) > @@ -1624,9 +1632,20 @@ static int snd_rawmidi_dev_register(stru > static int snd_rawmidi_dev_disconnect(struct snd_device *device) > { > struct snd_rawmidi *rmidi = device->device_data; > + int dir; > > mutex_lock(®ister_mutex); > + mutex_lock(&rmidi->open_mutex); > + wake_up(&rmidi->open_wait); > list_del_init(&rmidi->list); > + for (dir = 0; dir < 2; dir++) { > + struct snd_rawmidi_substream *s; > + list_for_each_entry(s, &rmidi->streams[dir].substreams, list) { > + if (s->runtime) > + wake_up(&s->runtime->sleep); > + } > + } > + > #ifdef CONFIG_SND_OSSEMUL > if (rmidi->ossreg) { > if ((int)rmidi->device == midi_map[rmidi->card->number]) { > @@ -1641,6 +1660,7 @@ static int snd_rawmidi_dev_disconnect(st > } > #endif /* CONFIG_SND_OSSEMUL */ > snd_unregister_device(SNDRV_DEVICE_TYPE_RAWMIDI, rmidi->card, > rmidi->device); > + mutex_unlock(&rmidi->open_mutex); > mutex_unlock(®ister_mutex); > return 0; > } > > > Patches currently in stable-queue which might be from ti...@suse.de are > > queue-3.0/alsa-avoid-endless-sleep-after-disconnect.patch > queue-3.0/alsa-pcm-fix-some-races-at-disconnection.patch > -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html