Re: [PATCH v11 00/14] ALSA: virtio: staged capture recovery and PCM RESET synchronization

From: Takashi Iwai

Date: Mon Nov 02 2026 - 03:58:03 EST


On Sat, 31 Oct 2026 03:08:41 +0100,
Joonho Lee wrote:
>
> Hi Takashi,
>
> This revision supersedes v10 and includes the unmerged prerequisites.
> Apply patches 1-14 to sound.git for-next at
> a4311e9447bbb219044db38897f95be112f46a8a. Targeting 7.5 or later still
> works for me.
>
> Previous revision:
> https://lore.kernel.org/linux-sound/20261030052629.27742-1-mynameisjune111@xxxxxxxxx/T/
>
> The series adds staged capture accounting for shared clients such as
> dsnoop, lifecycle recovery, and synchronized PCM RESET accounting. The
> capture compatibility options remain opt-in and disabled by default.
>
> Changes since v10
>
> Sashiko raised nine findings in patches 4, 9, 12 and 14. This revision
> folds the corrections into the relevant patches and carries the queue
> retirement checks from patch 3.
>
> Patch 4 seeds ordinary RX once per prepare. Native STOP leaves requests
> and unread samples owned by the current ring, so resume preserves them.
> Consumed or discarded space returns through ACK and RESET. This avoids
> inflated pending lengths and resubmission of unread DMA slots.
>
> Patch 9 restores notifications after rejected native pause and handles
> both success and failure on the already-running START path. Ordinary
> capture now honors the XRUN latch in ACK. Its monotonic completion count
> also detects a whole unobserved ring and reports XRUN for prepare
> recovery. Capture completions preserve the latch from this patch onward.
>
> A first version of the recovery notification exposed an old ring of
> samples after paused RESET. Passing every wakeup through period_elapsed
> let ALSA infer a wrap without a newly completed period. The worker now
> uses the partial-progress helper for synthetic wakeups and retains PCM
> timer notifications for actual new periods. The sample comparison and
> a periodic PCM timer test both reproduce the candidate regression and
> pass with this separation.
>
> Patch 12 removes the second appl_ptr assignment after a callback member
> has completed prepare. A linked member's prepare can sleep while the
> first member accepts SYNC_PTR. The callback path now preserves that
> acknowledgment under its PCM lock. Explicit RESET retains playback
> silence handling; prepare leaves filling to the normal START path.
>
> Patch 14 checks the existing XRUN and lifecycle state before mutating
> paused indirect accounting. The RX queue and substream locks cover its
> pointer observation, temporary accounting and refill. The notification
> floor follows the RESET observation. Refill failure retains the existing
> zero-return policy while the worker reports XRUN and prepare recovers it.
>
> Patch 3 retires each queue wrapper under the detach lock and checks queue
> identity in PCM, control and event callbacks. The proposed detached-ring
> IRQ failure was not reproduced on the tested PCI transport: forced
> callback tests passed on both versions. This part strengthens teardown
> ownership boundaries; the transport reset callback synchronization
> contract still applies.
>
> Patch layout
>
> 1-6: ACK errors, START/RELEASE recovery and request/DMA lifetime.
> 7: Core stop-threshold accesses used by capture policy sampling.
> 8: Partial-progress notification under the PCM stream lock.
> 9: Staged capture, shared capture policy and lifecycle recovery.
> 10: Staged capture work priority.
> 11: Capture compatibility option documentation.
> 12: Optional PCM reset operation under the stream lock.
> 13: Staged capture RESET accounting.
> 14: Ordinary capture RESET accounting.
>
> The core API additions remain separate from their driver users. Drivers
> without a reset callback retain the ioctl path. Linked RESET and prepare
> retain their first-error, partial-completion contract. A zero RESET
> return allows the core rebase to finish; later I/O can report -EPIPE and
> require prepare or reopen. The internal snd_pcm_ops addition requires
> out-of-tree modules using it to be rebuilt.
>
> Validation
>
> The functional candidate passed 23 ARM64 QEMU runs with KASAN and lockdep,
> covering error injection, recovery, reopen and compatibility tests.
> The core fixtures covered 72 atomic/nonatomic, callback/legacy and linked
> failure cases, including playback silence. snd-dummy and virtio-snd each
> passed three playback/capture cycles. Additional timer comparisons kept
> real period ticks and removed the synthetic resume tick.
>
> For both ordinary and staged capture, an uninstrumented kernel recorded
> 70 seconds through RW and another 70 seconds through MMAP after
> PAUSE, RESET and resume, followed by reopen. All 14 segments,
> 14,208,000 S16 mono frames at 48 kHz, matched independently generated
> SHA-256 values from QEMU sequence metadata. The oracle includes the
> intended RESET discard and backend epoch boundaries. The earlier failing
> candidate and its sample comparison remain in the local evidence.
>
> The paused interleaving test verifies the new atomic observation
> boundary; it does not establish sample loss in the original code.
> ARM64 W=1 Image/modules and ARM32 LLVM object builds passed. Test hooks
> remain separate from the submitted code. Each mail patch is applied to
> the pinned baseline and compared with its expected intermediate source.
>
> Fresh v11 postimages at stages 3-14 built without compiler warnings.
> Nine additional stage VMs passed, including eight injected recovery cases
> at patch 9, staged native and pause-restart capture, and paused RESET at
> patches 13 and 14. All six additional MMAP segments matched the sequence
> oracle. Neighboring patches have refreshed contexts where earlier changes
> moved their code.
>
> Packaging also adds braces to one existing staged if arm. The new module's
> executable, relocation, data and symbol sections match the tested module
> byte for byte. The fresh stage tests above use this formatted source.
>
> These results cover QEMU synthetic input. Physical VZ/MOTU acceptance,
> an independent KCSAN run and broader format/multichannel and ARM32
> runtime testing remain pending. The high-load TCG scheduling results
> from earlier revisions still limit performance conclusions. The new
> ordinary full-ring check reports -EPIPE where the modulo-only path could
> wait indefinitely. The core progress helper and linked RESET contract
> still need maintainer review.
>
> Coding assistance was used for analysis, implementation, fixtures and
> this explanation. The patches carry Assisted-by: LLM.
>
> Thanks,
> Joonho

Sashiko reported still a few issues. As they seem to be rather minor
issues, I can work v11 now and you can fix incrementally. Or you can
resubmit v12, if any. Let me know which way you prefer.


thanks,

Takashi