From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754165AbWKGL4m (ORCPT ); Tue, 7 Nov 2006 06:56:42 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754202AbWKGL4l (ORCPT ); Tue, 7 Nov 2006 06:56:41 -0500 Received: from mail.suse.de ([195.135.220.2]:30692 "EHLO mx1.suse.de") by vger.kernel.org with ESMTP id S1754165AbWKGL4l (ORCPT ); Tue, 7 Nov 2006 06:56:41 -0500 Date: Tue, 07 Nov 2006 12:56:33 +0100 Message-ID: From: Takashi Iwai To: Andi Kleen Cc: alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Subject: Re: [Alsa-devel] double fault in 2.6.19rc4-git5 while unplugging/replugging a USB headset In-Reply-To: <200611061803.42297.ak@suse.de> References: <200611060220.07024.ak@suse.de> <200611061803.42297.ak@suse.de> User-Agent: Wanderlust/2.12.0 (Your Wildest Dreams) SEMI/1.14.6 (Maruoka) FLIM/1.14.7 (=?ISO-8859-4?Q?Sanj=F2?=) APEL/10.6 MULE XEmacs/21.5 (beta25) (eggplant) (+CVS-20060326) (i386-suse-linux) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org At Mon, 6 Nov 2006 18:03:42 +0100, Andi Kleen wrote: > > > > > > How did it happen? You plugged out a usb adaptor during xmms is > > running with OSS output mode? > > xmms was running yes. But I think the oops happened on replug. > > Long story: i had the headset connected during boot and my XMMS > insisted on outputing its music on it, which wasn't intended -- > i wanted it on the speakers connected to the motherboard sound chip. > > So i unplug the headset and restarted alsa initialization, > but it was very unhappy about cleaning up and couldn't initialize > the other sound card. I replugged the headset and then > I got the oops. OK I got a lockup with my laptop and usb-audio replugging and xmms, too. The patch below fixed the lockup problem on my machine. Could you check whether it fixes your case, too? thanks, Takashi diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 505b23e..e0821eb 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -2359,7 +2359,8 @@ static int snd_pcm_oss_release(struct in substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; snd_assert(substream != NULL, return -ENXIO); pcm = substream->pcm; - snd_pcm_oss_sync(pcm_oss_file); + if (!pcm->card->shutdown) + snd_pcm_oss_sync(pcm_oss_file); mutex_lock(&pcm->open_mutex); snd_pcm_oss_release_file(pcm_oss_file); mutex_unlock(&pcm->open_mutex); diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 37b4b10..66e24b5 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -1310,7 +1310,8 @@ static int snd_pcm_pre_prepare(struct sn int f_flags) { struct snd_pcm_runtime *runtime = substream->runtime; - if (runtime->status->state == SNDRV_PCM_STATE_OPEN) + if (runtime->status->state == SNDRV_PCM_STATE_OPEN || + runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) return -EBADFD; if (snd_pcm_running(substream)) return -EBUSY; @@ -1568,7 +1569,8 @@ static int snd_pcm_drop(struct snd_pcm_s runtime = substream->runtime; card = substream->pcm->card; - if (runtime->status->state == SNDRV_PCM_STATE_OPEN) + if (runtime->status->state == SNDRV_PCM_STATE_OPEN || + runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) return -EBADFD; snd_power_lock(card); diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index c82b01c..67202b9 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -1469,7 +1469,8 @@ static int snd_usb_hw_free(struct snd_pc subs->cur_audiofmt = NULL; subs->cur_rate = 0; subs->period_bytes = 0; - release_substream_urbs(subs, 0); + if (!subs->stream->chip->shutdown) + release_substream_urbs(subs, 0); return snd_pcm_free_vmalloc_buffer(substream); }