From 23f9ec50fb0dd2777313ede71043055cc59ed191 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 18 Jan 2021 12:38:08 +0000 Subject: [PATCH] virtio-devices: Simplify virtio device reset Rather than having to give and return the ioeventfd used for a device clone them each time. This will make it simpler when we start handling the driver enabling fewer queues than advertised by the device. Signed-off-by: Rob Bradford --- virtio-devices/src/balloon.rs | 2 +- virtio-devices/src/block.rs | 2 +- virtio-devices/src/block_io_uring.rs | 2 +- virtio-devices/src/console.rs | 2 +- virtio-devices/src/device.rs | 11 +++----- virtio-devices/src/iommu.rs | 2 +- virtio-devices/src/mem.rs | 2 +- virtio-devices/src/net.rs | 2 +- virtio-devices/src/pmem.rs | 2 +- virtio-devices/src/rng.rs | 2 +- virtio-devices/src/transport/pci_device.rs | 30 ++++++++++------------ virtio-devices/src/vhost_user/blk.rs | 9 +++---- virtio-devices/src/vhost_user/fs.rs | 9 +++---- virtio-devices/src/vhost_user/net.rs | 9 +++---- virtio-devices/src/vsock/device.rs | 2 +- virtio-devices/src/watchdog.rs | 2 +- 16 files changed, 38 insertions(+), 52 deletions(-) diff --git a/virtio-devices/src/balloon.rs b/virtio-devices/src/balloon.rs index 0611de43c..31422271a 100644 --- a/virtio-devices/src/balloon.rs +++ b/virtio-devices/src/balloon.rs @@ -464,7 +464,7 @@ impl VirtioDevice for Balloon { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } } diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 57c4174dc..05e3bc3a2 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -512,7 +512,7 @@ impl VirtioDevice for Block { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } diff --git a/virtio-devices/src/block_io_uring.rs b/virtio-devices/src/block_io_uring.rs index 07b259cf9..2d795cb2a 100644 --- a/virtio-devices/src/block_io_uring.rs +++ b/virtio-devices/src/block_io_uring.rs @@ -581,7 +581,7 @@ impl VirtioDevice for BlockIoUring { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index b1a930302..28a1ce7fe 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -489,7 +489,7 @@ impl VirtioDevice for Console { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } } diff --git a/virtio-devices/src/device.rs b/virtio-devices/src/device.rs index 6371ac107..6b095b6d4 100644 --- a/virtio-devices/src/device.rs +++ b/virtio-devices/src/device.rs @@ -116,7 +116,7 @@ pub trait VirtioDevice: Send { /// Optionally deactivates this device and returns ownership of the guest memory map, interrupt /// event, and queue events. - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { None } @@ -288,7 +288,7 @@ impl VirtioCommon { Ok(()) } - pub fn reset(&mut self) -> Option<(Arc, Vec)> { + pub fn reset(&mut self) -> Option> { // We first must resume the virtio thread if it was paused. if self.pause_evt.take().is_some() { self.resume().ok()?; @@ -307,11 +307,8 @@ impl VirtioCommon { } } - // Return the interrupt and queue EventFDs - Some(( - self.interrupt_cb.take().unwrap(), - self.queue_evts.take().unwrap(), - )) + // Return the interrupt + Some(self.interrupt_cb.take().unwrap()) } } diff --git a/virtio-devices/src/iommu.rs b/virtio-devices/src/iommu.rs index 8270a12b8..0e4a818c1 100644 --- a/virtio-devices/src/iommu.rs +++ b/virtio-devices/src/iommu.rs @@ -953,7 +953,7 @@ impl VirtioDevice for Iommu { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } } diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index 383ae9331..7ed24d380 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -878,7 +878,7 @@ impl VirtioDevice for Mem { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } } diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index c59aa1fc7..3c0da2b53 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -523,7 +523,7 @@ impl VirtioDevice for Net { Err(ActivateError::BadActivate) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index 0c51b7590..f820767da 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -434,7 +434,7 @@ impl VirtioDevice for Pmem { Err(ActivateError::BadActivate) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index 05dbfa608..879383607 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -279,7 +279,7 @@ impl VirtioDevice for Rng { Err(ActivateError::BadActivate) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } } diff --git a/virtio-devices/src/transport/pci_device.rs b/virtio-devices/src/transport/pci_device.rs index 61cb722be..f33dd6cf9 100644 --- a/virtio-devices/src/transport/pci_device.rs +++ b/virtio-devices/src/transport/pci_device.rs @@ -659,13 +659,13 @@ impl VirtioPciDevice { if self.memory.is_some() { let mem = self.memory.as_ref().unwrap().clone(); let mut device = self.device.lock().unwrap(); + let mut queue_evts = Vec::new(); + let queues = self.queues.clone(); + for i in 0..queues.len() { + queue_evts.push(self.queue_evts[i].try_clone().unwrap()); + } device - .activate( - mem, - virtio_interrupt, - self.queues.clone(), - self.queue_evts.split_off(0), - ) + .activate(mem, virtio_interrupt, queues, queue_evts) .expect("Failed to activate device"); self.device_activated.store(true, Ordering::SeqCst); info!("{}: Waiting for barrier", self.id); @@ -1032,11 +1032,9 @@ impl PciDevice for VirtioPciDevice { // Device has been reset by the driver if self.device_activated.load(Ordering::SeqCst) && self.is_driver_init() { let mut device = self.device.lock().unwrap(); - if let Some((virtio_interrupt, mut queue_evts)) = device.reset() { - // Upon reset the device returns its interrupt EventFD and it's queue EventFDs + if let Some(virtio_interrupt) = device.reset() { + // Upon reset the device returns its interrupt EventFD self.virtio_interrupt = Some(virtio_interrupt); - self.queue_evts.append(&mut queue_evts); - self.device_activated.store(false, Ordering::SeqCst); // Reset queue readiness (changes queue_enable), queue sizes @@ -1162,13 +1160,13 @@ impl Snapshottable for VirtioPciDevice { if self.memory.is_some() { let mem = self.memory.as_ref().unwrap().clone(); let mut device = self.device.lock().unwrap(); + let mut queue_evts = Vec::new(); + let queues = self.queues.clone(); + for i in 0..queues.len() { + queue_evts.push(self.queue_evts[i].try_clone().unwrap()); + } device - .activate( - mem, - virtio_interrupt, - self.queues.clone(), - self.queue_evts.split_off(0), - ) + .activate(mem, virtio_interrupt, queues, queue_evts) .map_err(|e| { MigratableError::Restore(anyhow!( "Failed activating the device: {:?}", diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index 6809a006f..af4afc8c5 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -274,7 +274,7 @@ impl VirtioDevice for Blk { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { // We first must resume the virtio thread if it was paused. if self.common.pause_evt.take().is_some() { self.common.resume().ok()?; @@ -290,11 +290,8 @@ impl VirtioDevice for Blk { let _ = kill_evt.write(1); } - // Return the interrupt and queue EventFDs - Some(( - self.common.interrupt_cb.take().unwrap(), - self.common.queue_evts.take().unwrap(), - )) + // Return the interrupt + Some(self.common.interrupt_cb.take().unwrap()) } fn shutdown(&mut self) { diff --git a/virtio-devices/src/vhost_user/fs.rs b/virtio-devices/src/vhost_user/fs.rs index 4f5f5deb7..3d51f855f 100644 --- a/virtio-devices/src/vhost_user/fs.rs +++ b/virtio-devices/src/vhost_user/fs.rs @@ -494,7 +494,7 @@ impl VirtioDevice for Fs { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { // We first must resume the virtio thread if it was paused. if self.common.pause_evt.take().is_some() { self.common.resume().ok()?; @@ -510,11 +510,8 @@ impl VirtioDevice for Fs { let _ = kill_evt.write(1); } - // Return the interrupt and queue EventFDs - Some(( - self.common.interrupt_cb.take().unwrap(), - self.common.queue_evts.take().unwrap(), - )) + // Return the interrupt + Some(self.common.interrupt_cb.take().unwrap()) } fn shutdown(&mut self) { diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index 431972158..284189a7f 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -330,7 +330,7 @@ impl VirtioDevice for Net { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { // We first must resume the virtio thread if it was paused. if self.common.pause_evt.take().is_some() { self.common.resume().ok()?; @@ -346,11 +346,8 @@ impl VirtioDevice for Net { let _ = kill_evt.write(1); } - // Return the interrupt and queue EventFDs - Some(( - self.common.interrupt_cb.take().unwrap(), - self.common.queue_evts.take().unwrap(), - )) + // Return the interrupt + Some(self.common.interrupt_cb.take().unwrap()) } fn shutdown(&mut self) { diff --git a/virtio-devices/src/vsock/device.rs b/virtio-devices/src/vsock/device.rs index 6b12f9b84..bb830059f 100644 --- a/virtio-devices/src/vsock/device.rs +++ b/virtio-devices/src/vsock/device.rs @@ -475,7 +475,7 @@ where Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } diff --git a/virtio-devices/src/watchdog.rs b/virtio-devices/src/watchdog.rs index 0fef853e9..0478f7f50 100644 --- a/virtio-devices/src/watchdog.rs +++ b/virtio-devices/src/watchdog.rs @@ -358,7 +358,7 @@ impl VirtioDevice for Watchdog { Ok(()) } - fn reset(&mut self) -> Option<(Arc, Vec)> { + fn reset(&mut self) -> Option> { self.common.reset() } }