lkml.org 
[lkml]   [2019]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 146/413] ASoC: soc-core: call snd_soc_unbind_card() under mutex_lock;
    Date
    [ Upstream commit b545542a0b866f7975254e41c595836e9bc0ff2f ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 41c0cfaf2db5..9138fcb15cd3 100644
    --- a/sound/soc/soc-core.c
    +++ b/sound/soc/soc-core.c
    @@ -2837,14 +2837,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)
    @@ -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)
    {
    + 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.20.1


    \
     
     \ /
      Last update: 2019-07-24 22:33    [W:2.466 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site