lkml.org 
[lkml]   [2021]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 055/329] ASoC: soc-compress: lock pcm_mutex to resolve lockdep error
    Date
    From: Gyeongtaek Lee <gt82.lee@samsung.com>

    [ Upstream commit 45475bf60cc1d42da229a0aa757180c88bab8d22 ]

    If panic_on_warn=1 is added in bootargs and compress offload playback with
    DPCM is started, kernel panic would be occurred because rtd->card->pcm_mutex
    isn't held in soc_compr_open_fe() and soc_compr_free_fe() and it generates
    lockdep warning in the following code.

    void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd,
    int stream, int action)
    {
    struct snd_soc_dai *dai;
    int i;

    lockdep_assert_held(&rtd->card->pcm_mutex);

    To prevent lockdep warning but minimize side effect by adding mutex,
    pcm_mutex is held just before snd_soc_runtime_activate() and
    snd_soc_runtime_deactivate() and is released right after them.

    Signed-off-by: Gyeongtaek Lee <gt82.lee@samsung.com>
    Link: https://lore.kernel.org/r/1891546521.01617772502282.JavaMail.epsvc@epcpadp3
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/soc-compress.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
    index 246a5e32e22a..b4810266f5e5 100644
    --- a/sound/soc/soc-compress.c
    +++ b/sound/soc/soc-compress.c
    @@ -153,7 +153,9 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
    fe->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
    fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;

    + mutex_lock_nested(&fe->card->pcm_mutex, fe->card->pcm_subclass);
    snd_soc_runtime_activate(fe, stream);
    + mutex_unlock(&fe->card->pcm_mutex);

    mutex_unlock(&fe->card->mutex);

    @@ -181,7 +183,9 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)

    mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);

    + mutex_lock_nested(&fe->card->pcm_mutex, fe->card->pcm_subclass);
    snd_soc_runtime_deactivate(fe, stream);
    + mutex_unlock(&fe->card->pcm_mutex);

    fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-05-17 16:40    [W:2.289 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site