From: sashiko-bot@kernel.org
To: "Joonho Lee" <mynameisjune111@gmail.com>, linux-sound@vger.kernel.org
Cc: virtualization@lists.linux.dev,
"Michael S. Tsirkin" <mst@redhat.com>,
"Eugenio Perez" <eperezma@redhat.com>
Subject: Re: [PATCH v24 02/16] ALSA: pcm: report partial progress under the stream lock
Date: Wed, 11 Nov 2026 00:25:09 +0000 [thread overview]
Message-ID: <sashiko-outbox-208016@kernel.org> (raw)
In-Reply-To: <20261111000543.28550-3-mynameisjune111@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [High] ALSA: pcm: premature drain done on capture in
snd_pcm_update_state()
- [Medium] ALSA: pcm: stale avail in __snd_pcm_lib_xfer() drops capture
drain tail
--
commit 729bfce97b1180fb1f0b36f0f5fb43c69406d7d3
Author: Joonho Lee <mynameisjune111@gmail.com>
ALSA: pcm: report partial progress under the stream lock
This commit introduces snd_pcm_progress_under_stream_lock() so drivers can
publish partial-period progress and final capture drain tails under the PCM
stream lock without ticking the PCM period timer.
> diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
> index bb16738bb5919..a5665bb2b0705 100644
> --- a/sound/core/pcm_lib.c
> +++ b/sound/core/pcm_lib.c
> @@ -1918,6 +1918,30 @@ void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substrea
> }
> EXPORT_SYMBOL(snd_pcm_period_elapsed_under_stream_lock);
>
> +/**
> + * snd_pcm_progress_under_stream_lock - Report progress without a period IRQ
> + * @substream: PCM substream
> + *
> + * Context: PCM stream lock held, with no driver pointer or trigger locks held.
> + * Updates the pointer and wakes readers for partial-period transfers. Capture
> + * streams may report their final tail while DRAINING. Unlike a period
> + * notification, this does not imply an elapsed period or tick the PCM timer.
> + * The same pointer, trigger and timestamp callbacks may be invoked.
> + */
> +void snd_pcm_progress_under_stream_lock(struct snd_pcm_substream *substream)
> +{
> + if (PCM_RUNTIME_CHECK(substream))
> + return;
> + if (!snd_pcm_running(substream) &&
> + !(substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
> + substream->runtime->state == SNDRV_PCM_STATE_DRAINING))
> + return;
> + snd_pcm_update_hw_ptr(substream);
[Severity: High]
Does calling snd_pcm_update_hw_ptr() on a capture substream in
SNDRV_PCM_STATE_DRAINING cause snd_pcm_update_state() to prematurely finish
draining when the capture buffer fills up?
Previously, snd_pcm_update_hw_ptr() was only called when snd_pcm_running()
was true, which includes SNDRV_PCM_STATE_DRAINING only for playback. In
snd_pcm_update_state(), the draining check assumes playback semantics where
avail >= runtime->buffer_size means the playback buffer has emptied:
sound/core/pcm_lib.c:snd_pcm_update_state() {
avail = snd_pcm_avail(substream);
if (avail > runtime->avail_max)
runtime->avail_max = avail;
if (runtime->state == SNDRV_PCM_STATE_DRAINING) {
if (avail >= runtime->buffer_size) {
snd_pcm_drain_done(substream);
return -EPIPE;
}
} else {
if (avail >= runtime->stop_threshold) {
__snd_pcm_xrun(substream);
return -EPIPE;
}
}
For capture, avail is the number of unread frames in the buffer. If a
capture stream in SNDRV_PCM_STATE_DRAINING reaches a full buffer (avail >=
runtime->buffer_size) when snd_pcm_progress_under_stream_lock() updates
hw_ptr, snd_pcm_update_state() calls snd_pcm_drain_done() and moves the
stream to SNDRV_PCM_STATE_SETUP, causing subsequent reads to fail with
-EBADFD and losing the buffered capture audio (as well as bypassing the
stop_threshold overrun check).
[Severity: Medium]
Can a capture tail published via snd_pcm_progress_under_stream_lock() be
discarded if it arrives while __snd_pcm_lib_xfer() is copying frames to
userspace?
CPU0 CPU1
__snd_pcm_lib_xfer()
snd_pcm_stream_lock_irq()
avail = snd_pcm_avail(substream)
/* size > avail */
frames = avail
snd_pcm_stream_unlock_irq()
writer(...)
snd_pcm_stream_lock_irq()
snd_pcm_progress_under_stream_lock()
snd_pcm_update_hw_ptr()
snd_pcm_stream_unlock_irq()
snd_pcm_stream_lock_irq()
...
avail -= frames; /* avail == 0 */
/* next loop iteration */
if (!avail)
snd_pcm_drain_done(substream) <-- drops newly published tail
Previously, hw_ptr did not advance once a capture stream entered
SNDRV_PCM_STATE_DRAINING, so tracking avail locally across the unlocked
writer() call via avail -= frames was exact. When
snd_pcm_progress_under_stream_lock() advances hw_ptr during that window,
the cached avail reaches 0 on the next iteration and __snd_pcm_lib_xfer()
calls snd_pcm_drain_done() without re-checking snd_pcm_avail(substream),
transitioning the stream to SNDRV_PCM_STATE_SETUP and dropping the final
tail.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261111000543.28550-1-mynameisjune111@gmail.com?part=2
next prev parent reply other threads:[~2026-11-11 0:25 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-11 0:05 [PATCH v24 00/16] ALSA: virtio: serialize PCM recovery and preserve capture and playback progress Joonho Lee
2026-11-11 0:05 ` [PATCH v24 01/16] ALSA: pcm: mark stop-threshold accesses for capture policy sampling Joonho Lee
2026-11-11 0:13 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 02/16] ALSA: pcm: report partial progress under the stream lock Joonho Lee
2026-11-11 0:25 ` sashiko-bot [this message]
2026-11-11 0:05 ` [PATCH v24 03/16] ALSA: pcm: add an optional reset operation " Joonho Lee
2026-11-11 0:16 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 04/16] ALSA: pcm: notify drivers after linked prepare completes Joonho Lee
2026-11-11 0:17 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 05/16] ALSA: pcm: serialize linked buffer actions Joonho Lee
2026-11-11 0:13 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 06/16] ALSA: virtio: propagate playback send failures through ACK Joonho Lee
2026-11-11 0:34 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 07/16] ALSA: virtio: Recover PCM state after a failed start Joonho Lee
2026-11-11 0:33 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 08/16] ALSA: virtio: Retain queued messages through device reset Joonho Lee
2026-11-11 0:25 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 09/16] ALSA: virtio: bound PCM transfers and retain DMA buffers Joonho Lee
2026-11-11 0:27 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 10/16] ALSA: virtio: Keep control payloads alive through DMA completion Joonho Lee
2026-11-11 0:16 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 11/16] ALSA: virtio: wait through signals for PCM teardown Joonho Lee
2026-11-11 0:28 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 12/16] ALSA: virtio: use request-owned capture and serialize recovery Joonho Lee
2026-11-11 0:38 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 13/16] ALSA: virtio: prioritize capture period work Joonho Lee
2026-11-11 0:19 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 14/16] docs: describe virtio-sound capture options Joonho Lee
2026-11-11 0:24 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 15/16] ALSA: virtio: reject invalid playback completions Joonho Lee
2026-11-11 0:26 ` sashiko-bot
2026-11-11 0:05 ` [PATCH v24 16/16] ALSA: virtio: preserve playback progress across pause Joonho Lee
2026-11-11 0:49 ` sashiko-bot
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=sashiko-outbox-208016@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=eperezma@redhat.com \
--cc=linux-sound@vger.kernel.org \
--cc=mst@redhat.com \
--cc=mynameisjune111@gmail.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=virtualization@lists.linux.dev \
/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