From 8b5202aa5a1cb26db61e65e87c331ba280f80443 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Mon, 14 Sep 2020 17:48:13 +0200 Subject: [PATCH] vmm: Always add virtio-mem region upon VM creation Now that e820 tables are created from the 'boot_guest_memory', we can simplify the memory manager code by adding the virtio-mem regions when they are created. There's no need to wait for the first hotplug to insert these regions. This also anticipates the need for starting a VM with some memory already plugged into the virtio-mem region. Signed-off-by: Sebastien Boeuf --- vmm/src/memory_manager.rs | 32 +++++++++++--------------------- vmm/src/vm.rs | 15 ++------------- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index 9484e6ccd..3bdb1ba6c 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -619,8 +619,9 @@ impl MemoryManager { Ok(()) })?; - for region in virtio_mem_regions.iter() { - memory_manager.lock().unwrap().create_userspace_mapping( + for region in virtio_mem_regions.drain(..) { + let mut mm = memory_manager.lock().unwrap(); + mm.create_userspace_mapping( region.start_addr().raw_value(), region.len() as u64, region.as_ptr() as u64, @@ -632,6 +633,7 @@ impl MemoryManager { .unwrap() .allocate_mmio_addresses(Some(region.start_addr()), region.len(), None) .ok_or(Error::MemoryRangeAllocation)?; + mm.add_region(region)?; } // Allocate RAM and Reserved address ranges. @@ -1129,12 +1131,8 @@ impl MemoryManager { Ok(()) } - pub fn virtio_mem_resize( - &mut self, - id: &str, - size: u64, - ) -> Result>, Error> { - let virtio_mem_region = if let Some(memory_zone) = self.memory_zones.get_mut(id) { + pub fn virtio_mem_resize(&mut self, id: &str, size: u64) -> Result<(), Error> { + if let Some(memory_zone) = self.memory_zones.get_mut(id) { if let Some(resize) = &memory_zone.virtio_mem_resize { resize.work(size).map_err(Error::VirtioMemResizeFail)?; } else { @@ -1142,18 +1140,11 @@ impl MemoryManager { return Err(Error::MissingVirtioMemHandler); } - memory_zone.virtio_mem_region.take() - } else { - error!("Failed resizing virtio-mem region: Unknown memory zone"); - return Err(Error::UnknownMemoryZone); - }; - - // Add the region if that's the first time we resize. - if let Some(region) = virtio_mem_region.clone() { - self.add_region(region)?; + return Ok(()); } - Ok(virtio_mem_region) + error!("Failed resizing virtio-mem region: Unknown memory zone"); + Err(Error::UnknownMemoryZone) } pub fn balloon_resize(&mut self, expected_ram: u64) -> Result { @@ -1189,8 +1180,7 @@ impl MemoryManager { match self.hotplug_method { HotplugMethod::VirtioMem => { if desired_ram >= self.boot_ram { - region = - self.virtio_mem_resize(DEFAULT_MEMORY_ZONE, desired_ram - self.boot_ram)?; + self.virtio_mem_resize(DEFAULT_MEMORY_ZONE, desired_ram - self.boot_ram)?; self.current_ram = desired_ram; } } @@ -1210,7 +1200,7 @@ impl MemoryManager { id: &str, desired_ram: u64, config: &MemoryConfig, - ) -> Result>, Error> { + ) -> Result<(), Error> { if !self.user_provided_zones { error!( "Not allowed to resize guest memory zone when no zone is \ diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 276447e8e..29217a196 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -925,22 +925,11 @@ impl Vm { } pub fn resize_zone(&mut self, id: String, desired_memory: u64) -> Result<()> { - let new_region = self - .memory_manager + self.memory_manager .lock() .unwrap() .resize_zone(&id, desired_memory, &self.config.lock().unwrap().memory) - .map_err(Error::MemoryManager)?; - - if let Some(new_region) = &new_region { - self.device_manager - .lock() - .unwrap() - .update_memory(&new_region) - .map_err(Error::DeviceManager)?; - } - - Ok(()) + .map_err(Error::MemoryManager) } #[cfg(not(feature = "pci_support"))]