diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index ec08884e3..f0b7e0d34 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -4188,6 +4188,15 @@ impl Migratable for DeviceManager { } Ok(MemoryRangeTable::new_from_tables(tables)) } + + fn complete_migration(&mut self) -> std::result::Result<(), MigratableError> { + for (_, device_node) in self.device_tree.lock().unwrap().iter() { + if let Some(migratable) = &device_node.migratable { + migratable.lock().unwrap().complete_migration()?; + } + } + Ok(()) + } } const PCIU_FIELD_OFFSET: u64 = 0; diff --git a/vmm/src/lib.rs b/vmm/src/lib.rs index 6dcdca0ef..3e2f14cec 100644 --- a/vmm/src/lib.rs +++ b/vmm/src/lib.rs @@ -1135,6 +1135,9 @@ impl Vmm { } { // Stop logging dirty pages and keep the source VM paused unpon successful migration Ok(()) => { + // Let every Migratable object know about the migration being complete + vm.complete_migration()?; + // Stop logging dirty pages vm.stop_dirty_log()?; diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 6f528373d..74096faf0 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -2547,6 +2547,11 @@ impl Migratable for Vm { self.device_manager.lock().unwrap().dirty_log()?, ])) } + + fn complete_migration(&mut self) -> std::result::Result<(), MigratableError> { + self.memory_manager.lock().unwrap().complete_migration()?; + self.device_manager.lock().unwrap().complete_migration() + } } #[cfg(all(feature = "kvm", target_arch = "x86_64"))]