Commit 2fa190ce authored by Kevin Strasser's avatar Kevin Strasser Committed by Mark Brown

ASoC: Intel: Fix pcm stream context restore crash

In some cases the pcm stream is closed while context has been
scheduled to be restored, causing a null pointer deref panic.
Cancel work to ensure stream does not get freed while work is
still active/pending.

Also, restoring the pcm context can be safely skipped after the
stream has been stopped. Check if pcm stream is still running
before restoring stream context to help pending work finish
more quickly in stream close path.
Signed-off-by: default avatarKevin Strasser <kevin.strasser@intel.com>
Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent d7b54c30
...@@ -164,7 +164,8 @@ static void sst_byt_pcm_work(struct work_struct *work) ...@@ -164,7 +164,8 @@ static void sst_byt_pcm_work(struct work_struct *work)
struct sst_byt_pcm_data *pcm_data = struct sst_byt_pcm_data *pcm_data =
container_of(work, struct sst_byt_pcm_data, work); container_of(work, struct sst_byt_pcm_data, work);
sst_byt_pcm_restore_stream_context(pcm_data->substream); if (snd_pcm_running(pcm_data->substream))
sst_byt_pcm_restore_stream_context(pcm_data->substream);
} }
static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd) static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
...@@ -277,6 +278,7 @@ static int sst_byt_pcm_close(struct snd_pcm_substream *substream) ...@@ -277,6 +278,7 @@ static int sst_byt_pcm_close(struct snd_pcm_substream *substream)
dev_dbg(rtd->dev, "PCM: close\n"); dev_dbg(rtd->dev, "PCM: close\n");
cancel_work_sync(&pcm_data->work);
mutex_lock(&pcm_data->mutex); mutex_lock(&pcm_data->mutex);
ret = sst_byt_stream_free(byt, pcm_data->stream); ret = sst_byt_stream_free(byt, pcm_data->stream);
if (ret < 0) { if (ret < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment