* ASoC q6asm race condition when stopping and preparing the stream
@ 2026-05-01 14:41 Richard Acayan
2026-05-01 15:27 ` Alexey Klimov
2026-05-15 9:17 ` Srinivas Kandagatla
0 siblings, 2 replies; 7+ messages in thread
From: Richard Acayan @ 2026-05-01 14:41 UTC (permalink / raw)
To: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela,
Takashi Iwai, Greg Kroah-Hartman, Richard Acayan, Kees Cook,
Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm,
linux-kernel
Hi,
There seems to be a race condition in q6asm when stopping the stream
(with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the
driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the
ADSP. If userspace decides to prepare the stream again in
q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the
memory-mapped region appears to still be in use and fails to map again.
I believe this race was observed since commit 81c53b52de21 ("ASoC: qcom:
qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would
need to verify. On sdm670, we are coping downstream by keeping the state
as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE.
Can the ADSP emit DATA_WRITE_DONE or DATA_READ_DONE before CMD_EOS_DONE?
We might need an extra stopping state between CMD_EOS and CMD_EOS_DONE
so the driver doesn't request more data transfers.
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: ASoC q6asm race condition when stopping and preparing the stream 2026-05-01 14:41 ASoC q6asm race condition when stopping and preparing the stream Richard Acayan @ 2026-05-01 15:27 ` Alexey Klimov 2026-05-01 23:53 ` Richard Acayan 2026-05-15 17:38 ` Srinivas Kandagatla 2026-05-15 9:17 ` Srinivas Kandagatla 1 sibling, 2 replies; 7+ messages in thread From: Alexey Klimov @ 2026-05-01 15:27 UTC (permalink / raw) To: Richard Acayan, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, Greg Kroah-Hartman, Kees Cook, Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm, linux-kernel On Fri May 1, 2026 at 3:41 PM BST, Richard Acayan wrote: > Hi, > > There seems to be a race condition in q6asm when stopping the stream > (with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the > driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the > ADSP. If userspace decides to prepare the stream again in > q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the > memory-mapped region appears to still be in use and fails to map again. > > I believe this race was observed since commit 81c53b52de21 ("ASoC: qcom: > qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would > need to verify. On sdm670, we are coping downstream by keeping the state > as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE. Do you have a reproducer or specific steps to test/reproduce the issue? > Can the ADSP emit DATA_WRITE_DONE or DATA_READ_DONE before CMD_EOS_DONE? > We might need an extra stopping state between CMD_EOS and CMD_EOS_DONE > so the driver doesn't request more data transfers. Thanks, Alexey ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ASoC q6asm race condition when stopping and preparing the stream 2026-05-01 15:27 ` Alexey Klimov @ 2026-05-01 23:53 ` Richard Acayan 2026-05-15 5:59 ` Val Packett 2026-05-15 17:38 ` Srinivas Kandagatla 1 sibling, 1 reply; 7+ messages in thread From: Richard Acayan @ 2026-05-01 23:53 UTC (permalink / raw) To: Alexey Klimov Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, Greg Kroah-Hartman, Kees Cook, Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm, linux-kernel On Fri, May 01, 2026 at 04:27:57PM +0100, Alexey Klimov wrote: > On Fri May 1, 2026 at 3:41 PM BST, Richard Acayan wrote: > > Hi, > > > > There seems to be a race condition in q6asm when stopping the stream > > (with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the > > driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the > > ADSP. If userspace decides to prepare the stream again in > > q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the > > memory-mapped region appears to still be in use and fails to map again. > > > > I believe this race was observed since commit 81c53b52de21 ("ASoC: qcom: > > qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would > > need to verify. On sdm670, we are coping downstream by keeping the state > > as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE. > > Do you have a reproducer or specific steps to test/reproduce the issue? I don't really have an easy way to reproduce. On a device with a Qualcomm SoC and q6asm, running postmarketOS with Phosh and without the workaround, waiting a few hours usually reproduces it. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ASoC q6asm race condition when stopping and preparing the stream 2026-05-01 23:53 ` Richard Acayan @ 2026-05-15 5:59 ` Val Packett 2026-05-15 9:22 ` Srinivas Kandagatla 0 siblings, 1 reply; 7+ messages in thread From: Val Packett @ 2026-05-15 5:59 UTC (permalink / raw) To: Richard Acayan, Alexey Klimov Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, Greg Kroah-Hartman, Kees Cook, Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm, linux-kernel Hi, On 5/1/26 8:53 PM, Richard Acayan wrote: > On Fri, May 01, 2026 at 04:27:57PM +0100, Alexey Klimov wrote: >> On Fri May 1, 2026 at 3:41 PM BST, Richard Acayan wrote: >>> Hi, >>> >>> There seems to be a race condition in q6asm when stopping the stream >>> (with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the >>> driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the >>> ADSP. If userspace decides to prepare the stream again in >>> q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the >>> memory-mapped region appears to still be in use and fails to map again. >>> >>> I believe this race was observed since commit 81c53b52de21 ("ASoC: qcom: >>> qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would >>> need to verify. On sdm670, we are coping downstream by keeping the state >>> as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE. Are we sure that's only a workaround and not the correct solution? Thank you for mentioning it, in any case! >> Do you have a reproducer or specific steps to test/reproduce the issue? > I don't really have an easy way to reproduce. On a device with a > Qualcomm SoC and q6asm, running postmarketOS with Phosh and without the > workaround, waiting a few hours usually reproduces it. I haven't seen this happen "randomly".. at least not with PulseAudio, but after switching to PipeWire and properly configuring phone calls(*) on my phone (sm7325-motorola-dubai) I have encountered what I think is the exact same issue many times while doing this simple sequence: - boot phone, playback and recording work fine - start a phone call, cancel when hearing dial tone (Wireplumber has switched UCM profile to VoiceCall and then back to HiFi) - try to record mic sound (using the GNOME sound recorder app or whatever else) Actually just now I managed to hit this right after reboot, without any calls..! So it might just be "try to record audio through PipeWire and you'll hit it quickly enough". (*) using the current infamous q6voice patchset, Wireplumber's script to switch between HiFi/VoiceCall, and a better setup for starting the dummy streams exposed by q6voice: https://gitlab.postmarketos.org/postmarketOS/q6voiced/-/work_items/3#note_553107 The log is usually something like this: kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: Buffer already allocated kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: cmd = 0x10db4 returned error = 0x9 kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: DSP returned error[9] pipewire[5347]: [E][02:30:35.781627] spa.alsa | [ alsa-pcm.c: 2722 do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument pipewire[5347]: [W][02:30:35.781714] spa.alsa | [ alsa-pcm.c: 2885 get_avail()] hw:Motoroladubai,2c: (0 suppressed) snd_pcm_avail after recover: File desc> pipewire[5347]: [E][02:30:35.781771] spa.alsa | [ alsa-pcm.c: 2832 alsa_recover()] hw:Motoroladubai,2c: recover from error state SETUP pipewire[5347]: [E][02:30:35.781801] spa.alsa | [ alsa-pcm.c: 2722 do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument pipewire[5347]: [E][02:30:35.781821] spa.alsa | [ alsa-pcm.c: 2832 alsa_recover()] hw:Motoroladubai,2c: recover from error state SETUP pipewire[5347]: [E][02:30:35.781837] spa.alsa | [ alsa-pcm.c: 2722 do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument pipewire[5347]: [E][02:30:35.786869] spa.alsa | [ alsa-pcm.c: 2832 alsa_recover()] hw:Motoroladubai,2c: recover from error state SETUP pipewire[5347]: [E][02:30:35.786949] spa.alsa | [ alsa-pcm.c: 2722 do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: q6asm_dai_prepare: q6asm_open_write failed kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: ASoC error (-22): at snd_soc_pcm_component_prepare() on 3700000.remoteproc:glink-edge:apr:servi> kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: q6asm_dai_prepare: private data null or audio client freed kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: ASoC error (-22): at snd_soc_pcm_component_prepare() on 3700000.remoteproc:glink-edge:apr:servi> kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: q6asm_dai_prepare: private data null or audio client freed … "Buffer already allocated", error 9 which is ADSP_EALREADY, so the state is desynchronized. Thanks, ~val ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ASoC q6asm race condition when stopping and preparing the stream 2026-05-15 5:59 ` Val Packett @ 2026-05-15 9:22 ` Srinivas Kandagatla 0 siblings, 0 replies; 7+ messages in thread From: Srinivas Kandagatla @ 2026-05-15 9:22 UTC (permalink / raw) To: Val Packett, Richard Acayan, Alexey Klimov Cc: Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, Greg Kroah-Hartman, Kees Cook, Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm, linux-kernel On 5/15/26 5:59 AM, Val Packett wrote: > Hi, > > On 5/1/26 8:53 PM, Richard Acayan wrote: >> On Fri, May 01, 2026 at 04:27:57PM +0100, Alexey Klimov wrote: >>> On Fri May 1, 2026 at 3:41 PM BST, Richard Acayan wrote: >>>> Hi, >>>> >>>> There seems to be a race condition in q6asm when stopping the stream >>>> (with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the >>>> driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the >>>> ADSP. If userspace decides to prepare the stream again in >>>> q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the >>>> memory-mapped region appears to still be in use and fails to map again. >>>> >>>> I believe this race was observed since commit 81c53b52de21 ("ASoC: >>>> qcom: >>>> qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would >>>> need to verify. On sdm670, we are coping downstream by keeping the >>>> state >>>> as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE. > Are we sure that's only a workaround and not the correct solution? > Thank you for mentioning it, in any case! >>> Do you have a reproducer or specific steps to test/reproduce the issue? >> I don't really have an easy way to reproduce. On a device with a >> Qualcomm SoC and q6asm, running postmarketOS with Phosh and without the >> workaround, waiting a few hours usually reproduces it. > > I haven't seen this happen "randomly".. at least not with PulseAudio, > but after switching to PipeWire and properly configuring phone calls(*) > on my phone (sm7325-motorola-dubai) I have encountered what I think is > the exact same issue many times while doing this simple sequence: > > - boot phone, playback and recording work fine > - start a phone call, cancel when hearing dial tone (Wireplumber has > switched UCM profile to VoiceCall and then back to HiFi) > - try to record mic sound (using the GNOME sound recorder app or > whatever else) > > Actually just now I managed to hit this right after reboot, without any > calls..! > > So it might just be "try to record audio through PipeWire and you'll hit > it quickly enough". > > > (*) using the current infamous q6voice patchset, Wireplumber's script to > switch between HiFi/VoiceCall, and a better setup for starting the dummy > streams exposed by q6voice: https://gitlab.postmarketos.org/ > postmarketOS/q6voiced/-/work_items/3#note_553107 > > The log is usually something like this: > > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: > Buffer already allocated > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: cmd > = 0x10db4 returned error = 0x9 > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: DSP > returned error[9] this suggests that we are opening a capture stream that is already open. Somehow the driver seems to not doing the correct check and closing it or returning an error when try to open an existing stream. I will run some tests and let you know if I fund anything interesting. But in the mean time if you can find a way to reproduce this issue, please share. --srini > pipewire[5347]: [E][02:30:35.781627] spa.alsa | [ alsa-pcm.c: 2722 > do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument > pipewire[5347]: [W][02:30:35.781714] spa.alsa | [ alsa-pcm.c: 2885 > get_avail()] hw:Motoroladubai,2c: (0 suppressed) snd_pcm_avail after > recover: File desc> > pipewire[5347]: [E][02:30:35.781771] spa.alsa | [ alsa-pcm.c: 2832 > alsa_recover()] hw:Motoroladubai,2c: recover from error state SETUP > pipewire[5347]: [E][02:30:35.781801] spa.alsa | [ alsa-pcm.c: 2722 > do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument > pipewire[5347]: [E][02:30:35.781821] spa.alsa | [ alsa-pcm.c: 2832 > alsa_recover()] hw:Motoroladubai,2c: recover from error state SETUP > pipewire[5347]: [E][02:30:35.781837] spa.alsa | [ alsa-pcm.c: 2722 > do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument > pipewire[5347]: [E][02:30:35.786869] spa.alsa | [ alsa-pcm.c: 2832 > alsa_recover()] hw:Motoroladubai,2c: recover from error state SETUP > pipewire[5347]: [E][02:30:35.786949] spa.alsa | [ alsa-pcm.c: 2722 > do_prepare()] hw:Motoroladubai,2c: snd_pcm_prepare error: Invalid argument > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: > q6asm_dai_prepare: q6asm_open_write failed > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: ASoC > error (-22): at snd_soc_pcm_component_prepare() on > 3700000.remoteproc:glink-edge:apr:servi> > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: > q6asm_dai_prepare: private data null or audio client freed > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: ASoC > error (-22): at snd_soc_pcm_component_prepare() on > 3700000.remoteproc:glink-edge:apr:servi> > kernel: q6asm-dai 3700000.remoteproc:glink-edge:apr:service@7:dais: > q6asm_dai_prepare: private data null or audio client freed > … > > "Buffer already allocated", error 9 which is ADSP_EALREADY, so the state > is desynchronized. > > > Thanks, > ~val > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ASoC q6asm race condition when stopping and preparing the stream 2026-05-01 15:27 ` Alexey Klimov 2026-05-01 23:53 ` Richard Acayan @ 2026-05-15 17:38 ` Srinivas Kandagatla 1 sibling, 0 replies; 7+ messages in thread From: Srinivas Kandagatla @ 2026-05-15 17:38 UTC (permalink / raw) To: Alexey Klimov, Richard Acayan, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, Greg Kroah-Hartman, Kees Cook, Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm, linux-kernel On 5/1/26 3:27 PM, Alexey Klimov wrote: > On Fri May 1, 2026 at 3:41 PM BST, Richard Acayan wrote: >> Hi, >> >> There seems to be a race condition in q6asm when stopping the stream >> (with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the >> driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the >> ADSP. If userspace decides to prepare the stream again in >> q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the >> memory-mapped region appears to still be in use and fails to map again. >> >> I believe this race was observed since commit 81c53b52de21 ("ASoC: qcom: >> qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would >> need to verify. On sdm670, we are coping downstream by keeping the state >> as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE. > > Do you have a reproducer or specific steps to test/reproduce the issue? > Manage to reproduce this on my UNO -Q device, will update you once I have a fix. --srini > >> Can the ADSP emit DATA_WRITE_DONE or DATA_READ_DONE before CMD_EOS_DONE? >> We might need an extra stopping state between CMD_EOS and CMD_EOS_DONE >> so the driver doesn't request more data transfers. > > Thanks, > Alexey ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ASoC q6asm race condition when stopping and preparing the stream 2026-05-01 14:41 ASoC q6asm race condition when stopping and preparing the stream Richard Acayan 2026-05-01 15:27 ` Alexey Klimov @ 2026-05-15 9:17 ` Srinivas Kandagatla 1 sibling, 0 replies; 7+ messages in thread From: Srinivas Kandagatla @ 2026-05-15 9:17 UTC (permalink / raw) To: Richard Acayan, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, Greg Kroah-Hartman, Kees Cook, Joris Verhaegen, Kuninori Morimoto, linux-sound, linux-arm-msm, linux-kernel On 5/1/26 2:41 PM, Richard Acayan wrote: > Hi, > > There seems to be a race condition in q6asm when stopping the stream > (with uncompressed PCM). When receiving SNDRV_PCM_TRIGGER_STOP, the > driver sets the state to Q6ASM_STREAM_STOPPED and sends CMD_EOS to the > ADSP. If userspace decides to prepare the stream again in > q6asm_dai_prepare before receiving ASM_CLIENT_EVENT_CMD_EOS_DONE, the > memory-mapped region appears to still be in use and fails to map again. > > I believe this race was observed since commit 81c53b52de21 ("ASoC: qcom: > qdsp6: q6asm-dai: set 10 ms period and buffer alignment."), but would > need to verify. On sdm670, we are coping downstream by keeping the state > as Q6ASM_STREAM_RUNNING until receiving CMD_EOS_DONE. Can you please share the full kernel log. --srini > > Can the ADSP emit DATA_WRITE_DONE or DATA_READ_DONE before CMD_EOS_DONE? > We might need an extra stopping state between CMD_EOS and CMD_EOS_DONE > so the driver doesn't request more data transfers. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-05-15 17:38 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-01 14:41 ASoC q6asm race condition when stopping and preparing the stream Richard Acayan 2026-05-01 15:27 ` Alexey Klimov 2026-05-01 23:53 ` Richard Acayan 2026-05-15 5:59 ` Val Packett 2026-05-15 9:22 ` Srinivas Kandagatla 2026-05-15 17:38 ` Srinivas Kandagatla 2026-05-15 9:17 ` Srinivas Kandagatla
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.