summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>2019-02-08 17:29:53 -0600
committerTakashi Iwai <tiwai@suse.de>2019-02-11 17:04:25 +0100
commitd9c0b2afe820fa3b3f8258a659daee2cc71ca3ef (patch)
tree165d2ab2cff3c31d3a3c91ea2a9c960810c2a185
parentbb580602f3924976d8bc36c171266de73e92cbf7 (diff)
downloadlinux-d9c0b2afe820fa3b3f8258a659daee2cc71ca3ef.tar.gz
linux-d9c0b2afe820fa3b3f8258a659daee2cc71ca3ef.tar.bz2
linux-d9c0b2afe820fa3b3f8258a659daee2cc71ca3ef.zip
ALSA: PCM: check if ops are defined before suspending PCM
BE dai links only have internal PCM's and their substream ops may not be set. Suspending these PCM's will result in their ops->trigger() being invoked and cause a kernel oops. So skip suspending PCM's if their ops are NULL. [ NOTE: this change is required now for following the recent PCM core change to get rid of snd_pcm_suspend() call. Since DPCM BE takes the runtime carried from FE while keeping NULL ops, it can hit this bug. See details at: https://github.com/thesofproject/linux/pull/582 -- tiwai ] Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/core/pcm_native.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 672babd20cb1..f731f904e8cc 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -1520,6 +1520,14 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm)
/* FIXME: the open/close code should lock this as well */
if (substream->runtime == NULL)
continue;
+
+ /*
+ * Skip BE dai link PCM's that are internal and may
+ * not have their substream ops set.
+ */
+ if (!substream->ops)
+ continue;
+
err = snd_pcm_suspend(substream);
if (err < 0 && err != -EBUSY)
return err;