• Keyon Jie's avatar
    ASoC: SOF: Intel: hda-stream: fix a deadlock with bus->reg_lock · 7fd572e7
    Keyon Jie authored
    We should use irq disabled mode when read/write hda registers from
    thread context, as we need to hold the same bus->reg_lock in interrupt
    context hda_dsp_stream_interrupt(), otherwise, when we are holding the
    lock in hda_dsp_stream_hw_free() and the interrupt arrives, we will get
    deadlock in the interrupt handler.
    
    Error logs like this:
    
    [    5.603606]        CPU0
    [    5.603606]        ----
    [    5.603607]   lock(&(&bus->reg_lock)->rlock);
    [    5.603608]   <Interrupt>
    [    5.603609]     lock(&(&bus->reg_lock)->rlock);
    [    5.603610]
                    *** DEADLOCK ***
    
    [    5.603611] 2 locks held by pulseaudio/2329:
    [    5.603612]  #0: 000000005fcf26c6 (&card->mutex/1){+.+.}, at: dpcm_fe_dai_hw_free+0x2b/0x110 [snd_soc_core]
    [    5.603619]  #1: 00000000ef369faf (&rtd->pcm_mutex){+.+.}, at: soc_pcm_hw_free+0x2e/0x1c0 [snd_soc_core]
    
    The fix is simple, let's switch to use spin_lock/unlock_irq().
    Reported-by: default avatarXun Zhang <xun2.zhang@intel.com>
    Signed-off-by: default avatarKeyon Jie <yang.jie@linux.intel.com>
    Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    7fd572e7
hda-stream.c 19.7 KB