All of lore.kernel.org
 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 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.