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 v25 04/16] ALSA: pcm: notify drivers after linked prepare completes
Date: Wed, 11 Nov 2026 04:00:56 +0000	[thread overview]
Message-ID: <sashiko-outbox-208251@kernel.org> (raw)
In-Reply-To: <20261111025655.63951-5-mynameisjune111@gmail.com>

Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] ALSA: pcm: state desync on opted-in streams in
  snd_pcm_finish_prepare()
--

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

ALSA: pcm: notify drivers after linked prepare completes

This commit adds an optional prepare_complete callback to snd_pcm_ops and
defers publishing SNDRV_PCM_STATE_PREPARED until all linked prepare and
reset actions finish under the stream locks.

> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index a547ac720b518..f98eb3329f2de 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
[ ... ]
> @@ -2089,20 +2113,108 @@ static int snd_pcm_do_prepare(struct snd_pcm_substream *substream,
>  	return snd_pcm_reset_substream(substream, true);
>  }
>  
> -static void snd_pcm_post_prepare(struct snd_pcm_substream *substream,
> -				 snd_pcm_state_t state)
> +static int snd_pcm_finish_prepare(struct snd_pcm_substream *substream,
> +				  snd_pcm_state_t state, bool success,
> +				  struct snd_pcm_substream *failed_substream,
> +				  bool stream_lock)
>  {
[ ... ]
> +	/* Preserve terminal states instead of publishing a partial group commit. */
> +	snd_pcm_group_for_each_entry(s, substream) {
> +		struct snd_pcm_runtime *runtime = s->runtime;
> +
> +		if (runtime->state == SNDRV_PCM_STATE_DISCONNECTED) {
> +			cancel = true;
> +			cancel_err = -EBADFD;
> +		} else if (runtime->state == SNDRV_PCM_STATE_SUSPENDED) {
> +			cancel = true;
> +			if (!cancel_err)
> +				cancel_err = -ESTRPIPE;
> +		}
> +		if (!success && s == failed_substream)
> +			break;
> +	}
> +
> +	if (success && !cancel) {
> +		snd_pcm_group_for_each_entry(s, substream) {
> +			struct snd_pcm_runtime *runtime = s->runtime;
> +
> +			/* The reset callback path already completed this rebase. */
> +			if (!s->ops->reset)
> +				runtime->control->appl_ptr = runtime->status->hw_ptr;
> +			__snd_pcm_set_state(runtime, SNDRV_PCM_STATE_PREPARED);
> +		}
> +	} else if (!success && !cancel) {
> +		snd_pcm_group_for_each_entry(s, substream) {
> +			struct snd_pcm_runtime *runtime = s->runtime;
> +
> +			if (s->ops->prepare_complete &&
> +			    runtime->state != SNDRV_PCM_STATE_SETUP)
> +				__snd_pcm_set_state(runtime, SNDRV_PCM_STATE_SETUP);
> +			if (s == failed_substream)
> +				break;
> +		}
> +	}
> +
> +	if (!success || cancel) {
> +		snd_pcm_group_for_each_entry(s, substream) {
> +			wake_up(&s->runtime->sleep);
> +			wake_up(&s->runtime->tsleep);
> +			if (!success && s == failed_substream)
> +				break;
> +		}
> +	}
> +
> +	/* Publish all states before any driver observes completion. */
> +	snd_pcm_group_for_each_entry(s, substream) {
> +		if (s->ops->prepare_complete)
> +			s->ops->prepare_complete(s, success && !cancel);
> +		if (!success && s == failed_substream)
> +			break;
> +	}

[Severity: Medium]
Can gating the SNDRV_PCM_STATE_SETUP rollback on !cancel leave healthy
opted-in streams in SNDRV_PCM_STATE_PREPARED after calling
prepare_complete(s, false)?

When a linked group is re-prepared from SNDRV_PCM_STATE_PREPARED and one
member's PCM device disconnects during snd_pcm_do_prepare(),
snd_pcm_dev_disconnect() marks only that device's substreams as
SNDRV_PCM_STATE_DISCONNECTED because the streams are not running.
snd_pcm_finish_prepare() then sets cancel = true, skips resetting the other
opted-in members to SNDRV_PCM_STATE_SETUP, and still calls
s->ops->prepare_complete(s, false) on them.

That revokes driver preparation while runtime->state (or
runtime->suspended_state if the stream was suspended during
snd_pcm_do_prepare()) remains SNDRV_PCM_STATE_PREPARED in the ALSA core,
so once the disconnected sibling is unlinked or closed, later START or ACK
calls pass core state checks and fail in the driver.  Should each opted-in
member in the affected group or prefix that is not itself DISCONNECTED or
SUSPENDED be reset to SNDRV_PCM_STATE_SETUP whenever !success || cancel
(and have runtime->suspended_state updated to SNDRV_PCM_STATE_SETUP if
suspended)?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261111025655.63951-1-mynameisjune111@gmail.com?part=4

  reply	other threads:[~2026-11-11  4:00 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-11  2:56 [PATCH v25 00/16] ALSA: virtio: serialize PCM recovery and preserve capture and playback progress Joonho Lee
2026-11-11  2:56 ` [PATCH v25 01/16] ALSA: pcm: mark stop-threshold accesses for capture policy sampling Joonho Lee
2026-11-11  3:02   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 02/16] ALSA: pcm: report partial progress under the stream lock Joonho Lee
2026-11-11  3:16   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 03/16] ALSA: pcm: add an optional reset operation " Joonho Lee
2026-11-11  3:38   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 04/16] ALSA: pcm: notify drivers after linked prepare completes Joonho Lee
2026-11-11  4:00   ` sashiko-bot [this message]
2026-11-11  2:56 ` [PATCH v25 05/16] ALSA: pcm: serialize linked buffer actions Joonho Lee
2026-11-11  4:06   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 06/16] ALSA: virtio: propagate playback send failures through ACK Joonho Lee
2026-11-11  4:31   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 07/16] ALSA: virtio: Recover PCM state after a failed start Joonho Lee
2026-11-11  4:54   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 08/16] ALSA: virtio: Retain queued messages through device reset Joonho Lee
2026-11-11  5:10   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 09/16] ALSA: virtio: bound PCM transfers and retain DMA buffers Joonho Lee
2026-11-11  5:34   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 10/16] ALSA: virtio: Keep control payloads alive through DMA completion Joonho Lee
2026-11-11  5:43   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 11/16] ALSA: virtio: wait through signals for PCM teardown Joonho Lee
2026-11-11  5:59   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 12/16] ALSA: virtio: use request-owned capture and serialize recovery Joonho Lee
2026-11-11  6:17   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 13/16] ALSA: virtio: prioritize capture period work Joonho Lee
2026-11-11  6:21   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 14/16] docs: describe virtio-sound capture options Joonho Lee
2026-11-11  6:26   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 15/16] ALSA: virtio: reject invalid playback completions Joonho Lee
2026-11-11  6:37   ` sashiko-bot
2026-11-11  2:56 ` [PATCH v25 16/16] ALSA: virtio: preserve playback progress across pause Joonho Lee
2026-11-11  7:06   ` 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-208251@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