From 72b9e920a36ef130fdd54c4dc6b9450afdc39a90 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 6 Jan 2020 17:12:03 +0000 Subject: [PATCH] vmm: memory_manager: Further refactor memory region allocation This allows the memory regions to be allocated later which is necessary for hotplug memory. Signed-off-by: Rob Bradford --- vmm/src/memory_manager.rs | 79 ++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index 55645785d..86930a89a 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -95,40 +95,11 @@ impl MemoryManager { let mut mem_regions = Vec::new(); for region in ram_regions.iter() { - mem_regions.push(Arc::new(match backing_file { - Some(ref file) => { - let f = if file.is_dir() { - let fs_str = format!("{}{}", file.display(), "/tmpfile_XXXXXX"); - let fs = std::ffi::CString::new(fs_str).unwrap(); - let mut path = fs.as_bytes_with_nul().to_owned(); - let path_ptr = path.as_mut_ptr() as *mut _; - let fd = unsafe { libc::mkstemp(path_ptr) }; - unsafe { libc::unlink(path_ptr) }; - unsafe { File::from_raw_fd(fd) } - } else { - OpenOptions::new() - .read(true) - .write(true) - .open(file) - .map_err(Error::SharedFileCreate)? - }; - - f.set_len(region.1 as u64) - .map_err(Error::SharedFileSetLen)?; - - GuestRegionMmap::new( - MmapRegion::from_file(FileOffset::new(f, 0), region.1) - .map_err(Error::GuestMemoryRegion)?, - region.0, - ) - .map_err(Error::GuestMemory)? - } - None => GuestRegionMmap::new( - MmapRegion::new(region.1).map_err(Error::GuestMemoryRegion)?, - region.0, - ) - .map_err(Error::GuestMemory)?, - })) + mem_regions.push(MemoryManager::create_ram_region( + backing_file, + region.0, + region.1, + )?); } let guest_memory = @@ -174,6 +145,46 @@ impl MemoryManager { Ok(memory_manager) } + fn create_ram_region( + backing_file: &Option, + start_addr: GuestAddress, + size: usize, + ) -> Result, Error> { + Ok(Arc::new(match backing_file { + Some(ref file) => { + let f = if file.is_dir() { + let fs_str = format!("{}{}", file.display(), "/tmpfile_XXXXXX"); + let fs = std::ffi::CString::new(fs_str).unwrap(); + let mut path = fs.as_bytes_with_nul().to_owned(); + let path_ptr = path.as_mut_ptr() as *mut _; + let fd = unsafe { libc::mkstemp(path_ptr) }; + unsafe { libc::unlink(path_ptr) }; + unsafe { File::from_raw_fd(fd) } + } else { + OpenOptions::new() + .read(true) + .write(true) + .open(file) + .map_err(Error::SharedFileCreate)? + }; + + f.set_len(size as u64).map_err(Error::SharedFileSetLen)?; + + GuestRegionMmap::new( + MmapRegion::from_file(FileOffset::new(f, 0), size) + .map_err(Error::GuestMemoryRegion)?, + start_addr, + ) + .map_err(Error::GuestMemory)? + } + None => GuestRegionMmap::new( + MmapRegion::new(size).map_err(Error::GuestMemoryRegion)?, + start_addr, + ) + .map_err(Error::GuestMemory)?, + })) + } + pub fn guest_memory(&self) -> Arc> { self.guest_memory.clone() }