From: Qiao Zhou <zhouqiao@marvell.com>
To: Mark Brown <broonie@kernel.org>
Cc: "tiwai@suse.de" <tiwai@suse.de>, Xin Qian <xqian@marvell.com>,
"alsa-devel@alsa-project.org" <alsa-devel@alsa-project.org>,
Liam Girdwood <liam.r.girdwood@intel.com>
Subject: Re: [question about DPCM] dpcm_be_disconnect race condition
Date: Thu, 28 Aug 2014 10:07:14 +0800 [thread overview]
Message-ID: <53FE8ED2.80701@marvell.com> (raw)
In-Reply-To: <20140827185225.GQ17528@sirena.org.uk>
On 08/28/2014 02:52 AM, Mark Brown wrote:
> On Wed, Aug 27, 2014 at 04:15:00PM +0800, Qiao Zhou wrote:
>> Hi Liam, Mark
>>
>> I'm developing audio with DPCM on one phone platform, and met one kernel
>> panic issue related with dpcm_be_connect. Could you please help to suggest?
>
> Adding Liam.
>
>> Taking audio playback for example:
>> 1. User space writes all the data into audio buffer. When the blocking write
>> returns, it closes audio path(which updates dapm and triggers
>> soc_dpcm_runtime_update).
>> 2. When user space closes audio path, kernel audio driver(DMA) is still
>> transferring data from audio buffer to audio peripheral. So DMA interrupt
>> will come, and the interrupt handler runs on different cpu comparing to
>> which the task to close audio path runs on.
>> 3. Due to system schedule, below case may happen.
>>
>> cpu0 cpu1
>>
>> soc_dapm_mixer_update_power -> | DMA interrupt ->
>> soc_dpcm_runtime_update -> | snd_pcm_period_elapsed ->
>> dpcm_be_disconnect(old) -> | snd_pcm_update_hw_ptr0 ->
>> __________________________ | xrun ->
>> | | | snd_pcm_stop ->
>> |list_del(&dpcm->list_be) | | dpcm_fe_dai_trigger ->
>> |list_del(&dpcm->list_fe) | | dpcm_be_dai_trigger ->
>> |kfree(dpcm); | | list_for_each_entry(dpcm..
>> |_________________________| |
>>
>> On CPU1, list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
>> will get dpcm and corresponding be, but there is no protection against the
>> dpcm_be_disconnect on cpu0. Related dpcm for the BE may be invalid/freed
>> when cpu1 tries to access it.
>
>> Should we require user space to make sure audio transfer ends before closing
>> audio path to avoid such issue? I'm not sure if I missed anything or used it
>> wrongly.
>
> Well, it should do that in general if it wants to make sure that the
> audio actually gets played but the kernel should protect against this.
> We should be holding a lock whenever we update the lists.
Thanks a lot for your suggestion! Firstly we'll ask user space app to
apply this rule currently to avoid such issue.
Currently it holds card->mutex in mutex_lock_nested whenever the list is
updated. Here list_for_each_entry in snd_pcm_stop may run in interrupt
context(the bottom half of tasklet), so it can not use this mutex
simply. Is there any other way to protect it?
>
>> Thanks in advance!
>> --
>>
>> Best Regards
>> Qiao
>>
--
Best Regards
Qiao
next prev parent reply other threads:[~2014-08-28 2:07 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <53FD9384.3020501@marvell.com>
2014-08-27 18:52 ` [question about DPCM] dpcm_be_disconnect race condition Mark Brown
2014-08-28 2:07 ` Qiao Zhou [this message]
2014-08-28 8:58 ` 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=53FE8ED2.80701@marvell.com \
--to=zhouqiao@marvell.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=liam.r.girdwood@intel.com \
--cc=tiwai@suse.de \
--cc=xqian@marvell.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 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.