diff --git a/vm-virtio/src/mem.rs b/vm-virtio/src/mem.rs index cc5b5dfec..aaac0ef6e 100644 --- a/vm-virtio/src/mem.rs +++ b/vm-virtio/src/mem.rs @@ -738,6 +738,7 @@ impl MemEpollHandler { // Virtio device for exposing entropy to the guest OS through virtio. pub struct Mem { + id: String, resize: Resize, kill_evt: Option, pause_evt: Option, @@ -754,7 +755,7 @@ pub struct Mem { impl Mem { // Create a new virtio-mem device. - pub fn new(region: &Arc, resize: Resize) -> io::Result { + pub fn new(id: String, region: &Arc, resize: Resize) -> io::Result { let region_len = region.len(); if region_len != region_len / VIRTIO_MEM_DEFAULT_BLOCK_SIZE * VIRTIO_MEM_DEFAULT_BLOCK_SIZE @@ -787,6 +788,7 @@ impl Mem { }; Ok(Mem { + id, resize, kill_evt: None, pause_evt: None, @@ -955,6 +957,10 @@ impl VirtioDevice for Mem { } virtio_pausable!(Mem); -impl Snapshottable for Mem {} +impl Snapshottable for Mem { + fn id(&self) -> String { + self.id.clone() + } +} impl Transportable for Mem {} impl Migratable for Mem {} diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 79ac772db..2ee2118be 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -1737,10 +1737,14 @@ impl DeviceManager { ) -> DeviceManagerResult)>> { let mut devices = Vec::new(); - let mm = &self.memory_manager.lock().unwrap(); + let mm = self.memory_manager.clone(); + let mm = mm.lock().unwrap(); if let (Some(region), Some(resize)) = (&mm.virtiomem_region, &mm.virtiomem_resize) { + let id = String::from(MEM_DEVICE_NAME); + let virtio_mem_device = Arc::new(Mutex::new( vm_virtio::Mem::new( + id.clone(), ®ion, resize .try_clone() @@ -1752,12 +1756,10 @@ impl DeviceManager { devices.push(( Arc::clone(&virtio_mem_device) as VirtioDeviceArc, false, - Some(String::from(MEM_DEVICE_NAME)), + Some(id), )); - let migratable = Arc::clone(&virtio_mem_device) as Arc>; - let id = migratable.lock().unwrap().id(); - self.migratable_devices.push((id, migratable)); + self.add_migratable_device(Arc::clone(&virtio_mem_device) as Arc>); } Ok(devices)