From d98f2618bdbbe3ceff00b121c1cf4b9faf936404 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Thu, 1 Dec 2022 17:05:34 +0100 Subject: [PATCH] vmm: Create restored Vm as paused Thanks to the new way of restoring Vm, we can now create the Vm object directly with the appropriate VmState rather than having to patch it at a later time. Signed-off-by: Sebastien Boeuf --- vmm/src/vm.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 63f66bd7f..cf6416eed 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -308,9 +308,6 @@ pub enum Error { #[cfg(feature = "guest_debug")] #[error("Error coredumping VM: {0:?}")] Coredump(GuestDebuggableError), - - #[error("Failed taking the RwLock")] - TryRwLock(#[source] anyhow::Error), } pub type Result = result::Result; @@ -614,6 +611,12 @@ impl Vm { None }; + let vm_state = if snapshot.is_some() { + VmState::Paused + } else { + VmState::Created + }; + Ok(Vm { #[cfg(feature = "tdx")] kernel, @@ -623,7 +626,7 @@ impl Vm { on_tty, threads: Vec::with_capacity(1), signals: None, - state: RwLock::new(VmState::Created), + state: RwLock::new(vm_state), cpu_manager, memory_manager, vm, @@ -2124,10 +2127,6 @@ impl Vm { pub fn restore(&mut self) -> Result<()> { event!("vm", "restoring"); - let current_state = self.get_state()?; - let new_state = VmState::Paused; - current_state.valid_transition(new_state)?; - // Now we can start all vCPUs from here. self.cpu_manager .lock() @@ -2138,12 +2137,6 @@ impl Vm { self.setup_signal_handler()?; self.setup_tty()?; - let mut state = self - .state - .try_write() - .map_err(|e| Error::TryRwLock(anyhow!("Failed taking the lock: {}", e)))?; - *state = new_state; - event!("vm", "restored"); Ok(()) }