[RFC PATCH v2 0/5] ASoC: soc-pcm: fix trigger race conditions with shared BE

Sameer Pujar spujar at nvidia.com
Wed Oct 6 16:22:40 CEST 2021


Hi Pierre,

On 10/5/2021 6:47 PM, Pierre-Louis Bossart wrote:
>
> My patches don't change anything related to a spinlock or pcm stream
> management, so not sure what could cause this rather spectacular
> failure. That hints at a fundamental configuration difference, possibly
> caused by your component chaining?
>
> Since in your case you have a 1:1 mapping between FE and BE, would you
> mind testing by backtracking, one patch at a time to see which one of
> the three last patches could cause a problem on your board?

I tested this further. It appears that things work fine till 'patch 3/5' 
of yours. After I take 'patch 4/5', the print "BUG: scheduling while 
atomic: aplay" started showing up and I see a hang. This failure was 
seen for 2x1 mixer test itself.

The 'patch 4/5' introduces mutex_lock/unlock() in dpcm_be_dai_trigger(). 
This seems to be the problem, since trigger() runs in atomic context 
depending on the PCM 'nonatomic' flag. I am not sure if your design sets 
'nonatomic' flag by default and that is why the issue is not seen at 
your end?

With below (just for testing purpose), tests ran well. I was able to run 
2x1, 3x1 ... 10x1 mixer tests.

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index e5df898..2ce30d1 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -2045,7 +2045,7 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime 
*fe, int stream,
         struct snd_soc_dpcm *dpcm;
         int ret = 0;

-       mutex_lock(&fe->card->dpcm_mutex);
+       //mutex_lock(&fe->card->dpcm_mutex);
         for_each_dpcm_be(fe, stream, dpcm) {
                 struct snd_pcm_substream *be_substream;

@@ -2166,7 +2166,7 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime 
*fe, int stream,
                 }
         }
  end:
-       mutex_unlock(&fe->card->dpcm_mutex);
+       //mutex_unlock(&fe->card->dpcm_mutex);
         if (ret < 0)
                 dev_err(fe->dev, "ASoC: %s() failed at %s (%d)\n",
                         __func__, be->dai_link->name, ret);


In fact I picked up all of your patches + above test patch, it worked fine.


Thanks,
Sameer.


More information about the Alsa-devel mailing list