summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBanajit Goswami <bgoswami@codeaurora.org>2014-09-10 12:37:24 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:10:48 -0700
commit5200617101d49f83ca20a3cb5ef336fa76b000e1 (patch)
treeccd996f3af7b48f0574650172fdf2786a4df8b5f
parent575eeabce906e0a173b03efe01feada4d64c39fd (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.c52
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,