From 1298b508bf36d5eb3dc856d6906ad160ad6ba284 Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Tue, 8 Oct 2019 15:53:39 +0200 Subject: [PATCH] vmm: Manage the exit and reset behaviours from the control loop So that we don't need to forward an ExitBehaviour up to the VMM thread. This simplifies the control loop and the VMM thread even further. Signed-off-by: Samuel Ortiz --- vmm/src/lib.rs | 36 +++++------------------------------- vmm/src/vm.rs | 6 ------ 2 files changed, 5 insertions(+), 37 deletions(-) diff --git a/vmm/src/lib.rs b/vmm/src/lib.rs index 5f7115107..fc05f65d2 100644 --- a/vmm/src/lib.rs +++ b/vmm/src/lib.rs @@ -16,7 +16,7 @@ extern crate vmm_sys_util; use crate::api::{ApiError, ApiRequest, ApiResponse, ApiResponsePayload, VmInfo}; use crate::config::VmConfig; -use crate::vm::{Error as VmError, ExitBehaviour, Vm, VmState}; +use crate::vm::{Error as VmError, Vm, VmState}; use libc::EFD_NONBLOCK; use std::io; use std::os::unix::io::{AsRawFd, RawFd}; @@ -154,29 +154,9 @@ pub fn start_vmm_thread( let thread = thread::Builder::new() .name("vmm".to_string()) .spawn(move || { - // let vmm_api_event = api_event.try_clone().map_err(Error::EventFdClone)?; let mut vmm = Vmm::new(api_event)?; - let receiver = Arc::new(api_receiver); - 'outer: loop { - match vmm.control_loop(Arc::clone(&receiver)) { - Ok(ExitBehaviour::Reset) => { - // The VMM control loop exites with a reset behaviour. - // We have to reboot the VM, i.e. we create a new VM - // based on the same VM config, boot it and restart - // the control loop. - - vmm.vm_reboot().map_err(Error::VmReboot)?; - - // Continue and restart the VMM control loop - continue 'outer; - } - Ok(ExitBehaviour::Shutdown) => break 'outer, - Err(e) => return Err(e), - } - } - - Ok(()) + vmm.control_loop(Arc::new(api_receiver)) }) .map_err(Error::VmmThreadSpawn)?; @@ -320,14 +300,12 @@ impl Vmm { self.vm_delete() } - fn control_loop(&mut self, api_receiver: Arc>) -> Result { + fn control_loop(&mut self, api_receiver: Arc>) -> Result<()> { const EPOLL_EVENTS_LEN: usize = 100; let mut events = vec![epoll::Event::new(epoll::Events::empty(), 0); EPOLL_EVENTS_LEN]; let epoll_fd = self.epoll.as_raw_fd(); - let exit_behaviour; - 'outer: loop { let num_events = match epoll::wait(epoll_fd, -1, &mut events[..]) { Ok(res) => res, @@ -355,16 +333,13 @@ impl Vmm { // Consume the event. self.exit_evt.read().map_err(Error::EventFdRead)?; self.vmm_shutdown().map_err(Error::VmmShutdown)?; - exit_behaviour = ExitBehaviour::Shutdown; break 'outer; } EpollDispatch::Reset => { // Consume the event. self.reset_evt.read().map_err(Error::EventFdRead)?; - exit_behaviour = ExitBehaviour::Reset; - - break 'outer; + self.vm_reboot().map_err(Error::VmReboot)?; } EpollDispatch::Stdin => { if let Some(ref vm) = self.vm { @@ -447,7 +422,6 @@ impl Vmm { sender.send(response).map_err(Error::ApiResponseSend)?; - exit_behaviour = ExitBehaviour::Shutdown; break 'outer; } } @@ -457,6 +431,6 @@ impl Vmm { } } - Ok(exit_behaviour) + Ok(()) } } diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index b08decfd0..d11aa098e 100755 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -436,12 +436,6 @@ pub struct VmInfo<'a> { pub vm_cfg: &'a VmConfig, } -#[derive(PartialEq)] -pub enum ExitBehaviour { - Shutdown = 1, - Reset = 2, -} - #[derive(Clone, Debug, Deserialize, Serialize)] pub enum VmState { Created,