• Kai Vehmanen's avatar
    ASoC: hdac_hda: fix deadlock after PCM open error · 06f07e23
    Kai Vehmanen authored
    Commit 5bd70440 ("ASoC: soc-dai: revert all changes to DAI
    startup/shutdown sequence"), introduced a slight change of semantics
    to DAI startup/shutdown. If startup() returns an error, shutdown()
    is now called for the DAI.
    
    This causes a deadlock in hdac_hda which issues a call to
    snd_hda_codec_pcm_put() in case open fails. Upon error, soc_pcm_open()
    will call shutdown(), and pcm_put() ends up getting called twice. Result
    is a deadlock on pcm->open_mutex, as snd_device_free() gets called from
    within snd_pcm_open(). Typical task backtrace looks like this:
    
    [  334.244627]  snd_pcm_dev_disconnect+0x49/0x340 [snd_pcm]
    [  334.244634]  __snd_device_disconnect.part.0+0x2c/0x50 [snd]
    [  334.244640]  __snd_device_free+0x7f/0xc0 [snd]
    [  334.244650]  snd_hda_codec_pcm_put+0x87/0x120 [snd_hda_codec]
    [  334.244660]  soc_pcm_open+0x6a0/0xbe0 [snd_soc_core]
    [  334.244676]  ? dpcm_add_paths.isra.0+0x491/0x590 [snd_soc_core]
    [  334.244679]  ? kfree+0x9a/0x230
    [  334.244686]  dpcm_be_dai_startup+0x255/0x300 [snd_soc_core]
    [  334.244695]  dpcm_fe_dai_open+0x20e/0xf30 [snd_soc_core]
    [  334.244701]  ? snd_pcm_hw_rule_muldivk+0x110/0x110 [snd_pcm]
    [  334.244709]  ? dpcm_be_dai_startup+0x300/0x300 [snd_soc_core]
    [  334.244714]  ? snd_pcm_attach_substream+0x3c4/0x540 [snd_pcm]
    [  334.244719]  snd_pcm_open_substream+0x69a/0xb60 [snd_pcm]
    [  334.244729]  ? snd_pcm_release_substream+0x30/0x30 [snd_pcm]
    [  334.244732]  ? __mutex_lock_slowpath+0x10/0x10
    [  334.244736]  snd_pcm_open+0x1b3/0x3c0 [snd_pcm]
    
    Fixes: 5bd70440 ("ASoC: soc-dai: revert all changes to DAI startup/shutdown sequence")
    Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
    Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Reviewed-by: default avatarRander Wang <rander.wang@linux.intel.com>
    BugLink: https://github.com/thesofproject/linux/issues/2159
    Link: https://lore.kernel.org/r/20200717101950.3885187-3-kai.vehmanen@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    06f07e23
hdac_hda.c 16.3 KB