From: "Péter Ujfalusi" <peter.ujfalusi@gmail.com>
To: Joao Paulo Goncalves <jpaulo.silvagoncalves@gmail.com>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>, Jaroslav Kysela <perex@perex.cz>,
Takashi Iwai <tiwai@suse.com>
Cc: Joao Paulo Goncalves <joao.goncalves@toradex.com>,
Jai Luthra <j-luthra@ti.com>,
alsa-devel@alsa-project.org, linux-sound@vger.kernel.org,
linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH] ASoC: ti: davinci-mcasp: Fix race condition during probe
Date: Thu, 18 Apr 2024 20:49:09 +0300 [thread overview]
Message-ID: <f0dcab9a-1f9d-4db5-b886-0d2174070f37@gmail.com> (raw)
In-Reply-To: <20240417184138.1104774-1-jpaulo.silvagoncalves@gmail.com>
On 17/04/2024 21:41, Joao Paulo Goncalves wrote:
> From: Joao Paulo Goncalves <joao.goncalves@toradex.com>
>
> When using davinci-mcasp as CPU DAI with simple-card, there are some
> conditions that cause simple-card to finish registering a sound card before
> davinci-mcasp finishes registering all sound components. This creates a
> non-working sound card from userspace with no problem indication apart
> from not being able to play/record audio on a PCM stream. The issue
> arises during simultaneous probe execution of both drivers. Specifically,
> the simple-card driver, awaiting a CPU DAI, proceeds as soon as
> davinci-mcasp registers its DAI. However, this process can lead to the
> client mutex lock (client_mutex in soc-core.c) being held or davinci-mcasp
> being preempted before PCM DMA registration on davinci-mcasp finishes.
> This situation occurs when the probes of both drivers run concurrently.
> Below is the code path for this condition. To solve the issue, defer
> davinci-mcasp CPU DAI registration to the last step in the audio part of
> it. This way, simple-card CPU DAI parsing will be deferred until all
> audio components are registered.
>
> Fail Code Path:
>
> simple-card.c: probe starts
> simple-card.c: simple_dai_link_of: simple_parse_node(..,cpu,..) returns EPROBE_DEFER, no CPU DAI yet
> davinci-mcasp.c: probe starts
> davinci-mcasp.c: devm_snd_soc_register_component() register CPU DAI
> simple-card.c: probes again, finish CPU DAI parsing and call devm_snd_soc_register_card()
> simple-card.c: finish probe
> davinci-mcasp.c: *dma_pcm_platform_register() register PCM DMA
> davinci-mcasp.c: probe finish
Interesting... Thanks for the details.
Acked-by: Peter Ujfalusi <peter.ujfalusi@gmail.com>
>
> Cc: stable@vger.kernel.org
> Fixes: 9fbd58cf4ab0 ("ASoC: davinci-mcasp: Choose PCM driver based on configured DMA controller")
Just to note that the DAI registration was always before the platform
registration (ever since the DAI driver started to register the
platform) and I think most TI (and probably other vendor's) driver does
things this way. McASP does a bit of lifting by requesting a DMA channel
to figure out the type of DMA...
> Signed-off-by: Joao Paulo Goncalves <joao.goncalves@toradex.com>
> ---
> sound/soc/ti/davinci-mcasp.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c
> index b892d66f78470..1e760c3155213 100644
> --- a/sound/soc/ti/davinci-mcasp.c
> +++ b/sound/soc/ti/davinci-mcasp.c
> @@ -2417,12 +2417,6 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
>
> mcasp_reparent_fck(pdev);
>
> - ret = devm_snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
> - &davinci_mcasp_dai[mcasp->op_mode], 1);
> -
> - if (ret != 0)
> - goto err;
> -
> ret = davinci_mcasp_get_dma_type(mcasp);
> switch (ret) {
> case PCM_EDMA:
> @@ -2449,6 +2443,12 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
> goto err;
> }
>
> + ret = devm_snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
> + &davinci_mcasp_dai[mcasp->op_mode], 1);
> +
> + if (ret != 0)
> + goto err;
> +
> no_audio:
> ret = davinci_mcasp_init_gpiochip(mcasp);
> if (ret) {
--
Péter
next prev parent reply other threads:[~2024-04-18 17:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-17 18:41 [PATCH] ASoC: ti: davinci-mcasp: Fix race condition during probe Joao Paulo Goncalves
2024-04-18 6:44 ` Jai Luthra
2024-04-18 17:49 ` Péter Ujfalusi [this message]
2024-04-19 10:03 ` Mark Brown
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=f0dcab9a-1f9d-4db5-b886-0d2174070f37@gmail.com \
--to=peter.ujfalusi@gmail.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=j-luthra@ti.com \
--cc=joao.goncalves@toradex.com \
--cc=jpaulo.silvagoncalves@gmail.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=stable@vger.kernel.org \
--cc=tiwai@suse.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