MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / vm_receive_state

Method vm_receive_state

vmm/src/lib.rs:1111–1195  ·  view source on GitHub ↗

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>>,
    )

Source from the content-addressed store, hash-verified

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,

Callers 1

Calls 6

measure_okFunction · 0.85
newFunction · 0.85
restoreMethod · 0.80
lengthMethod · 0.45
try_cloneMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected