Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Lars-Peter Clausen <lars@metafoo.de>
Cc: Simon <horms@verge.net.au>,
	Linux-ALSA <alsa-devel@alsa-project.org>,
	Mark Brown <broonie@kernel.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Subject: Re: [PATCH 4/4] ASoC: soc-core: call snd_soc_remove_card() when component del
Date: Mon, 09 Feb 2015 14:07:21 +0100	[thread overview]
Message-ID: <s5hpp9jtera.wl-tiwai@suse.de> (raw)
In-Reply-To: <54D8994A.5090906@metafoo.de>

At Mon, 09 Feb 2015 12:26:02 +0100,
Lars-Peter Clausen wrote:
> 
> On 02/09/2015 11:48 AM, Takashi Iwai wrote:
> > At Mon, 9 Feb 2015 08:52:49 +0000,
> > Kuninori Morimoto wrote:
> >>
> >> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> >>
> >> ASoC devices are organized as CPU-CARD-CODEC. Then, CPU/CODEC
> >> are based on component structure. Now, each CARD device knows
> >> connected component. But CARD doesn't notice if connected component
> >> was removed when user called rmmod or unbind in current implementation.
> >> Thus, CARD which lost some components still exist in system.
> >> And then, ALSA sound card will have some problem if user used this CARD
> >> in such timing. This patch temporarily removes CARD from system
> >> if connected component was removed, and re-add it if some component
> >> was added.
> >>
> >> Reported-by: Nguyen Viet Dung <nv-dung@jinso.co.jp>
> >> Reported-by: Bui Duc Phuc <bd-phuc@jinso.co.jp>
> >> Reported-by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
> >> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> >> ---
> >>   include/sound/soc.h  |    1 +
> >>   sound/soc/soc-core.c |   26 ++++++++++++++++++++++++++
> >>   2 files changed, 27 insertions(+)
> >>
> >> diff --git a/include/sound/soc.h b/include/sound/soc.h
> >> index b4fca9a..a90eff4 100644
> >> --- a/include/sound/soc.h
> >> +++ b/include/sound/soc.h
> >> @@ -1083,6 +1083,7 @@ struct snd_soc_card {
> >>   	struct list_head paths;
> >>   	struct list_head dapm_list;
> >>   	struct list_head dapm_dirty;
> >> +	struct list_head unbinded_list;
> >>
> >>   	/* Generic DAPM context for the card */
> >>   	struct snd_soc_dapm_context dapm;
> >> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> >> index b7ab676..f8d5498 100644
> >> --- a/sound/soc/soc-core.c
> >> +++ b/sound/soc/soc-core.c
> >> @@ -56,6 +56,7 @@ static DEFINE_MUTEX(client_mutex);
> >>   static LIST_HEAD(platform_list);
> >>   static LIST_HEAD(codec_list);
> >>   static LIST_HEAD(component_list);
> >> +static LIST_HEAD(unbinded_card_list);
> >>
> >>   /*
> >>    * This is a timeout to do a DAPM powerdown after a stream is closed().
> >> @@ -2406,6 +2407,10 @@ int snd_soc_unregister_card(struct snd_soc_card *card)
> >>   		dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
> >>   	}
> >>
> >> +	mutex_lock(&client_mutex);
> >> +	list_del(&card->unbinded_list);
> >> +	mutex_unlock(&client_mutex);
> >> +
> >>   	return 0;
> >>   }
> >>   EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
> >> @@ -2669,6 +2674,9 @@ EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
> >>
> >>   static void snd_soc_component_add_unlocked(struct snd_soc_component *component)
> >>   {
> >> +	struct snd_soc_card *card, *_card;
> >> +	int ret;
> >> +
> >>   	if (!component->write && !component->read) {
> >>   		if (!component->regmap)
> >>   			component->regmap = dev_get_regmap(component->dev, NULL);
> >> @@ -2677,6 +2685,16 @@ static void snd_soc_component_add_unlocked(struct snd_soc_component *component)
> >>   	}
> >>
> >>   	list_add(&component->list, &component_list);
> >> +
> >> +	/* re-add temporarily removed card if exist */
> >> +	list_for_each_entry_safe(card, _card, &unbinded_card_list,
> >> +				 unbinded_list) {
> >> +		ret = snd_soc_instantiate_card(card);
> >> +		if (ret < 0)
> >> +			continue;
> >> +
> >> +		list_del(&card->unbinded_list);
> >> +	}
> >
> > [Cc'ed Lars-Peter]
> >
> > This would instantiate a card even if it's irrelevant with the given
> > component?  If so, it looks fragile, and possibly racy, when there are
> > multiple cards.
> 
> That shouldn't be a problem. snd_soc_instantiate_card() does the proper 
> locking and will return an error if not all components are ready yet.

But there is no check of card->instantiated there, so the whole path
can be called again even if the card was already instantiated?


Takashi

  reply	other threads:[~2015-02-09 13:07 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-09  8:51 [PATCH 0/4 v3] ASoC: rsnd: tidyup .remove method Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 1/4] ASoC: soc-core: add snd_soc_remove_card() Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 2/4] ASoC: soc-core: deactivate pins in snd_soc_instantiate_card() Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 3/4] ASoC: soc-core: call soc_cleanup_card_debugfs() from snd_soc_unregister_card() Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 4/4] ASoC: soc-core: call snd_soc_remove_card() when component del Kuninori Morimoto
2015-02-09 10:48   ` Takashi Iwai
2015-02-09 11:26     ` Lars-Peter Clausen
2015-02-09 13:07       ` Takashi Iwai [this message]
2015-02-09 13:09         ` Lars-Peter Clausen
2015-02-09 13:35           ` Takashi Iwai
2015-02-09 14:11             ` Lars-Peter Clausen
2015-02-10  0:44       ` Kuninori Morimoto
2015-02-10 12:28         ` Lars-Peter Clausen
2015-02-13  0:24           ` Kuninori Morimoto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s5hpp9jtera.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=horms@verge.net.au \
    --cc=kuninori.morimoto.gx@renesas.com \
    --cc=lars@metafoo.de \
    --cc=lgirdwood@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox