From 049746fb8afc80f17152edd253e0944a404dd328 Mon Sep 17 00:00:00 2001 From: Chih-Yang Hsia Date: Mon, 6 Dec 2021 22:21:00 +0800 Subject: [PATCH] device: virtio: snd: Call release_worker in prepare Since VIRTIO_SND_R_PCM_PREPARE -> VIRTIO_SND_R_PCM_PREPARE is a valid transition, we need to release the worker if it's already in VIRTIO_SND_R_PCM_PREPARE state. Or we could trigger ``` Error in handling tx queue: Error in mpsc: send failed because receiver is gone ``` in handle_pcm_queue while sending `desc_chain` to start_pcm_worker through the `stream_info.sender()`. BUG=b:202368198 TEST=Run alsa_conformance_test multiple times Change-Id: I5f8ee370832ee162fdef71d396dfe848d88af7e1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3317328 Tested-by: kokoro Commit-Queue: Chih-Yang Hsia Reviewed-by: Woody Chow Reviewed-by: Chirantan Ekbote --- devices/src/virtio/snd/cras_backend/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devices/src/virtio/snd/cras_backend/mod.rs b/devices/src/virtio/snd/cras_backend/mod.rs index 276128acbc..62251bdd6d 100644 --- a/devices/src/virtio/snd/cras_backend/mod.rs +++ b/devices/src/virtio/snd/cras_backend/mod.rs @@ -270,6 +270,9 @@ impl<'a> StreamInfo<'a> { ); return Err(Error::OperationNotSupported); } + if self.state == VIRTIO_SND_R_PCM_PREPARE { + self.release_worker().await?; + } let frame_size = self.channels as usize * self.format.sample_bytes(); if self.period_bytes % frame_size != 0 { error!("period_bytes must be divisible by frame size");