From 7c9e8b103fee21e1bff5516e622ea25d2958b0aa Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Fri, 14 Feb 2020 10:08:14 +0000 Subject: [PATCH] vmm: device_manager: Shutdown all virtio devices When the DeviceManager is dropped explicitly shutdown() all virtio devices. Signed-off-by: Rob Bradford --- vmm/src/device_manager.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 1fe145974..36bef0c81 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -396,6 +396,9 @@ pub struct DeviceManager { // Memory Manager memory_manager: Arc>, + + // The virtio devices on the system + virtio_devices: Vec<(VirtioDeviceArc, bool)>, } impl DeviceManager { @@ -478,6 +481,7 @@ impl DeviceManager { config, migratable_devices, memory_manager, + virtio_devices: Vec::new(), }; device_manager @@ -499,11 +503,13 @@ impl DeviceManager { virtio_devices.append(&mut device_manager.make_virtio_devices()?); if cfg!(feature = "pci_support") { - device_manager.add_pci_devices(virtio_devices, &msi_interrupt_manager)?; + device_manager.add_pci_devices(virtio_devices.clone(), &msi_interrupt_manager)?; } else if cfg!(feature = "mmio_support") { - device_manager.add_mmio_devices(virtio_devices, &legacy_interrupt_manager)?; + device_manager.add_mmio_devices(virtio_devices.clone(), &legacy_interrupt_manager)?; } + device_manager.virtio_devices = virtio_devices; + Ok(device_manager) } @@ -1685,3 +1691,11 @@ impl Pausable for DeviceManager { impl Snapshotable for DeviceManager {} impl Migratable for DeviceManager {} + +impl Drop for DeviceManager { + fn drop(&mut self) { + for (device, _) in self.virtio_devices.drain(..) { + device.lock().unwrap().shutdown(); + } + } +}