crosvm/devices/Cargo.toml
Chih-Yang Hsia c6d01914de device: virtio: snd: Add missing handle_irq_resample
While running alsa_conformance_test against the virtio-snd device, the
driver will randomly stop getting irq events forever. (vp_interrupt will
never get called).

At the same time, the host device will still see an uncleared
`interrupt_status` so the `trigger_interrupt` -> `signal`
will just drop the interrupt signal on
the host device side. And the device can't be used forever when the
issue happens.

Root cause:
Irq resample events never get handled in the virtio-snd device, so the
interrupt handler in guest just can't get notified if there are some
unhanded interrupts in the irq line during the resample event.

Changes:
- Add `f_resample` future in the run_worker
- Use `select!` from futures crate with `async-await` feature
- Change local interrupt in run_worker to Rc<RefCell<interrupt>>
- Use anyhow::Context for errors

BUG=b:202368198
TEST=vm.AudioAlsaConformance.virtio_cras_snd
TEST=Run alsa_conformance_test multiple times in guest VM

Change-Id: Id1440420dcfeccbbb455b1d342863e430ef4b6f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3317327
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Chih-Yang Hsia <paulhsia@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
2021-12-07 03:33:46 +00:00

76 lines
2.2 KiB
TOML

[package]
name = "devices"
version = "0.1.0"
authors = ["The Chromium OS Authors"]
edition = "2018"
[features]
audio = []
audio_cras = ["libcras"]
chromeos = ["dbus", "protobuf", "system_api"]
direct = []
gpu = ["gpu_display","rutabaga_gfx"]
tpm = ["tpm2"]
usb = []
video-decoder = []
video-encoder = []
minigbm = ["rutabaga_gfx/minigbm"]
x = ["gpu_display/x"]
virgl_renderer = ["gpu", "rutabaga_gfx/virgl_renderer"]
gfxstream = ["gpu", "rutabaga_gfx/gfxstream"]
[dependencies]
async-task = "4"
acpi_tables = {path = "../acpi_tables" }
anyhow = "*"
audio_streams = "*"
base = { path = "../common/base" }
bit_field = { path = "../bit_field" }
cros_async = { path = "../common/cros_async" }
data_model = { path = "../common/data_model" }
dbus = { version = "0.9", optional = true }
disk = { path = "../disk" }
enumn = "0.1.0"
fuse = {path = "../fuse" }
getopts = { version = "0.2" }
gpu_display = { path = "../gpu_display", optional = true }
rutabaga_gfx = { path = "../rutabaga_gfx", optional = true }
hypervisor = { path = "../hypervisor" }
kvm_sys = { path = "../kvm_sys" }
libc = "*"
libcras = { version = "*", optional = true }
libvda = { path = "../libvda", optional = true }
linux_input_sys = { path = "../linux_input_sys" }
minijail = "*"
net_sys = { path = "../net_sys" }
net_util = { path = "../net_util" }
once_cell = "1.7.2"
p9 = "*"
power_monitor = { path = "../power_monitor" }
protobuf = { version = "2.3", optional = true }
protos = { path = "../protos", optional = true }
remain = "*"
resources = { path = "../resources" }
serde = { version = "1", features = [ "derive" ] }
serde_json = "1"
smallvec = "1.6.1"
sync = { path = "../common/sync" }
sys_util = { path = "../common/sys_util" }
system_api = { version = "*", optional = true }
thiserror = "1.0.20"
tpm2 = { path = "../tpm2", optional = true }
usb_util = { path = "../usb_util" }
vfio_sys = { path = "../vfio_sys" }
vhost = { path = "../vhost" }
vmm_vhost = { path = "../third_party/vmm_vhost", features = ["vmm", "device"] }
virtio_sys = { path = "../virtio_sys" }
vm_control = { path = "../vm_control" }
vm_memory = { path = "../vm_memory" }
[dependencies.futures]
version = "*"
features = ["async-await", "std"]
default-features = false
[dev-dependencies]
tempfile = "3"