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 v32 12/20] ALSA: virtio: use request-owned capture and serialize recovery
Date: Fri, 13 Nov 2026 07:10:43 +0000	[thread overview]
Message-ID: <sashiko-outbox-212324@kernel.org> (raw)
In-Reply-To: <20261113-fix-virtio-snd-recovery-final-v32-12-4e95979e312c@gmail.com>

Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] ALSA: virtio: premature capture drain teardown in
  virtsnd_pcm_sync_stop()
--

commit 9ad9852068461024197debdd2bd36f84e60f028e
Author: Joonho Lee <mynameisjune111@gmail.com>

ALSA: virtio: use request-owned capture and serialize recovery

This commit switches VirtIO ALSA capture to request-owned buffers with
in-order completion commits and serializes PCM control transitions, reset
handling, and error recovery across substream generations.

Link: https://lore.kernel.org/linux-sound/sashiko-outbox-210240@kernel.org/

> diff --git a/sound/virtio/virtio_pcm_ops.c b/sound/virtio/virtio_pcm_ops.c
> index a5a682534acf7..442169a516676 100644
> --- a/sound/virtio/virtio_pcm_ops.c
> +++ b/sound/virtio/virtio_pcm_ops.c

[ ... ]

> +static int virtsnd_pcm_sync_stop(struct snd_pcm_substream *substream)
> +{
> +	struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream);
> +	bool teardown_pending;
> +
> +	guard(mutex)(&vss->lifecycle_lock);
> +	scoped_guard(pcm_stream_lock_irqsave, substream) {
> +		snd_pcm_state_t state = substream->runtime->state;
> +
> +		/*
> +		 * Trigger holds the PCM lock through its control requests. Wait
> +		 * for it, then leave a replacement active generation alone.
> +		 * lifecycle_lock keeps prepare from replacing an inactive one
> +		 * until sync_stop_locked has finished its teardown.
> +		 */
> +		guard(spinlock_irqsave)(&vss->lock);
> +		teardown_pending = vss->prepared || vss->release_required ||
> +			vss->msg_count || vss->device_running || vss->stopped;
> +		if (state == SNDRV_PCM_STATE_RUNNING ||
> +		    state == SNDRV_PCM_STATE_PAUSED ||
> +		    state == SNDRV_PCM_STATE_PREPARED ||
> +		    (state == SNDRV_PCM_STATE_DRAINING &&
> +		     substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) {
> +			/* Core may consume this marker before a later inactive teardown. */
> +			if (teardown_pending)
> +				substream->runtime->stop_operating = true;
> +			return 0;
> +		}

[Severity: Medium]
Can a delayed virtsnd_pcm_sync_stop() tear down a replacement capture
generation while it is in SNDRV_PCM_STATE_DRAINING?

snd_pcm_drop() unlocks the PCM stream lock before calling
snd_pcm_sync_stop().  If another thread prepares, starts, and drains a
capture substream with unread frames before the first thread acquires
vss->lifecycle_lock, snd_pcm_drain() leaves the substream in
SNDRV_PCM_STATE_DRAINING with vss->prepared set so userspace can read the
remaining buffered frames and in-flight STOP tail completions:

CPU0                                  CPU1
snd_pcm_drop()
  runtime->stop_operating = true
  snd_pcm_stream_unlock_irq()
  snd_pcm_sync_stop()
    runtime->stop_operating = false
                                      snd_pcm_prepare()
                                        virtsnd_pcm_prepare_locked()
                                          virtsnd_pcm_sync_stop_locked()
                                          ...
                                          vss->prepared = true
                                      snd_pcm_start()
                                      snd_pcm_drain()
                                        /* state = SNDRV_PCM_STATE_DRAINING */
    virtsnd_pcm_sync_stop()
      /* DRAINING capture not skipped */
      virtsnd_pcm_sync_stop_locked()
        vss->prepared = false         <-- aborts active capture drain

Because the active-generation check only exempts SNDRV_PCM_STATE_DRAINING
for playback, virtsnd_pcm_sync_stop_locked() sends VIRTIO_SND_R_PCM_RELEASE,
disables vss->elapsed_period, and clears vss->prepared.  Subsequent reads
and pointer updates during capture drain then see !vss->prepared in
virtsnd_pcm_capture_ack() and virtsnd_pcm_cp_pointer(), failing with -EBADFD
or SNDRV_PCM_POS_XRUN and discarding the unread capture data.

Allowing SNDRV_PCM_STATE_DRAINING for capture in the active-generation check
as well would keep the draining generation intact until its final teardown.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261113-fix-virtio-snd-recovery-final-v32-0-4e95979e312c@gmail.com?part=12

  reply	other threads:[~2026-11-13  7:10 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-13  6:41 [PATCH v32 00/20] ALSA: virtio: preserve PCM progress Joonho Lee via B4 Relay
2026-11-13  6:41 ` Joonho Lee
2026-11-13  6:41 ` [PATCH v32 01/20] ALSA: pcm: mark stop-threshold accesses for capture policy sampling Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:46   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 02/20] ALSA: pcm: report partial progress under the stream lock Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  7:05   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 03/20] ALSA: pcm: add an optional reset operation " Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:51   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 04/20] ALSA: pcm: notify drivers after linked prepare completes Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:53   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 05/20] ALSA: pcm: serialize linked buffer actions Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:51   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 06/20] ALSA: virtio: propagate playback send failures through ACK Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  7:08   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 07/20] ALSA: virtio: Recover PCM state after a failed start Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  7:08   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 08/20] ALSA: virtio: Retain queued messages through device reset Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  7:01   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 09/20] ALSA: virtio: bound PCM transfers and retain DMA buffers Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  7:11   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 10/20] ALSA: virtio: Keep control payloads alive through DMA completion Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:50   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 11/20] ALSA: virtio: wait through signals for PCM teardown Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:58   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 12/20] ALSA: virtio: use request-owned capture and serialize recovery Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  7:10   ` sashiko-bot [this message]
2026-11-13  6:41 ` [PATCH v32 13/20] ALSA: virtio: prioritize capture period work Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:50   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 14/20] docs: describe virtio-sound capture options Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:52   ` sashiko-bot
2026-11-13  6:41 ` [PATCH v32 15/20] ALSA: virtio: reject invalid playback completions Joonho Lee via B4 Relay
2026-11-13  6:41   ` Joonho Lee
2026-11-13  6:59   ` sashiko-bot
2026-11-13  6:42 ` [PATCH v32 16/20] ALSA: pcm: add an explicit application pointer to indirect playback transfer Joonho Lee via B4 Relay
2026-11-13  6:42   ` Joonho Lee
2026-11-13  6:54   ` sashiko-bot
2026-11-13  6:42 ` [PATCH v32 17/20] ALSA: virtio: preserve playback progress across pause and buffer access Joonho Lee via B4 Relay
2026-11-13  6:42   ` Joonho Lee
2026-11-13  7:08   ` sashiko-bot
2026-11-13  6:42 ` [PATCH v32 18/20] ALSA: virtio: settle PCM control state from late replies Joonho Lee via B4 Relay
2026-11-13  6:42   ` Joonho Lee
2026-11-13  7:26   ` sashiko-bot
2026-11-13  6:42 ` [PATCH v32 19/20] ALSA: pcm: allow stream suspension without power management Joonho Lee via B4 Relay
2026-11-13  6:42   ` Joonho Lee
2026-11-13  6:58   ` sashiko-bot
2026-11-13  6:42 ` [PATCH v32 20/20] ALSA: virtio: reset the device when PCM state stays unknown Joonho Lee via B4 Relay
2026-11-13  6:42   ` Joonho Lee
2026-11-13  7:30   ` 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-212324@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.