ASoC: Intel: Skylake: Acquire irq after RIRB allocation
authorYong Zhi <yong.zhi@intel.com>
Mon, 13 Aug 2018 23:15:14 +0000 (18:15 -0500)
committerMark Brown <broonie@kernel.org>
Tue, 14 Aug 2018 15:21:13 +0000 (16:21 +0100)
Cold reboot stress test found that the hda irq could access rirb ring
buffer before its memory gets allocated which resulting in null
pointer dereference inside snd_hdac_bus_update_rirb().

Fix it by moving the skl_acquire_irq after ring buffer allocation.
While here, also change err return from -EBUSY to actual error code.

Signed-off-by: Yong Zhi <yong.zhi@intel.com>
Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl.c

index dce64948564940ea7383e0f4975de4b4ec7293ec..cf09721ca13efd5f7fbde988a75c1bf9b1ed1c69 100644 (file)
@@ -838,11 +838,7 @@ static int skl_first_init(struct hdac_bus *bus)
 
        snd_hdac_bus_parse_capabilities(bus);
 
-       if (skl_acquire_irq(bus, 0) < 0)
-               return -EBUSY;
-
        pci_set_master(pci);
-       synchronize_irq(bus->irq);
 
        gcap = snd_hdac_chip_readw(bus, GCAP);
        dev_dbg(bus->dev, "chipset global capabilities = 0x%x\n", gcap);
@@ -875,6 +871,12 @@ static int skl_first_init(struct hdac_bus *bus)
        if (err < 0)
                return err;
 
+       err = skl_acquire_irq(bus, 0);
+       if (err < 0)
+               return err;
+
+       synchronize_irq(bus->irq);
+
        /* initialize chip */
        skl_init_pci(skl);