diff options
author | Takashi Iwai <tiwai@suse.de> | 2012-11-07 12:44:10 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-11-17 13:14:22 -0800 |
commit | 14565776bea2c57d2f8d1cd7aeee6a0723ac2a05 (patch) | |
tree | b4bfbe23023910f19a5aa5dfba340b08bf4816b9 /sound/usb/pcm.c | |
parent | ea7b69a0b6816926e85cedbe5e1b1b8d3e2e5500 (diff) | |
download | kernel_samsung_smdk4412-14565776bea2c57d2f8d1cd7aeee6a0723ac2a05.zip kernel_samsung_smdk4412-14565776bea2c57d2f8d1cd7aeee6a0723ac2a05.tar.gz kernel_samsung_smdk4412-14565776bea2c57d2f8d1cd7aeee6a0723ac2a05.tar.bz2 |
ALSA: usb-audio: Use rwsem for disconnect protection
commit 34f3c89fda4fba9fe689db22253ca8db2f5e6386 upstream.
Replace mutex with rwsem for codec->shutdown protection so that
concurrent accesses are allowed.
Also add the protection to snd_usb_autosuspend() and
snd_usb_autoresume(), too.
Reported-by: Matthieu CASTET <matthieu.castet@parrot.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'sound/usb/pcm.c')
-rw-r--r-- | sound/usb/pcm.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 93c8967..e9c47a4 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -350,7 +350,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, subs->period_bytes != params_period_bytes(hw_params) || subs->cur_rate != rate; - mutex_lock(&subs->stream->chip->shutdown_mutex); + down_read(&subs->stream->chip->shutdown_rwsem); if (subs->stream->chip->shutdown) { ret = -ENODEV; goto unlock; @@ -380,7 +380,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, } unlock: - mutex_unlock(&subs->stream->chip->shutdown_mutex); + up_read(&subs->stream->chip->shutdown_rwsem); return ret; } @@ -396,9 +396,9 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream) subs->cur_audiofmt = NULL; subs->cur_rate = 0; subs->period_bytes = 0; - mutex_lock(&subs->stream->chip->shutdown_mutex); + down_read(&subs->stream->chip->shutdown_rwsem); snd_usb_release_substream_urbs(subs, 0); - mutex_unlock(&subs->stream->chip->shutdown_mutex); + up_read(&subs->stream->chip->shutdown_rwsem); return snd_pcm_lib_free_vmalloc_buffer(substream); } @@ -418,7 +418,7 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) return -ENXIO; } - mutex_lock(&subs->stream->chip->shutdown_mutex); + down_read(&subs->stream->chip->shutdown_rwsem); if (subs->stream->chip->shutdown) { ret = -ENODEV; goto unlock; @@ -435,7 +435,7 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) ret = snd_usb_substream_prepare(subs, runtime); unlock: - mutex_unlock(&subs->stream->chip->shutdown_mutex); + up_read(&subs->stream->chip->shutdown_rwsem); return ret; } |