From 748018ace3102fe3ebf43d552f500b439cee4d96 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 2 Dec 2022 15:31:53 +0100 Subject: [PATCH] vm-migration: Don't store the id as part of Snapshot structure The information about the identifier related to a Snapshot is only relevant from the BTreeMap perspective, which is why we can get rid of the duplicated identifier in every Snapshot structure. Signed-off-by: Sebastien Boeuf --- devices/src/gic.rs | 2 +- devices/src/ioapic.rs | 2 +- devices/src/legacy/gpio_pl061.rs | 2 +- devices/src/legacy/serial.rs | 2 +- devices/src/legacy/uart_pl011.rs | 2 +- pci/src/configuration.rs | 2 +- pci/src/msi.rs | 2 +- pci/src/msix.rs | 2 +- pci/src/vfio.rs | 13 +++++---- pci/src/vfio_user.rs | 4 +-- virtio-devices/src/balloon.rs | 2 +- virtio-devices/src/block.rs | 2 +- virtio-devices/src/console.rs | 2 +- virtio-devices/src/iommu.rs | 2 +- virtio-devices/src/mem.rs | 2 +- virtio-devices/src/net.rs | 2 +- virtio-devices/src/pmem.rs | 2 +- virtio-devices/src/rng.rs | 2 +- .../src/transport/pci_common_config.rs | 2 +- virtio-devices/src/transport/pci_device.rs | 12 +++++---- virtio-devices/src/vdpa.rs | 9 +++---- virtio-devices/src/vhost_user/blk.rs | 2 +- virtio-devices/src/vhost_user/fs.rs | 2 +- virtio-devices/src/vhost_user/mod.rs | 8 ++---- virtio-devices/src/vhost_user/net.rs | 2 +- virtio-devices/src/vsock/device.rs | 2 +- virtio-devices/src/watchdog.rs | 2 +- vm-migration/src/lib.rs | 27 ++++++------------- vmm/src/cpu.rs | 15 +++++------ vmm/src/device_manager.rs | 6 ++--- vmm/src/memory_manager.rs | 2 +- vmm/src/vm.rs | 21 +++++++++++---- 32 files changed, 76 insertions(+), 85 deletions(-) diff --git a/devices/src/gic.rs b/devices/src/gic.rs index 332fc4eca..b8c7ceb70 100644 --- a/devices/src/gic.rs +++ b/devices/src/gic.rs @@ -154,7 +154,7 @@ impl Snapshottable for Gic { fn snapshot(&mut self) -> std::result::Result { let vgic = self.vgic.as_ref().unwrap().clone(); let state = vgic.lock().unwrap().state().unwrap(); - Snapshot::new_from_state(&self.id(), &state) + Snapshot::new_from_state(&state) } } diff --git a/devices/src/ioapic.rs b/devices/src/ioapic.rs index a9d5ed442..e9aacc62d 100644 --- a/devices/src/ioapic.rs +++ b/devices/src/ioapic.rs @@ -438,7 +438,7 @@ impl Snapshottable for Ioapic { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/devices/src/legacy/gpio_pl061.rs b/devices/src/legacy/gpio_pl061.rs index 9bbdbc545..4aa027056 100644 --- a/devices/src/legacy/gpio_pl061.rs +++ b/devices/src/legacy/gpio_pl061.rs @@ -328,7 +328,7 @@ impl Snapshottable for Gpio { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/devices/src/legacy/serial.rs b/devices/src/legacy/serial.rs index 8453fbcfe..5756f63ea 100644 --- a/devices/src/legacy/serial.rs +++ b/devices/src/legacy/serial.rs @@ -334,7 +334,7 @@ impl Snapshottable for Serial { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/devices/src/legacy/uart_pl011.rs b/devices/src/legacy/uart_pl011.rs index 86fbdd249..c57b79e6c 100644 --- a/devices/src/legacy/uart_pl011.rs +++ b/devices/src/legacy/uart_pl011.rs @@ -454,7 +454,7 @@ impl Snapshottable for Pl011 { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/pci/src/configuration.rs b/pci/src/configuration.rs index 62be16f8e..061dabe02 100644 --- a/pci/src/configuration.rs +++ b/pci/src/configuration.rs @@ -1072,7 +1072,7 @@ impl Snapshottable for PciConfiguration { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/pci/src/msi.rs b/pci/src/msi.rs index de9af3ab0..850016df1 100644 --- a/pci/src/msi.rs +++ b/pci/src/msi.rs @@ -288,6 +288,6 @@ impl Snapshottable for MsiConfig { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/pci/src/msix.rs b/pci/src/msix.rs index 28b851fae..9bf5eff7c 100644 --- a/pci/src/msix.rs +++ b/pci/src/msix.rs @@ -433,7 +433,7 @@ impl Snapshottable for MsixConfig { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/pci/src/vfio.rs b/pci/src/vfio.rs index bfe54f444..9235f834e 100644 --- a/pci/src/vfio.rs +++ b/pci/src/vfio.rs @@ -1235,20 +1235,19 @@ impl Snapshottable for VfioCommon { } fn snapshot(&mut self) -> std::result::Result { - let mut vfio_common_snapshot = - Snapshot::new_from_versioned_state(&self.id(), &self.state())?; + let mut vfio_common_snapshot = Snapshot::new_from_versioned_state(&self.state())?; // Snapshot PciConfiguration - vfio_common_snapshot.add_snapshot(self.configuration.snapshot()?); + vfio_common_snapshot.add_snapshot(self.configuration.id(), self.configuration.snapshot()?); // Snapshot MSI if let Some(msi) = &mut self.interrupt.msi { - vfio_common_snapshot.add_snapshot(msi.cfg.snapshot()?); + vfio_common_snapshot.add_snapshot(msi.cfg.id(), msi.cfg.snapshot()?); } // Snapshot MSI-X if let Some(msix) = &mut self.interrupt.msix { - vfio_common_snapshot.add_snapshot(msix.bar.snapshot()?); + vfio_common_snapshot.add_snapshot(msix.bar.id(), msix.bar.snapshot()?); } Ok(vfio_common_snapshot) @@ -1740,10 +1739,10 @@ impl Snapshottable for VfioPciDevice { } fn snapshot(&mut self) -> std::result::Result { - let mut vfio_pci_dev_snapshot = Snapshot::new(&self.id); + let mut vfio_pci_dev_snapshot = Snapshot::default(); // Snapshot VfioCommon - vfio_pci_dev_snapshot.add_snapshot(self.common.snapshot()?); + vfio_pci_dev_snapshot.add_snapshot(self.common.id(), self.common.snapshot()?); Ok(vfio_pci_dev_snapshot) } diff --git a/pci/src/vfio_user.rs b/pci/src/vfio_user.rs index c618bd804..1d0eb1c86 100644 --- a/pci/src/vfio_user.rs +++ b/pci/src/vfio_user.rs @@ -535,10 +535,10 @@ impl Snapshottable for VfioUserPciDevice { } fn snapshot(&mut self) -> std::result::Result { - let mut vfio_pci_dev_snapshot = Snapshot::new(&self.id); + let mut vfio_pci_dev_snapshot = Snapshot::default(); // Snapshot VfioCommon - vfio_pci_dev_snapshot.add_snapshot(self.common.snapshot()?); + vfio_pci_dev_snapshot.add_snapshot(self.common.id(), self.common.snapshot()?); Ok(vfio_pci_dev_snapshot) } diff --git a/virtio-devices/src/balloon.rs b/virtio-devices/src/balloon.rs index abe40e8b5..266c30c1e 100644 --- a/virtio-devices/src/balloon.rs +++ b/virtio-devices/src/balloon.rs @@ -585,7 +585,7 @@ impl Snapshottable for Balloon { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Balloon {} diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 5f5e53d03..cd893e0e3 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -743,7 +743,7 @@ impl Snapshottable for Block { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Block {} diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index ae38c1b90..eb64b0ed6 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -819,7 +819,7 @@ impl Snapshottable for Console { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Console {} diff --git a/virtio-devices/src/iommu.rs b/virtio-devices/src/iommu.rs index a2c35c3f9..ead40d812 100644 --- a/virtio-devices/src/iommu.rs +++ b/virtio-devices/src/iommu.rs @@ -1109,7 +1109,7 @@ impl Snapshottable for Iommu { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Iommu {} diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index bc3c382c1..d2c767ada 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -1014,7 +1014,7 @@ impl Snapshottable for Mem { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Mem {} diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index efd1df99e..2b2defbc6 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -857,7 +857,7 @@ impl Snapshottable for Net { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Net {} diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index 24a9fca44..c06b70017 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -467,7 +467,7 @@ impl Snapshottable for Pmem { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index 7cc10b68b..d56089167 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -323,7 +323,7 @@ impl Snapshottable for Rng { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/virtio-devices/src/transport/pci_common_config.rs b/virtio-devices/src/transport/pci_common_config.rs index 6cbb992ff..7454b7ee6 100644 --- a/virtio-devices/src/transport/pci_common_config.rs +++ b/virtio-devices/src/transport/pci_common_config.rs @@ -321,7 +321,7 @@ impl Snapshottable for VirtioPciCommonConfig { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id(), &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/virtio-devices/src/transport/pci_device.rs b/virtio-devices/src/transport/pci_device.rs index d908c7208..b51b33f7c 100644 --- a/virtio-devices/src/transport/pci_device.rs +++ b/virtio-devices/src/transport/pci_device.rs @@ -1272,18 +1272,20 @@ impl Snapshottable for VirtioPciDevice { } fn snapshot(&mut self) -> std::result::Result { - let mut virtio_pci_dev_snapshot = - Snapshot::new_from_versioned_state(&self.id, &self.state())?; + let mut virtio_pci_dev_snapshot = Snapshot::new_from_versioned_state(&self.state())?; // Snapshot PciConfiguration - virtio_pci_dev_snapshot.add_snapshot(self.configuration.snapshot()?); + virtio_pci_dev_snapshot + .add_snapshot(self.configuration.id(), self.configuration.snapshot()?); // Snapshot VirtioPciCommonConfig - virtio_pci_dev_snapshot.add_snapshot(self.common_config.snapshot()?); + virtio_pci_dev_snapshot + .add_snapshot(self.common_config.id(), self.common_config.snapshot()?); // Snapshot MSI-X if let Some(msix_config) = &self.msix_config { - virtio_pci_dev_snapshot.add_snapshot(msix_config.lock().unwrap().snapshot()?); + let mut msix_config = msix_config.lock().unwrap(); + virtio_pci_dev_snapshot.add_snapshot(msix_config.id(), msix_config.snapshot()?); } Ok(virtio_pci_dev_snapshot) diff --git a/virtio-devices/src/vdpa.rs b/virtio-devices/src/vdpa.rs index cf7a0767e..ec395d065 100644 --- a/virtio-devices/src/vdpa.rs +++ b/virtio-devices/src/vdpa.rs @@ -489,12 +489,9 @@ impl Snapshottable for Vdpa { ))); } - let snapshot = Snapshot::new_from_versioned_state( - &self.id(), - &self.state().map_err(|e| { - MigratableError::Snapshot(anyhow!("Error snapshotting vDPA device: {:?}", e)) - })?, - )?; + let snapshot = Snapshot::new_from_versioned_state(&self.state().map_err(|e| { + MigratableError::Snapshot(anyhow!("Error snapshotting vDPA device: {:?}", e)) + })?)?; // Force the vhost handler to be dropped in order to close the vDPA // file. This will ensure the device can be accessed if the VM is diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index 6c1c7c8f9..47a493cf7 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -381,7 +381,7 @@ impl Snapshottable for Blk { } fn snapshot(&mut self) -> std::result::Result { - self.vu_common.snapshot(&self.id(), &self.state()) + self.vu_common.snapshot(&self.state()) } } impl Transportable for Blk {} diff --git a/virtio-devices/src/vhost_user/fs.rs b/virtio-devices/src/vhost_user/fs.rs index 6543ccfc3..f2cd6af52 100644 --- a/virtio-devices/src/vhost_user/fs.rs +++ b/virtio-devices/src/vhost_user/fs.rs @@ -651,7 +651,7 @@ impl Snapshottable for Fs { } fn snapshot(&mut self) -> std::result::Result { - self.vu_common.snapshot(&self.id(), &self.state()) + self.vu_common.snapshot(&self.state()) } } impl Transportable for Fs {} diff --git a/virtio-devices/src/vhost_user/mod.rs b/virtio-devices/src/vhost_user/mod.rs index 9f242fa3e..522479dbc 100644 --- a/virtio-devices/src/vhost_user/mod.rs +++ b/virtio-devices/src/vhost_user/mod.rs @@ -430,15 +430,11 @@ impl VhostUserCommon { } } - pub fn snapshot( - &mut self, - id: &str, - state: &T, - ) -> std::result::Result + pub fn snapshot(&mut self, state: &T) -> std::result::Result where T: Versionize + VersionMapped, { - let snapshot = Snapshot::new_from_versioned_state(id, state)?; + let snapshot = Snapshot::new_from_versioned_state(state)?; if self.migration_started { self.shutdown(); diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index 1973e26e1..af366e58b 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -418,7 +418,7 @@ impl Snapshottable for Net { } fn snapshot(&mut self) -> std::result::Result { - self.vu_common.snapshot(&self.id(), &self.state()) + self.vu_common.snapshot(&self.state()) } } impl Transportable for Net {} diff --git a/virtio-devices/src/vsock/device.rs b/virtio-devices/src/vsock/device.rs index 25be9e50e..8762cbe13 100644 --- a/virtio-devices/src/vsock/device.rs +++ b/virtio-devices/src/vsock/device.rs @@ -518,7 +518,7 @@ where } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } impl Transportable for Vsock where B: VsockBackend + Sync + 'static {} diff --git a/virtio-devices/src/watchdog.rs b/virtio-devices/src/watchdog.rs index 1c3057b55..aec42edc0 100644 --- a/virtio-devices/src/watchdog.rs +++ b/virtio-devices/src/watchdog.rs @@ -419,7 +419,7 @@ impl Snapshottable for Watchdog { } fn snapshot(&mut self) -> std::result::Result { - Snapshot::new_from_versioned_state(&self.id, &self.state()) + Snapshot::new_from_versioned_state(&self.state()) } } diff --git a/vm-migration/src/lib.rs b/vm-migration/src/lib.rs index 248f47310..7d0e52d2d 100644 --- a/vm-migration/src/lib.rs +++ b/vm-migration/src/lib.rs @@ -139,9 +139,6 @@ impl SnapshotData { /// the actual device snapshot data. #[derive(Clone, Default, Deserialize, Serialize)] pub struct Snapshot { - /// The Snapshottable component id. - pub id: String, - /// The Snapshottable component snapshots. pub snapshots: std::collections::BTreeMap, @@ -151,39 +148,31 @@ pub struct Snapshot { } impl Snapshot { - /// Create an empty Snapshot. - pub fn new(id: &str) -> Self { - Snapshot { - id: id.to_string(), - ..Default::default() - } - } - /// Create from state that can be serialized - pub fn new_from_state(id: &str, state: &T) -> Result + pub fn new_from_state(state: &T) -> Result where T: Serialize, { - let mut snapshot_data = Snapshot::new(id); + let mut snapshot_data = Snapshot::default(); snapshot_data.add_data_section(SnapshotData::new_from_state(state)?); Ok(snapshot_data) } /// Create from versioned state - pub fn new_from_versioned_state(id: &str, state: &T) -> Result + pub fn new_from_versioned_state(state: &T) -> Result where T: Versionize + VersionMapped, { - let mut snapshot_data = Snapshot::new(id); + let mut snapshot_data = Snapshot::default(); snapshot_data.add_data_section(SnapshotData::new_from_versioned_state(state)?); Ok(snapshot_data) } /// Add a sub-component's Snapshot to the Snapshot. - pub fn add_snapshot(&mut self, snapshot: Snapshot) { - self.snapshots.insert(snapshot.id.clone(), snapshot); + pub fn add_snapshot(&mut self, id: String, snapshot: Snapshot) { + self.snapshots.insert(id, snapshot); } /// Add a SnapshotData to the component snapshot data. @@ -240,7 +229,7 @@ pub trait Snapshottable: Pausable { /// Take a component snapshot. fn snapshot(&mut self) -> std::result::Result { - Ok(Snapshot::new("")) + Ok(Snapshot::default()) } } @@ -271,7 +260,7 @@ pub trait Transportable: Pausable + Snapshottable { /// * `source_url` - The source URL to fetch the snapshot from. This could be an HTTP /// endpoint, a TCP address or a local file. fn recv(&self, _source_url: &str) -> std::result::Result { - Ok(Snapshot::new("")) + Ok(Snapshot::default()) } } diff --git a/vmm/src/cpu.rs b/vmm/src/cpu.rs index 0e2d36258..d07dbbe55 100644 --- a/vmm/src/cpu.rs +++ b/vmm/src/cpu.rs @@ -387,11 +387,10 @@ impl Vcpu { } } -const VCPU_SNAPSHOT_ID: &str = "vcpu"; impl Pausable for Vcpu {} impl Snapshottable for Vcpu { fn id(&self) -> String { - VCPU_SNAPSHOT_ID.to_string() + self.id.to_string() } fn snapshot(&mut self) -> std::result::Result { @@ -400,9 +399,7 @@ impl Snapshottable for Vcpu { .state() .map_err(|e| MigratableError::Pause(anyhow!("Could not get vCPU state {:?}", e)))?; - // TODO: The special format of the CPU id can be removed once ready to - // break live upgrade. - let mut vcpu_snapshot = Snapshot::new(&format!("{:03}", self.id)); + let mut vcpu_snapshot = Snapshot::default(); vcpu_snapshot.add_data_section(SnapshotData::new_from_state(&saved_state)?); self.saved_state = Some(saved_state); @@ -776,7 +773,7 @@ impl CpuManager { cpu_id, // TODO: The special format of the CPU id can be removed once // ready to break live upgrade. - snapshot_from_id(snapshot.as_ref(), &format!("{:03}", cpu_id)), + snapshot_from_id(snapshot.as_ref(), cpu_id.to_string().as_str()), )?); } @@ -2076,12 +2073,12 @@ impl Snapshottable for CpuManager { } fn snapshot(&mut self) -> std::result::Result { - let mut cpu_manager_snapshot = Snapshot::new(CPU_MANAGER_SNAPSHOT_ID); + let mut cpu_manager_snapshot = Snapshot::default(); // The CpuManager snapshot is a collection of all vCPUs snapshots. for vcpu in &self.vcpus { - let cpu_snapshot = vcpu.lock().unwrap().snapshot()?; - cpu_manager_snapshot.add_snapshot(cpu_snapshot); + let mut vcpu = vcpu.lock().unwrap(); + cpu_manager_snapshot.add_snapshot(vcpu.id(), vcpu.snapshot()?); } Ok(cpu_manager_snapshot) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 100fad55a..95543605b 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -4445,13 +4445,13 @@ impl Snapshottable for DeviceManager { } fn snapshot(&mut self) -> std::result::Result { - let mut snapshot = Snapshot::new(DEVICE_MANAGER_SNAPSHOT_ID); + let mut snapshot = Snapshot::default(); // We aggregate all devices snapshots. for (_, device_node) in self.device_tree.lock().unwrap().iter() { if let Some(migratable) = &device_node.migratable { - let device_snapshot = migratable.lock().unwrap().snapshot()?; - snapshot.add_snapshot(device_snapshot); + let mut migratable = migratable.lock().unwrap(); + snapshot.add_snapshot(migratable.id(), migratable.snapshot()?); } } diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index 2e97a82a6..c074024fc 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -2428,7 +2428,7 @@ impl Snapshottable for MemoryManager { } fn snapshot(&mut self) -> result::Result { - let mut memory_manager_snapshot = Snapshot::new(MEMORY_MANAGER_SNAPSHOT_ID); + let mut memory_manager_snapshot = Snapshot::default(); let memory_ranges = self.memory_range_table(true)?; diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index a8caa63c2..3c751080e 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -2508,7 +2508,7 @@ impl Snapshottable for Vm { })? }; - let mut vm_snapshot = Snapshot::new(VM_SNAPSHOT_ID); + let mut vm_snapshot = Snapshot::default(); let vm_snapshot_data = serde_json::to_vec(&VmSnapshot { #[cfg(all(feature = "kvm", target_arch = "x86_64"))] clock: self.saved_clock, @@ -2517,10 +2517,21 @@ impl Snapshottable for Vm { }) .map_err(|e| MigratableError::Snapshot(e.into()))?; - vm_snapshot.add_snapshot(self.cpu_manager.lock().unwrap().snapshot()?); - vm_snapshot.add_snapshot(self.memory_manager.lock().unwrap().snapshot()?); - - vm_snapshot.add_snapshot(self.device_manager.lock().unwrap().snapshot()?); + let (id, snapshot) = { + let mut cpu_manager = self.cpu_manager.lock().unwrap(); + (cpu_manager.id(), cpu_manager.snapshot()?) + }; + vm_snapshot.add_snapshot(id, snapshot); + let (id, snapshot) = { + let mut memory_manager = self.memory_manager.lock().unwrap(); + (memory_manager.id(), memory_manager.snapshot()?) + }; + vm_snapshot.add_snapshot(id, snapshot); + let (id, snapshot) = { + let mut device_manager = self.device_manager.lock().unwrap(); + (device_manager.id(), device_manager.snapshot()?) + }; + vm_snapshot.add_snapshot(id, snapshot); vm_snapshot.add_data_section(SnapshotData(vm_snapshot_data)); event!("vm", "snapshotted");