• Kuninori Morimoto's avatar
    ASoC: soc-core: call snd_soc_unbind_card() under mutex_lock; · 95783489
    Kuninori Morimoto authored
    [ Upstream commit b545542a ]
    
    commit 34ac3c3e ("ASoC: core: lock client_mutex while removing
    link components") added mutex_lock() at soc_remove_link_components().
    
    Is is called from snd_soc_unbind_card()
    
    	snd_soc_unbind_card()
    =>		soc_remove_link_components()
    		soc_cleanup_card_resources()
    			soc_remove_dai_links()
    =>				soc_remove_link_components()
    
    And, there are 2 way to call it.
    
    (1)
    	snd_soc_unregister_component()
    **		mutex_lock()
    			snd_soc_component_del_unlocked()
    =>				snd_soc_unbind_card()
    **		mutex_unlock()
    
    (2)
    	snd_soc_unregister_card()
    =>		snd_soc_unbind_card()
    
    (1) case is already using mutex_lock() when it calles
    snd_soc_unbind_card(), thus, we will get lockdep warning.
    
    commit 495f926c ("ASoC: core: Fix deadlock in
    snd_soc_instantiate_card()") tried to fixup it, but still not
    enough. We still have lockdep warning when we try unbind/bind.
    
    We need mutex_lock() under snd_soc_unregister_card()
    instead of snd_remove_link_components()/snd_soc_unbind_card().
    
    Fixes: 34ac3c3e ("ASoC: core: lock client_mutex while removing link components")
    Fixes: 495f926c ("ASoC: core: Fix deadlock in snd_soc_instantiate_card()")
    Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    95783489
soc-core.c 98.1 KB