Re: [RFC PATCH v3 07/13] ASoC: soc-pcm: protect for_each_dpcm_be() loops

From: Sameer Pujar
Date: Fri Oct 15 2021 - 02:25:09 EST




On 10/13/2021 8:00 PM, Pierre-Louis Bossart wrote:
The D in DPCM stands for 'dynamic', which means that connections
between FE and BE can evolve.

Commit a97648697790 ("ASoC: dpcm: prevent snd_soc_dpcm use after
free") started to protect some of the for_each_dpcm_be() loops, but
there are still many cases that were not modified.

This patch adds protection for all the remaining loops, with the
notable exception of the dpcm_be_dai_trigger(), where the lock is
already taken at a higher level, e.g. in snd_pcm_period_elapsed().

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>
---
sound/soc/soc-pcm.c | 86 ++++++++++++++++++++-------------------------
1 file changed, 39 insertions(+), 47 deletions(-)

After this, once I load sound card there are warning prints and failure:

[   71.224324] WARNING: CPU: 3 PID: 574 at drivers/firmware/tegra/bpmp.c:362 tegra_bpmp_transfer+0x2d0/0x328
[   71.238032] ---[ end trace 88d978f78a82134f ]---
[   71.243033] WARNING: CPU: 3 PID: 574 at drivers/firmware/tegra/bpmp.c:362 tegra_bpmp_transfer+0x2d0/0x328
[   71.257022] ---[ end trace 88d978f78a821350 ]---
[   71.261965] tegra-audio-graph-card sound: Can't set plla rate for 270950400, err: -22
...


This happens because, now the atomicity is propagated to BE callbacks where the clock settings are done in hw_param(). On Tegra, the clock APIs are served by BPMP and warning is seen because of below.

  int tegra_bpmp_transfer()
  {

=>      if (WARN_ON(irqs_disabled()))
            return -EPERM;

        ...

  }


This results in hw_param() failure and all tests fail at my end.