diff --git a/virtio-devices/src/transport/pci_device.rs b/virtio-devices/src/transport/pci_device.rs index 8d52be1c8..a26cc335e 100644 --- a/virtio-devices/src/transport/pci_device.rs +++ b/virtio-devices/src/transport/pci_device.rs @@ -641,6 +641,30 @@ impl VirtioPciDevice { pub fn virtio_device(&self) -> Arc> { self.device.clone() } + + pub fn maybe_activate(&mut self) { + if self.needs_activation() { + if let Some(virtio_interrupt) = self.virtio_interrupt.take() { + if self.memory.is_some() { + let mem = self.memory.as_ref().unwrap().clone(); + let mut device = self.device.lock().unwrap(); + device + .activate( + mem, + virtio_interrupt, + self.queues.clone(), + self.queue_evts.split_off(0), + ) + .expect("Failed to activate device"); + self.device_activated = true; + } + } + } + } + + fn needs_activation(&self) -> bool { + !self.device_activated && self.is_driver_ready() && self.are_queues_valid() + } } impl VirtioTransport for VirtioPciDevice { @@ -976,23 +1000,8 @@ impl PciDevice for VirtioPciDevice { _ => (), }; - if !self.device_activated && self.is_driver_ready() && self.are_queues_valid() { - if let Some(virtio_interrupt) = self.virtio_interrupt.take() { - if self.memory.is_some() { - let mem = self.memory.as_ref().unwrap().clone(); - let mut device = self.device.lock().unwrap(); - device - .activate( - mem, - virtio_interrupt, - self.queues.clone(), - self.queue_evts.split_off(0), - ) - .expect("Failed to activate device"); - self.device_activated = true; - } - } - } + // Try and activate the device if the driver status has changed + self.maybe_activate(); // Device has been reset by the driver if self.device_activated && self.is_driver_init() {