[alsa-devel] [PATCH] ASoC: soc-core: call snd_soc_unbind_card() under mutex_lock;

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Mon Jun 24 03:09:08 CEST 2019


Hi Ranjani

Thank you for your confirming.
Can you give it your Acked-by ?
It is easy for Mark, I think.

> > > From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> > > 
> > > 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.
> 
> Thanks, morimoto-san. You are correct. Case 1 will result in a lockdep
> warning. This patch looks good. 
> 
> Thanks,
> Ranjani
> > > 
> > > 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 at renesas.com>
> > > ---
> > >  sound/soc/soc-core.c | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> > > index 2353886..2a408cc 100644
> > > --- a/sound/soc/soc-core.c
> > > +++ b/sound/soc/soc-core.c
> > > @@ -2747,14 +2747,12 @@ static void snd_soc_unbind_card(struct
> > > snd_soc_card *card, bool unregister)
> > >  		snd_soc_dapm_shutdown(card);
> > >  		snd_soc_flush_all_delayed_work(card);
> > >  
> > > -		mutex_lock(&client_mutex);
> > >  		/* remove all components used by DAI links on this card
> > > */
> > >  		for_each_comp_order(order) {
> > >  			for_each_card_rtds(card, rtd) {
> > >  				soc_remove_link_components(card, rtd,
> > > order);
> > >  			}
> > >  		}
> > > -		mutex_unlock(&client_mutex);
> > >  
> > >  		soc_cleanup_card_resources(card);
> > >  		if (!unregister)
> > > @@ -2773,7 +2771,9 @@ static void snd_soc_unbind_card(struct
> > > snd_soc_card *card, bool unregister)
> > >   */
> > >  int snd_soc_unregister_card(struct snd_soc_card *card)
> > >  {
> > > +	mutex_lock(&client_mutex);
> > >  	snd_soc_unbind_card(card, true);
> > > +	mutex_unlock(&client_mutex);
> > >  	dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card-
> > > >name);
> > >  
> > >  	return 0;
> > > -- 
> > > 2.7.4
> > > 
> 


More information about the Alsa-devel mailing list