ASoC: soc-core: call snd_soc_unbind_card() under mutex_lock;
commit 34ac3c3eb8f0c07 ("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 495f926c68ddb90 ("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: 34ac3c3eb8f0c07 ("ASoC: core: lock client_mutex while removing link components") Fixes: 495f926c68ddb90 ("ASoC: core: Fix deadlock in snd_soc_instantiate_card()") Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
281c443f1e
commit
b545542a0b
@ -2837,14 +2837,12 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
|
|||||||
snd_soc_dapm_shutdown(card);
|
snd_soc_dapm_shutdown(card);
|
||||||
snd_soc_flush_all_delayed_work(card);
|
snd_soc_flush_all_delayed_work(card);
|
||||||
|
|
||||||
mutex_lock(&client_mutex);
|
|
||||||
/* remove all components used by DAI links on this card */
|
/* remove all components used by DAI links on this card */
|
||||||
for_each_comp_order(order) {
|
for_each_comp_order(order) {
|
||||||
for_each_card_rtds(card, rtd) {
|
for_each_card_rtds(card, rtd) {
|
||||||
soc_remove_link_components(card, rtd, order);
|
soc_remove_link_components(card, rtd, order);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mutex_unlock(&client_mutex);
|
|
||||||
|
|
||||||
soc_cleanup_card_resources(card);
|
soc_cleanup_card_resources(card);
|
||||||
if (!unregister)
|
if (!unregister)
|
||||||
@ -2863,7 +2861,9 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
|
|||||||
*/
|
*/
|
||||||
int snd_soc_unregister_card(struct snd_soc_card *card)
|
int snd_soc_unregister_card(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
|
mutex_lock(&client_mutex);
|
||||||
snd_soc_unbind_card(card, true);
|
snd_soc_unbind_card(card, true);
|
||||||
|
mutex_unlock(&client_mutex);
|
||||||
dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
|
dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user