diff --git a/virtio-devices/src/balloon.rs b/virtio-devices/src/balloon.rs index 8b40a2f1a..cb1a37ba5 100644 --- a/virtio-devices/src/balloon.rs +++ b/virtio-devices/src/balloon.rs @@ -644,7 +644,7 @@ impl VirtioDevice for Balloon { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let mut virtqueues = Vec::new(); let (_, queue, queue_evt) = queues.remove(0); diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index bbc031bdb..e01eb7ec2 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -1104,7 +1104,7 @@ impl VirtioDevice for Block { queue.set_event_idx(event_idx); let queue_size = queue.size(); - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let queue_idx = i as u16; let mut handler = BlockEpollHandler { diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index 53e3f02ad..567ba6a71 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -729,7 +729,7 @@ impl VirtioDevice for Console { error!("Failed to signal console driver: {e:?}"); } - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let (_, input_queue, input_queue_evt) = queues.remove(0); let (_, output_queue, output_queue_evt) = queues.remove(0); diff --git a/virtio-devices/src/device.rs b/virtio-devices/src/device.rs index 9e5dfb138..c81d47fe4 100644 --- a/virtio-devices/src/device.rs +++ b/virtio-devices/src/device.rs @@ -427,16 +427,21 @@ impl VirtioCommon { self.workers = None; } - pub fn dup_eventfds(&self) -> (EventFd, EventFd) { - ( - self.workers - .as_ref() - .unwrap() - .kill_evt() - .try_clone() - .unwrap(), - self.pause_evt.as_ref().unwrap().try_clone().unwrap(), - ) + pub fn dup_eventfds(&self) -> Result<(EventFd, EventFd), ActivateError> { + let kill_evt = self + .workers + .as_ref() + .ok_or(ActivateError::BadActivate)? + .kill_evt() + .try_clone() + .map_err(ActivateError::CloneEventFd)?; + let pause_evt = self + .pause_evt + .as_ref() + .ok_or(ActivateError::BadActivate)? + .try_clone() + .map_err(ActivateError::CloneEventFd)?; + Ok((kill_evt, pause_evt)) } pub fn set_access_platform(&mut self, access_platform: Arc) { diff --git a/virtio-devices/src/iommu.rs b/virtio-devices/src/iommu.rs index 191d823cf..7f04f51e9 100644 --- a/virtio-devices/src/iommu.rs +++ b/virtio-devices/src/iommu.rs @@ -1301,7 +1301,7 @@ impl VirtioDevice for Iommu { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let (_, request_queue, request_queue_evt) = queues.remove(0); let (_, _event_queue, _event_queue_evt) = queues.remove(0); diff --git a/virtio-devices/src/lib.rs b/virtio-devices/src/lib.rs index 7c6ebeecd..d0d2d659f 100644 --- a/virtio-devices/src/lib.rs +++ b/virtio-devices/src/lib.rs @@ -108,8 +108,8 @@ const VIRTIO_F_NOTIFICATION_DATA: u32 = 38; pub enum ActivateError { #[error("Failed to activate virtio device")] BadActivate, - #[error("Failed to clone exit event fd")] - CloneExitEventFd(#[source] std::io::Error), + #[error("Failed to clone EventFd")] + CloneEventFd(#[source] std::io::Error), #[error("Failed to spawn thread")] ThreadSpawn(#[source] std::io::Error), #[error("Failed to setup vhost-user-fs daemon")] diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index 10cb7ee48..ca12a2e4b 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -951,7 +951,7 @@ impl VirtioDevice for Mem { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let (_, queue, queue_evt) = queues.remove(0); diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index 5207f0564..c26fba41c 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -691,7 +691,7 @@ impl VirtioDevice for Net { ctrl_queue.set_event_idx(event_idx); - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let mut ctrl_handler = NetCtrlEpollHandler { mem: mem.clone(), kill_evt, @@ -732,7 +732,7 @@ impl VirtioDevice for Net { let queue_evt_pair = (queue_evt_0, queue_evt_1); - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let rx_rate_limiter: Option = self .rate_limiter_config diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index 790512f83..9f3b58099 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -378,7 +378,7 @@ impl VirtioDevice for Pmem { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; if let Some(disk) = self.disk.as_ref() { let disk = disk.try_clone().map_err(|e| { error!("failed cloning pmem disk: {e}"); diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index 792860091..dfc00c39b 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -253,7 +253,7 @@ impl VirtioDevice for Rng { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; if let Some(file) = self.random_file.as_ref() { let random_file = file.try_clone().map_err(|e| { diff --git a/virtio-devices/src/rtc.rs b/virtio-devices/src/rtc.rs index 6c8de79cf..62b56b793 100644 --- a/virtio-devices/src/rtc.rs +++ b/virtio-devices/src/rtc.rs @@ -624,7 +624,7 @@ impl VirtioDevice for Rtc { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let (_, queue, queue_evt) = queues.remove(0); diff --git a/virtio-devices/src/thread_helper.rs b/virtio-devices/src/thread_helper.rs index f89ca9f82..fc8e3ddb9 100644 --- a/virtio-devices/src/thread_helper.rs +++ b/virtio-devices/src/thread_helper.rs @@ -34,9 +34,7 @@ where let seccomp_filter = get_seccomp_filter(seccomp_action, thread_type) .map_err(ActivateError::CreateSeccompFilter)?; - let thread_exit_evt = exit_evt - .try_clone() - .map_err(ActivateError::CloneExitEventFd)?; + let thread_exit_evt = exit_evt.try_clone().map_err(ActivateError::CloneEventFd)?; let thread_name = name.to_string(); thread::Builder::new() diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index b96c4ed06..ae85a89bf 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -281,7 +281,7 @@ impl VirtioDevice for Blk { // Run a dedicated thread for handling potential reconnections with // the backend. - let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds(); + let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds()?; let mut handler = self.vu_common.activate( mem, diff --git a/virtio-devices/src/vhost_user/fs.rs b/virtio-devices/src/vhost_user/fs.rs index d491cc92f..e501e54e8 100644 --- a/virtio-devices/src/vhost_user/fs.rs +++ b/virtio-devices/src/vhost_user/fs.rs @@ -255,7 +255,7 @@ impl VirtioDevice for Fs { let backend_req_handler: Option> = None; // Run a dedicated thread for handling potential reconnections with // the backend. - let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds(); + let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds()?; let mut handler = self.vu_common.activate( mem, diff --git a/virtio-devices/src/vhost_user/generic_vhost_user.rs b/virtio-devices/src/vhost_user/generic_vhost_user.rs index 51a6d2627..ca744f574 100644 --- a/virtio-devices/src/vhost_user/generic_vhost_user.rs +++ b/virtio-devices/src/vhost_user/generic_vhost_user.rs @@ -317,7 +317,7 @@ impl VirtioDevice for GenericVhostUser { // Run a dedicated thread for handling potential reconnections with // the backend. - let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds(); + let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds()?; let mut handler = self.vu_common.activate( mem, diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index 17f478292..40725b8e1 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -289,7 +289,7 @@ impl VirtioDevice for Net { ctrl_queue.set_event_idx(event_idx); - let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds(); + let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds()?; let mut ctrl_handler = NetCtrlEpollHandler { mem: mem.clone(), @@ -330,7 +330,7 @@ impl VirtioDevice for Net { // Run a dedicated thread for handling potential reconnections with // the backend. - let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds(); + let (kill_evt, pause_evt) = self.vu_common.virtio_common.dup_eventfds()?; let mut handler = self.vu_common.activate( mem, diff --git a/virtio-devices/src/vsock/device.rs b/virtio-devices/src/vsock/device.rs index 047a46da6..b3b4bddf8 100644 --- a/virtio-devices/src/vsock/device.rs +++ b/virtio-devices/src/vsock/device.rs @@ -469,7 +469,7 @@ where device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let mut virtqueues = Vec::new(); let mut queue_evts = Vec::new(); diff --git a/virtio-devices/src/watchdog.rs b/virtio-devices/src/watchdog.rs index eef571e51..8c40d4ee2 100644 --- a/virtio-devices/src/watchdog.rs +++ b/virtio-devices/src/watchdog.rs @@ -328,7 +328,7 @@ impl VirtioDevice for Watchdog { device_status, } = context; self.common.activate(&queues, interrupt_cb.clone())?; - let (kill_evt, pause_evt) = self.common.dup_eventfds(); + let (kill_evt, pause_evt) = self.common.dup_eventfds()?; let reset_evt = self.reset_evt.try_clone().map_err(|e| { error!("Failed to clone reset_evt eventfd: {e}");