Receives the final VM state (devices, vCPUs) and restores the VM. Measures the time for each step.
(
&mut self,
req: &Request,
socket: &mut T,
mm: Arc<Mutex<MemoryManager>>,
)
| 1109 | /// |
| 1110 | /// Measures the time for each step. |
| 1111 | fn vm_receive_state<T>( |
| 1112 | &mut self, |
| 1113 | req: &Request, |
| 1114 | socket: &mut T, |
| 1115 | mm: Arc<Mutex<MemoryManager>>, |
| 1116 | ) -> std::result::Result< |
| 1117 | ( |
| 1118 | Duration, /* state receive + deserialize */ |
| 1119 | Duration, /* restoring */ |
| 1120 | ), |
| 1121 | MigratableError, |
| 1122 | > |
| 1123 | where |
| 1124 | T: Read, |
| 1125 | { |
| 1126 | let (snapshot, receive_duration): (Snapshot, Duration) = measure_ok(|| { |
| 1127 | let mut data: Vec<u8> = Vec::new(); |
| 1128 | data.resize_with(req.length() as usize, Default::default); |
| 1129 | socket |
| 1130 | .read_exact(&mut data) |
| 1131 | .map_err(MigratableError::MigrateSocket)?; |
| 1132 | serde_json::from_slice(&data).map_err(|e| { |
| 1133 | MigratableError::MigrateReceive(anyhow!("Error deserialising snapshot: {e}")) |
| 1134 | }) |
| 1135 | })?; |
| 1136 | |
| 1137 | let exit_evt = self.exit_evt.try_clone().map_err(|e| { |
| 1138 | MigratableError::MigrateReceive(anyhow!("Error cloning exit EventFd: {e}")) |
| 1139 | })?; |
| 1140 | let reset_evt = self.reset_evt.try_clone().map_err(|e| { |
| 1141 | MigratableError::MigrateReceive(anyhow!("Error cloning reset EventFd: {e}")) |
| 1142 | })?; |
| 1143 | let guest_exit_evt = self.guest_exit_evt.try_clone().map_err(|e| { |
| 1144 | MigratableError::MigrateReceive(anyhow!("Error cloning guest exit EventFd: {e}")) |
| 1145 | })?; |
| 1146 | #[cfg(feature = "guest_debug")] |
| 1147 | let debug_evt = self.vm_debug_evt.try_clone().map_err(|e| { |
| 1148 | MigratableError::MigrateReceive(anyhow!("Error cloning debug EventFd: {e}")) |
| 1149 | })?; |
| 1150 | let activate_evt = self.activate_evt.try_clone().map_err(|e| { |
| 1151 | MigratableError::MigrateReceive(anyhow!("Error cloning activate EventFd: {e}")) |
| 1152 | })?; |
| 1153 | |
| 1154 | let (vm, restore_duration) = measure_ok(|| { |
| 1155 | #[cfg(not(target_arch = "riscv64"))] |
| 1156 | let timestamp = Instant::now(); |
| 1157 | let hypervisor_vm = mm.lock().unwrap().vm.clone(); |
| 1158 | |
| 1159 | let mut vm = Vm::new_from_memory_manager( |
| 1160 | self.vm_config.clone().unwrap(), |
| 1161 | mm, |
| 1162 | hypervisor_vm, |
| 1163 | exit_evt, |
| 1164 | reset_evt, |
| 1165 | guest_exit_evt, |
| 1166 | #[cfg(feature = "guest_debug")] |
| 1167 | debug_evt, |
| 1168 | &self.seccomp_action, |
no test coverage detected