Linux virtualization list
 help / color / mirror / Atom feed
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

  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