All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Cc: alsa-devel@alsa-project.org,
	Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
	Sameer Pujar <spujar@nvidia.com>,
	vkoul@kernel.org, broonie@kernel.org,
	Gyeongtaek Lee <gt82.lee@samsung.com>,
	Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Subject: Re: [RFC PATCH v2 0/5] ASoC: soc-pcm: fix trigger race conditions with shared BE
Date: Tue, 12 Oct 2021 08:34:07 +0200	[thread overview]
Message-ID: <s5htuhm3g68.wl-tiwai@suse.de> (raw)
In-Reply-To: <8c1353f0-e897-e7b0-c7b9-5712b05ac91f@linux.intel.com>

On Mon, 11 Oct 2021 22:06:51 +0200,
Pierre-Louis Bossart wrote:
> 
> 
> >>> Basically we need to protect two things:
> >>> - The BE links
> >>> - The concurrent accesses to BEs
> >>> The former belongs to each FE that holds the links, and the FE stream
> >>> lock would cover.  The latter is rather a per-BE business.
> >>>
> >>> An oft-seen risk of multiple locks is deadlocking, but in this case,
> >>> as long as we keep the lock order FE->BE, nothing wrong can happen.
> >>
> >> famous last words  "nothing wrong can happen." :-)
> >>
> >> I already added a helper to do this FE lock, I can easily replace the
> >> implementation to remove the spin_lock and use the FE PCM lock.
> >> we might even add the lock in the definition of for_each_dpcm_be() to
> >> avoid misses.
> >>
> >> Let me try this out today, thanks for the suggestions.
> > 
> > well, it's not successful at all...
> > 
> > When I replace the existing dpcm_lock with the FE PCM lock as you
> > suggested, without any additional changes, speaker-test produces valid
> > audio on the endpoints, but if I try a Ctrl-C or limit the number of
> > loops with the '-l' option, I hear an endless loop on the same buffer
> > and I have to power cycle my test device to stop the sound.
> > 
> > See 2 patches attached, the first patch with the introduction of the
> > helper works fine, the second with the use of the FE PCM lock doesn't.
> > In hindsight I am glad I worked on minimal patches, one after the other,
> > to identify problems.
> > 
> > And when I add the BE lock, then nothing happens. Device stuck and no
> > audio...
> > 
> > There must be something we're missing related to the locking...
> 
> And indeed there's a deadlock!
> 
> snd_pcm_period_elapsed() takes the FE pcm stream lock, and will call
> snd_pcm_trigger.

Indeed, this would deadlock.

> So if we also take the pcm stream lock in the BE
> trigger, there's a conceptual deadlock: we painted ourselves in a corner
> by using the same lock twice.
> 
> Takashi, are you really sure we should protect these for_each_dpcm_be()
> loops with the same pcm lock?

The call within the FE lock is done only in dpcm_dai_trigger_fe_be(),
and this should call dpcm_be_dai_trigger() as is.  In other places,
the calls are without FE lock, hence they can take the lock,
e.g. create a variant dpcm_dai_trigger_fe_be_lock().

> it seems like asking for trouble to
> revisit the ALSA core just to walking through a list of BEs? Would you
> object to changing dpcm_lock as I suggested, but not interfering with
> stream handling?

That would work, too, it's just a pity to degrade the fine-grained
locks that have been already taken into global locks...


Takashi

  reply	other threads:[~2021-10-12  6:35 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-04 22:54 [RFC PATCH v2 0/5] ASoC: soc-pcm: fix trigger race conditions with shared BE Pierre-Louis Bossart
2021-10-04 22:54 ` [RFC PATCH v2 1/5] ASoC: soc-pcm: remove snd_soc_dpcm_fe_can_update() Pierre-Louis Bossart
2021-10-04 22:54   ` Pierre-Louis Bossart
2021-10-04 22:54 ` [RFC PATCH v2 2/5] ASoC: soc-pcm: don't export local functions, use static Pierre-Louis Bossart
2021-10-04 22:54   ` Pierre-Louis Bossart
2021-10-04 22:54 ` [RFC PATCH v2 3/5] ASoC: soc-pcm: replace dpcm_lock with dpcm_mutex Pierre-Louis Bossart
2021-10-04 22:54   ` Pierre-Louis Bossart
2021-10-04 22:54 ` [RFC PATCH v2 4/5] ASoC: soc-pcm: protect for_each_dpcm_be() loops " Pierre-Louis Bossart
2021-10-04 22:54   ` Pierre-Louis Bossart
2021-10-04 22:54 ` [RFC PATCH v2 5/5] ASoC: soc-pcm: test refcount before triggering Pierre-Louis Bossart
2021-10-04 22:54   ` Pierre-Louis Bossart
2021-10-05  6:36 ` [RFC PATCH v2 0/5] ASoC: soc-pcm: fix trigger race conditions with shared BE Sameer Pujar
2021-10-05 13:17   ` Pierre-Louis Bossart
2021-10-06 14:22     ` Sameer Pujar
2021-10-06 19:47       ` Pierre-Louis Bossart
2021-10-07 11:06         ` Takashi Iwai
2021-10-07 13:31           ` Pierre-Louis Bossart
2021-10-07 14:59             ` Takashi Iwai
2021-10-07 15:24               ` Pierre-Louis Bossart
2021-10-07 15:44                 ` Takashi Iwai
2021-10-07 18:13                   ` Pierre-Louis Bossart
2021-10-07 21:11                     ` Takashi Iwai
2021-10-07 21:27                       ` Pierre-Louis Bossart
2021-10-08  6:13                         ` Takashi Iwai
2021-10-08 14:41                           ` Pierre-Louis Bossart
2021-10-08 14:51                             ` Takashi Iwai
2021-10-08 15:41                               ` Pierre-Louis Bossart
2021-10-08 19:09                                 ` Pierre-Louis Bossart
2021-10-11 20:06                                   ` Pierre-Louis Bossart
2021-10-12  6:34                                     ` Takashi Iwai [this message]
2021-10-12 10:42                                       ` Takashi Iwai
2021-10-12 13:45                                         ` Pierre-Louis Bossart
2021-10-12 15:07                                           ` Takashi Iwai

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=s5htuhm3g68.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=gt82.lee@samsung.com \
    --cc=kuninori.morimoto.gx@renesas.com \
    --cc=peter.ujfalusi@linux.intel.com \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=spujar@nvidia.com \
    --cc=vkoul@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.