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:
parent
b777af4bb9
commit
94379da3fd
1 changed files with 6 additions and 45 deletions
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue