]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
ASoC: SOF: core: fix error handling with the probe workqueue
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 24 May 2019 19:09:19 +0000 (14:09 -0500)
committerMark Brown <broonie@kernel.org>
Tue, 28 May 2019 14:47:19 +0000 (15:47 +0100)
In some configurations, it's a requirement to split the probe in two,
with a second part handled in a workqueue (e.g. for HDMI support
which depends on the DRM modules).

SOF already handles these configurations but the error flow is
incorrect. When an error occurs in the workqueue, the probe has
technically already completed. If we release the resources on errors,
this generates kernel oops/use-after-free when the resources are
released a second time on module removal.

GitHub issue: https://github.com/thesofproject/linux/issues/945
Fixes: c16211d6226 ("ASoC: SOF: Add Sound Open Firmware driver core")
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/core.c

index 693ad83bffc9c32fba06d487960a3604e0a05632..5beda47cdf9fc748e9adec46d1fd1023a351d87b 100644 (file)
@@ -393,6 +393,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
 
        return 0;
 
+#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
 fw_run_err:
        snd_sof_fw_unload(sdev);
 fw_load_err:
@@ -401,6 +402,21 @@ ipc_err:
        snd_sof_free_debug(sdev);
 dbg_err:
        snd_sof_remove(sdev);
+#else
+
+       /*
+        * when the probe_continue is handled in a work queue, the
+        * probe does not fail so we don't release resources here.
+        * They will be released with an explicit call to
+        * snd_sof_device_remove() when the PCI/ACPI device is removed
+        */
+
+fw_run_err:
+fw_load_err:
+ipc_err:
+dbg_err:
+
+#endif
 
        return ret;
 }