From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754617AbYIZQNR (ORCPT ); Fri, 26 Sep 2008 12:13:17 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752468AbYIZQNE (ORCPT ); Fri, 26 Sep 2008 12:13:04 -0400 Received: from ns1.suse.de ([195.135.220.2]:45291 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752449AbYIZQND (ORCPT ); Fri, 26 Sep 2008 12:13:03 -0400 Date: Fri, 26 Sep 2008 18:13:00 +0200 Message-ID: From: Takashi Iwai To: Linus Torvalds Cc: Andrew Morton , linux-kernel@vger.kernel.org Subject: [GIT PULL] ALSA fixes 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 Emacs/22.2 (x86_64-suse-linux-gnu) MULE/5.0 (SAKAKI) 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 List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Linus, please pull another ALSA updates for 2.6.27-rc7 from: git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git for-linus These are fixes for possible mutex/semaphore deadlocks found via recent lockdep. The deadlock possibility is quite low and I guess it never happened in the real use yet, though. Thanks! Takashi == Takashi Iwai (2): ALSA: fix locking in snd_pcm_open*() and snd_rawmidi_open*() ALSA: remove unneeded power_mutex lock in snd_pcm_drop sound/core/pcm.c | 4 ++-- sound/core/pcm_native.c | 13 +++---------- sound/core/rawmidi.c | 4 ++-- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 9dd9bc7..ece25c7 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c @@ -781,7 +781,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, return -ENODEV; card = pcm->card; - down_read(&card->controls_rwsem); + read_lock(&card->ctl_files_rwlock); list_for_each_entry(kctl, &card->ctl_files, list) { if (kctl->pid == current->pid) { prefer_subdevice = kctl->prefer_pcm_subdevice; @@ -789,7 +789,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, break; } } - up_read(&card->controls_rwsem); + read_unlock(&card->ctl_files_rwlock); switch (stream) { case SNDRV_PCM_STREAM_PLAYBACK: diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index c49b9d9..c487025 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -1546,16 +1546,10 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) card = substream->pcm->card; if (runtime->status->state == SNDRV_PCM_STATE_OPEN || - runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) + runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED || + runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) return -EBADFD; - snd_power_lock(card); - if (runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) { - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (result < 0) - goto _unlock; - } - snd_pcm_stream_lock_irq(substream); /* resume pause */ if (runtime->status->state == SNDRV_PCM_STATE_PAUSED) @@ -1564,8 +1558,7 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); /* runtime->control->appl_ptr = runtime->status->hw_ptr; */ snd_pcm_stream_unlock_irq(substream); - _unlock: - snd_power_unlock(card); + return result; } diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index f7ea728..b917a9f 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -418,7 +418,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) mutex_lock(&rmidi->open_mutex); while (1) { subdevice = -1; - down_read(&card->controls_rwsem); + read_lock(&card->ctl_files_rwlock); list_for_each_entry(kctl, &card->ctl_files, list) { if (kctl->pid == current->pid) { subdevice = kctl->prefer_rawmidi_subdevice; @@ -426,7 +426,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) break; } } - up_read(&card->controls_rwsem); + read_unlock(&card->ctl_files_rwlock); err = snd_rawmidi_kernel_open(rmidi->card, rmidi->device, subdevice, fflags, rawmidi_file); if (err >= 0)