Linux virtualization list
 help / color / mirror / Atom feed
From: Joonho Lee <mynameisjune111@gmail.com>
To: linux-sound@vger.kernel.org
Cc: tiwai@suse.com, perex@perex.cz, anton.yakovlev@opensynergy.com,
	mst@redhat.com, virtualization@lists.linux.dev,
	linux-kernel@vger.kernel.org, corbet@lwn.net,
	skhan@linuxfoundation.org, rdunlap@infradead.org,
	linux-doc@vger.kernel.org, Joonho Lee <mynameisjune111@gmail.com>
Subject: [PATCH v27 02/17] ALSA: pcm: report partial progress under the stream lock
Date: Thu, 12 Nov 2026 09:46:49 +0900	[thread overview]
Message-ID: <20261112004704.49758-3-mynameisjune111@gmail.com> (raw)
In-Reply-To: <20261112004704.49758-1-mynameisjune111@gmail.com>

Allow a driver to publish subperiod progress under the PCM stream lock
without generating a period timer notification. Use the ordinary pointer
update, XRUN and wakeup path. Capture DRAINING can publish its final
tail while playback and other inactive states retain their existing
behavior.

Handle capture DRAINING separately in the state update: a full buffer is
still readable capture data, while progress beyond the buffer capacity
is an overrun. Playback continues to finish draining when its buffer is
empty.

Refresh capture availability after the unlocked copy and application
pointer commit while DRAINING. A final tail can arrive during the copy;
subtracting only the copied frames from the earlier snapshot can
otherwise finish draining with unread samples left in the ring.

Assisted-by: LLM
Signed-off-by: Joonho Lee <mynameisjune111@gmail.com>

---
include/sound/pcm.h  |    1 +
 sound/core/pcm_lib.c |   40 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/include/sound/pcm.h b/include/sound/pcm.h
--- a/include/sound/pcm.h
+++ b/include/sound/pcm.h
@@ -1182,6 +1182,7 @@
 int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
 		      unsigned int cmd, void *arg);                      
 void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substream);
+void snd_pcm_progress_under_stream_lock(struct snd_pcm_substream *substream);
 void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
 snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
 				     void *buf, bool interleaved,
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -215,8 +215,14 @@
 	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);
+		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+			if (avail >= runtime->buffer_size) {
+				snd_pcm_drain_done(substream);
+				return -EPIPE;
+			}
+		} else if (avail > runtime->buffer_size) {
+			/* A full capture buffer remains readable while draining. */
+			__snd_pcm_xrun(substream);
 			return -EPIPE;
 		}
 	} else {
@@ -1919,6 +1925,30 @@
 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);
+	snd_kill_fasync(substream->runtime->fasync, SIGIO, POLL_IN);
+}
+EXPORT_SYMBOL_GPL(snd_pcm_progress_under_stream_lock);
+
+
+/**
  * snd_pcm_period_elapsed() - update the status of runtime for the next period by acquiring lock of
  *			      PCM substream.
  * @substream: the instance of PCM substream.
@@ -2405,7 +2435,11 @@
 		offset += frames;
 		size -= frames;
 		xfer += frames;
-		avail -= frames;
+		if (!is_playback &&
+		    runtime->state == SNDRV_PCM_STATE_DRAINING)
+			avail = snd_pcm_avail(substream);
+		else
+			avail -= frames;
 		if (is_playback &&
 		    runtime->state == SNDRV_PCM_STATE_PREPARED &&
 		    snd_pcm_playback_hw_avail(runtime) >= (snd_pcm_sframes_t)runtime->start_threshold) {

  parent reply	other threads:[~2026-11-12  0:47 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-12  0:46 [PATCH v27 00/17] ALSA: virtio: preserve PCM progress Joonho Lee
2026-11-12  0:46 ` [PATCH v27 01/17] ALSA: pcm: mark stop-threshold accesses for capture policy sampling Joonho Lee
2026-11-12  0:53   ` sashiko-bot
2026-11-12  0:46 ` Joonho Lee [this message]
2026-11-12  1:02   ` [PATCH v27 02/17] ALSA: pcm: report partial progress under the stream lock sashiko-bot
2026-11-12  0:46 ` [PATCH v27 03/17] ALSA: pcm: add an optional reset operation " Joonho Lee
2026-11-12  1:10   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 04/17] ALSA: pcm: notify drivers after linked prepare completes Joonho Lee
2026-11-12  1:52   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 05/17] ALSA: pcm: serialize linked buffer actions Joonho Lee
2026-11-12  1:37   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 06/17] ALSA: virtio: propagate playback send failures through ACK Joonho Lee
2026-11-12  2:05   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 07/17] ALSA: virtio: Recover PCM state after a failed start Joonho Lee
2026-11-12  2:15   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 08/17] ALSA: virtio: Retain queued messages through device reset Joonho Lee
2026-11-12  2:21   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 09/17] ALSA: virtio: bound PCM transfers and retain DMA buffers Joonho Lee
2026-11-12  2:37   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 10/17] ALSA: virtio: Keep control payloads alive through DMA completion Joonho Lee
2026-11-12  2:27   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 11/17] ALSA: virtio: wait through signals for PCM teardown Joonho Lee
2026-11-12  2:42   ` sashiko-bot
2026-11-12  0:46 ` [PATCH v27 12/17] ALSA: virtio: use request-owned capture and serialize recovery Joonho Lee
2026-11-12  3:06   ` sashiko-bot
2026-11-12  0:47 ` [PATCH v27 13/17] ALSA: virtio: prioritize capture period work Joonho Lee
2026-11-12  2:48   ` sashiko-bot
2026-11-12  0:47 ` [PATCH v27 14/17] docs: describe virtio-sound capture options Joonho Lee
2026-11-12  2:51   ` sashiko-bot
2026-11-12  0:47 ` [PATCH v27 15/17] ALSA: virtio: reject invalid playback completions Joonho Lee
2026-11-12  3:02   ` sashiko-bot
2026-11-12  0:47 ` [PATCH v27 16/17] ALSA: pcm: add an explicit application pointer to indirect playback transfer Joonho Lee
2026-11-12  3:05   ` sashiko-bot
2026-11-12  0:47 ` [PATCH v27 17/17] ALSA: virtio: preserve playback progress across pause and buffer access Joonho Lee
2026-11-12  3:25   ` 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=20261112004704.49758-3-mynameisjune111@gmail.com \
    --to=mynameisjune111@gmail.com \
    --cc=anton.yakovlev@opensynergy.com \
    --cc=corbet@lwn.net \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=perex@perex.cz \
    --cc=rdunlap@infradead.org \
    --cc=skhan@linuxfoundation.org \
    --cc=tiwai@suse.com \
    --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