diff options
| author | Banajit Goswami <bgoswami@codeaurora.org> | 2014-09-10 12:37:24 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:10:48 -0700 |
| commit | 5200617101d49f83ca20a3cb5ef336fa76b000e1 (patch) | |
| tree | ccd996f3af7b48f0574650172fdf2786a4df8b5f | |
| parent | 575eeabce906e0a173b03efe01feada4d64c39fd (diff) | |
ASoC: compress: revert some code to avoid race condition
Revert some changes for compress offload path to avoid race
condition in drain and paartial-drain cases.
Signed-off-by: Banajit Goswami <bgoswami@codeaurora.org>
| -rw-r--r-- | sound/core/compress_offload.c | 52 |
1 files changed, 6 insertions, 46 deletions
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 6017a27936ab..7b50da9d73e3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -677,48 +677,14 @@ static int snd_compr_stop(struct snd_compr_stream *stream) return -EPERM; retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); if (!retval) { - snd_compr_drain_notify(stream); + stream->runtime->state = SNDRV_PCM_STATE_SETUP; + wake_up(&stream->runtime->sleep); stream->runtime->total_bytes_available = 0; stream->runtime->total_bytes_transferred = 0; } return retval; } -static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) -{ - int ret; - - /* - * We are called with lock held. So drop the lock while we wait for - * drain complete notfication from the driver - * - * It is expected that driver will notify the drain completion and then - * stream will be moved to SETUP state, even if draining resulted in an - * error. We can trigger next track after this. - */ - stream->runtime->state = SNDRV_PCM_STATE_DRAINING; - mutex_unlock(&stream->device->lock); - - /* we wait for drain to complete here, drain can return when - * interruption occurred, wait returned error or success. - * For the first two cases we don't do anything different here and - * return after waking up - */ - - ret = wait_event_interruptible(stream->runtime->sleep, - (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); - if (ret == -ERESTARTSYS) - pr_debug("wait aborted by a signal"); - else if (ret) - pr_debug("wait for drain failed with %d\n", ret); - - - wake_up(&stream->runtime->sleep); - mutex_lock(&stream->device->lock); - - return ret; -} - static int snd_compr_drain(struct snd_compr_stream *stream) { int retval; @@ -728,13 +694,12 @@ static int snd_compr_drain(struct snd_compr_stream *stream) return -EPERM; retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); - if (retval) { - pr_debug("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval); + if (!retval) { + stream->runtime->state = SNDRV_PCM_STATE_DRAINING; wake_up(&stream->runtime->sleep); - return retval; } - return snd_compress_wait_for_drain(stream); + return retval; } static int snd_compr_next_track(struct snd_compr_stream *stream) @@ -770,14 +735,9 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream) return -EPERM; retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); - if (retval) { - pr_debug("Partial drain returned failure\n"); - wake_up(&stream->runtime->sleep); - return retval; - } stream->next_track = false; - return snd_compress_wait_for_drain(stream); + return retval; } static int snd_compress_simple_ioctls(struct file *file, |
