Re: [PATCH v4 0/2] ALSA: virtio-snd: fix dsnoop capture with staged buffers

From: Takashi Iwai

Date: Tue Oct 27 2026 - 05:15:26 EST


On Sun, 25 Oct 2026 07:40:36 +0100,
Joonho Lee wrote:
>
> Hi,
>
> Changes in v4:
> * Arm synchronous stop before paused capture enters XRUN through ACK or
> period work, so recovery releases pending RX requests before prepare.
> * Add read/forward ACK regressions for first-prepare recovery and direct
> close/reopen, with native pause and pause-restart on one and two vCPUs.
> * Keep patch 1 and the prerequisite metadata unchanged.
>
> Sashiko identified a missing cleanup path in v3 patch 2:
> https://sashiko.dev/#/patchset/20261025055702.69259-1-mynameisjune111%40gmail.com?part=2
>
> Previous version:
> https://lore.kernel.org/all/20261025055702.69259-1-mynameisjune111@xxxxxxxxx/
>
> This series fixes dsnoop capture on top of the staged-capture virtio-snd
> changes. dsnoop configures its slave with stop_threshold == boundary and
> can keep capture running without advancing the slave application pointer as
> an ordinary reader would. The staged-capture accounting currently exhausts
> its bounded unread capacity in this configuration.
>
> The first patch marks stop_threshold accesses used by the driver's policy
> sampling. READ_ONCE/WRITE_ONCE provide single-access annotations; the
> virtio-snd state transitions remain protected by the substream lock.
>
> The second patch caches the prepared boundary and samples the stop policy
> under that lock. A completion uses one sampled policy for validation,
> copying and queue refill. Free-running capture keeps requests queued and
> retains the existing frame, payload and pointer-window checks. Returning to
> bounded capture restores unread accounting from the monotonic counters. If
> the outstanding data already fills the ring, the policy helper returns
> -EPIPE without changing the cached mode or counters. The detecting RX,
> pointer or ACK path then reports XRUN through its existing error path.
> Native pause-release refill failures schedule the period worker to move a
> paused stream to XRUN and wake capture waiters.
> This does not guarantee a synchronous error from the sw_params ioctl.
>
> The ACK accounting and subsequent queue refill each sample the policy under
> the appropriate locks. Prepare and teardown reset the cached state. The
> existing ACK-race and priority changes are prerequisites to this series and
> are excluded from these two diffs.
>
> New testing for v4:
>
> * v3 reproduced -EPIPE from paused read/forward ACK, followed by -EBADFD
> on the first prepare in both native pause and pause-restart modes.
> * The corrected module passed 16 combinations of ACK operation, recovery
> route, pause mode and vCPU count under ARM64 QEMU with KASAN/lockdep.
> Prepare recovery uses the first prepare without an intervening drop.
> Recovery and reopening each capture 48,000 frames.
> * The native-pause regression and 13-case mode suite also passed.
> No KASAN or lockdep diagnostics were recorded in the six final VM runs.
> * Direct close/reopen succeeded even on v3 in this fixture; these results
> establish the prepare regression, without establishing a persistent
> buffer leak across close. Forced RX/pause interleaving, new physical
> microphone tests and KCSAN reruns were not performed for v4.
>
> Earlier testing for v3:
>
> * ARM64 QEMU with KASAN and lockdep, native pause: v2 returned -EPIPE
> but stayed PAUSED, and a waiting poll timed out. The corrected module
> reached XRUN, woke poll with POLLERR and returned -EPIPE from read.
> Prepare recovery and reopening each captured 48,000 frames. The
> corrected case passed with both one and two vCPUs.
> * The 13-case mode suite passed with the corrected module, including
> direct and mmap capture, policy transitions, delayed-reader recovery,
> reopening, mixed-rate dsnoop readers and client departure. KASAN and
> lockdep reported no diagnostics in these runs.
>
> The following testing was performed on v2 before this focused change:
>
> * ARM64 QEMU synthetic dsnoop capture: 12 files and 2,160,000 frames
> matched the reference sequence from each client's observed starting
> position. All 48 corruption, loss, duplication and reordering controls
> were detected.
> * Default KCSAN: 13/13 cases and 619 policy transitions passed without
> race or lockdep reports. Forced RX/ACK policy changes and four isolated
> policy-helper branches passed under KASAN and KCSAN.
> * macOS VZ with MOTU UltraLite-mk5 at 48 kHz: comparisons used one or two
> vCPUs and idle or CPU-saturated guests. The baseline failed all 32
> shared-client captures. The candidate passed 48 captures and eight
> recovery diagnostics, including mixed-rate sharing, client departure,
> reopening and recovery after an intentionally delayed reader.
> Loaded shared captures ran for 70 seconds. All eight accepted VM runs
> shut down on the first request.
>
> The physical tests checked frame counts and nonzero input. Exact sample
> continuity was checked with the QEMU synthetic source. VZ exposed mono;
> these tests do not establish physical input-channel routing or multichannel
> support. Aggressive KCSAN still produced dsnoop client-threshold XRUNs with
> a 160 ms buffer. Further isolation supports a deadline sensitivity, but
> does not exclude every kernel timing contribution. Separate generic KCSAN
> reports remain recorded in the test evidence.
>
> This series depends on the staged-capture prerequisite stack below. The
> tested local base is 8d0d4c1a6c4bcb81ae9f52d1c0d979fafb2e22f2, consisting
> of nine prerequisite patches above sound.git commit
> 5618f6837ef3314e2c581d4c05ec13b7ed975cb4.
>
> Prerequisites, in application order:
>
> 1-5. Lifetime and error recovery v3:
> https://lore.kernel.org/all/cover.1791881787.git.mynameisjune111@xxxxxxxxx/
> 6. Generic teardown/control wait v2:
> https://lore.kernel.org/all/rfc-v2-generic-control-wait-0.2eddd58a796e497f@xxxxxxxxx/
> 7. VZ staged capture v2:
> https://lore.kernel.org/all/rfc-v2-vz-capture-compat-1.b9ab4c1540dc4691@xxxxxxxxx/
> 8-9. ACK accounting and high-priority period work:
> https://lore.kernel.org/all/rfc-virtio-snd-capture-followups-1.f2737c95c12e45b4@xxxxxxxxx/
> https://lore.kernel.org/all/rfc-virtio-snd-capture-followups-2.f2737c95c12e45b4@xxxxxxxxx/
>
> This fixes the staged-capture accounting introduced by that prerequisite
> stack. The reproductions do not establish the same failure in an unmodified
> upstream kernel.
>
> The policy uses the existing stop_threshold == boundary convention.
> Sampling it under the driver lock avoids introducing a PCM stream lock into
> RX completion. A completion overlapping a policy update may finish with the
> previous policy; its accounting and refill use that same sample. Rejecting
> a transition whose bounded accounting cannot be restored preserves
> explicit overflow detection and lets the caller recover the stream.
>
> Patches:
> ALSA: pcm: mark stop-threshold accesses for capture policy sampling
> ALSA: virtio-snd: fix dsnoop capture with staged buffers

The patch2 doesn't seem cleanly applicable to the latest sound git
tree. Could you verify and rebase/submit? I think it'll be a
material for 7.5, as it's no regression fix, though.


thanks,

Takashi