ASoC: SOF: fix race in FW boot timeout handling
authorKai Vehmanen <kai.vehmanen@linux.intel.com>
Thu, 9 May 2019 20:10:23 +0000 (15:10 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 13 May 2019 11:37:12 +0000 (12:37 +0100)
A race condition exists in handling firmware boot timeout.
If FW sends FW_READY just after boot timeout has expired in
driver, a kernel exception will result as FW_READY handler
will be run while the state is still being cleaned up in
snd_sof_run_firmware(). Avoid the race by setting
boot_complete also in the error case.

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/loader.c

index 81c7452..628fae5 100644 (file)
@@ -372,6 +372,8 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
                                 msecs_to_jiffies(sdev->boot_timeout));
        if (ret == 0) {
                dev_err(sdev->dev, "error: firmware boot failure\n");
+               /* after this point FW_READY msg should be ignored */
+               sdev->boot_complete = true;
                snd_sof_dsp_dbg_dump(sdev, SOF_DBG_REGS | SOF_DBG_MBOX |
                        SOF_DBG_TEXT | SOF_DBG_PCI);
                return -EIO;