From df5b803a6328edab4e47982656d141b7d5ba26fe Mon Sep 17 00:00:00 2001 From: Bo Chen Date: Thu, 11 Aug 2022 17:16:27 -0700 Subject: [PATCH] virtio-devices: Shutdown VMM upon worker thread errors Fixes: #4462 Signed-off-by: Bo Chen --- virtio-devices/src/balloon.rs | 6 +----- virtio-devices/src/block.rs | 6 +----- virtio-devices/src/console.rs | 6 +----- virtio-devices/src/iommu.rs | 6 +----- virtio-devices/src/mem.rs | 6 +----- virtio-devices/src/net.rs | 12 ++---------- virtio-devices/src/pmem.rs | 6 +----- virtio-devices/src/rng.rs | 6 +----- virtio-devices/src/thread_helper.rs | 19 +++++++++++++------ virtio-devices/src/vhost_user/blk.rs | 6 +----- virtio-devices/src/vhost_user/fs.rs | 6 +----- virtio-devices/src/vhost_user/net.rs | 12 ++---------- virtio-devices/src/vsock/device.rs | 6 +----- virtio-devices/src/watchdog.rs | 6 +----- 14 files changed, 28 insertions(+), 81 deletions(-) diff --git a/virtio-devices/src/balloon.rs b/virtio-devices/src/balloon.rs index 7293a6844..47daefb6f 100644 --- a/virtio-devices/src/balloon.rs +++ b/virtio-devices/src/balloon.rs @@ -603,11 +603,7 @@ impl VirtioDevice for Balloon { Thread::VirtioBalloon, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 51726bc20..c3270b7e6 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -647,11 +647,7 @@ impl VirtioDevice for Block { Thread::VirtioBlock, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; } diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index 89f9e229b..ca0376139 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -559,11 +559,7 @@ impl VirtioDevice for Console { Thread::VirtioConsole, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/iommu.rs b/virtio-devices/src/iommu.rs index 3d3d0deab..d2981ef94 100644 --- a/virtio-devices/src/iommu.rs +++ b/virtio-devices/src/iommu.rs @@ -1097,11 +1097,7 @@ impl VirtioDevice for Iommu { Thread::VirtioIommu, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index 350094155..36222fa0f 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -1063,11 +1063,7 @@ impl VirtioDevice for Mem { Thread::VirtioMem, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index 4bcfda506..e812c6f75 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -655,11 +655,7 @@ impl VirtioDevice for Net { Thread::VirtioNetCtl, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = ctrl_handler.run_ctrl(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || ctrl_handler.run_ctrl(paused, paused_sync.unwrap()), )?; self.ctrl_queue_epoll_thread = Some(epoll_threads.remove(0)); } @@ -736,11 +732,7 @@ impl VirtioDevice for Net { Thread::VirtioNet, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; } diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index 8fceb1a08..bd780d311 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -421,11 +421,7 @@ impl VirtioDevice for Pmem { Thread::VirtioPmem, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index 1552264dd..f8b05e20e 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -260,11 +260,7 @@ impl VirtioDevice for Rng { Thread::VirtioRng, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/thread_helper.rs b/virtio-devices/src/thread_helper.rs index 6260bdde9..5d6a113b9 100644 --- a/virtio-devices/src/thread_helper.rs +++ b/virtio-devices/src/thread_helper.rs @@ -4,6 +4,7 @@ // use crate::{ + epoll_helper::EpollHelperError, seccomp_filters::{get_seccomp_filter, Thread}, ActivateError, }; @@ -23,7 +24,7 @@ pub(crate) fn spawn_virtio_thread( f: F, ) -> Result<(), ActivateError> where - F: FnOnce(), + F: FnOnce() -> std::result::Result<(), EpollHelperError>, F: Send + 'static, { let seccomp_filter = get_seccomp_filter(seccomp_action, thread_type) @@ -44,12 +45,18 @@ where return; } } - std::panic::catch_unwind(AssertUnwindSafe(f)) - .or_else(|_| { + match std::panic::catch_unwind(AssertUnwindSafe(f)) { + Err(_) => { error!("{} thread panicked", thread_name); - thread_exit_evt.write(1) - }) - .ok(); + thread_exit_evt.write(1).ok(); + } + Ok(r) => { + if let Err(e) = r { + error!("Error running worker: {:?}", e); + thread_exit_evt.write(1).ok(); + } + } + }; }) .map(|thread| epoll_threads.push(thread)) .map_err(|e| { diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index bae75c400..35a06a59c 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -324,11 +324,7 @@ impl VirtioDevice for Blk { Thread::VirtioVhostBlock, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.epoll_thread = Some(epoll_threads.remove(0)); diff --git a/virtio-devices/src/vhost_user/fs.rs b/virtio-devices/src/vhost_user/fs.rs index e0778c839..78625e674 100644 --- a/virtio-devices/src/vhost_user/fs.rs +++ b/virtio-devices/src/vhost_user/fs.rs @@ -563,11 +563,7 @@ impl VirtioDevice for Fs { Thread::VirtioVhostFs, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.epoll_thread = Some(epoll_threads.remove(0)); diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index ff9f27ff7..93cf195fd 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -313,11 +313,7 @@ impl VirtioDevice for Net { Thread::VirtioVhostNetCtl, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = ctrl_handler.run_ctrl(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || ctrl_handler.run_ctrl(paused, paused_sync.unwrap()), )?; self.ctrl_queue_epoll_thread = Some(epoll_threads.remove(0)); } @@ -352,11 +348,7 @@ impl VirtioDevice for Net { Thread::VirtioVhostNet, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.epoll_thread = Some(epoll_threads.remove(0)); diff --git a/virtio-devices/src/vsock/device.rs b/virtio-devices/src/vsock/device.rs index 841ab14d3..355975be7 100644 --- a/virtio-devices/src/vsock/device.rs +++ b/virtio-devices/src/vsock/device.rs @@ -467,11 +467,7 @@ where Thread::VirtioVsock, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads); diff --git a/virtio-devices/src/watchdog.rs b/virtio-devices/src/watchdog.rs index 6f023ce5e..41e03bdd4 100644 --- a/virtio-devices/src/watchdog.rs +++ b/virtio-devices/src/watchdog.rs @@ -341,11 +341,7 @@ impl VirtioDevice for Watchdog { Thread::VirtioWatchdog, &mut epoll_threads, &self.exit_evt, - move || { - if let Err(e) = handler.run(paused, paused_sync.unwrap()) { - error!("Error running worker: {:?}", e); - } - }, + move || handler.run(paused, paused_sync.unwrap()), )?; self.common.epoll_threads = Some(epoll_threads);