ANDROID: GKI: 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.

Bug: 161414994
Change-Id: I9fbaaa0cb9c7e600e2a2998425d471534306dfb5
Signed-off-by: Banajit Goswami <bgoswami@codeaurora.org>
Signed-off-by: Meng Wang <mwang@codeaurora.org>
(cherry picked from commit ac4a58336b)
Signed-off-by: Will McVicker <willmcvicker@google.com>
This commit is contained in:
Banajit Goswami 2016-11-21 20:46:10 -08:00 committed by Will McVicker
parent b777af4bb9
commit 94379da3fd

View file

@ -723,7 +723,8 @@ static int snd_compr_stop(struct snd_compr_stream *stream)
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;
}
@ -769,41 +770,6 @@ int snd_compr_stop_error(struct snd_compr_stream *stream,
}
EXPORT_SYMBOL_GPL(snd_compr_stop_error);
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 notification 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\n");
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;
@ -821,13 +787,13 @@ static int snd_compr_drain(struct snd_compr_stream *stream)
}
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)
@ -881,14 +847,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_compr_set_next_track_param(struct snd_compr_stream *stream,