diff --git a/Cargo.lock b/Cargo.lock index 6a7782ff1f..bca744829b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6949,6 +6949,7 @@ dependencies = [ "bitfield-struct", "libc", "nix 0.26.4", + "pal_event", "tracing", "vfio-bindings", ] diff --git a/vm/devices/user_driver/vfio_sys/Cargo.toml b/vm/devices/user_driver/vfio_sys/Cargo.toml index b70c8a307a..eb19f45eb5 100644 --- a/vm/devices/user_driver/vfio_sys/Cargo.toml +++ b/vm/devices/user_driver/vfio_sys/Cargo.toml @@ -11,6 +11,7 @@ libc.workspace = true nix = { workspace = true, features = ["ioctl"] } tracing.workspace = true vfio-bindings.workspace = true +pal_event.workspace = true [lints] workspace = true diff --git a/vm/devices/user_driver/vfio_sys/src/lib.rs b/vm/devices/user_driver/vfio_sys/src/lib.rs index e80d50d64e..f5fb3243b3 100644 --- a/vm/devices/user_driver/vfio_sys/src/lib.rs +++ b/vm/devices/user_driver/vfio_sys/src/lib.rs @@ -12,6 +12,7 @@ use std::fs; use std::fs::File; use std::io::BufRead; use std::io::BufReader; +use std::iter; use std::os::unix::prelude::*; use std::path::Path; use vfio_bindings::bindings::vfio::vfio_device_info; @@ -392,6 +393,17 @@ impl AsFd for Device { } } +impl Drop for Device { + fn drop(&mut self) { + match self.map_msix(0, iter::empty::()) { + Ok(_) => (), + Err(e) => { + tracing::error!("vfio_sys::Device::drop error calling map_msix: {:?}", e); + } + } + } +} + /// Find the Linux irq number for the MSI-X `index` of the PCI device `pci_id`. pub fn find_msix_irq(pci_id: &str, index: u32) -> anyhow::Result { let buffered = BufReader::new(File::open("/proc/interrupts")?);