From b173b6c5b4a4ddb216d5e5f98cce1bd343840f5d Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Thu, 10 Sep 2020 10:08:02 +0200 Subject: [PATCH] vmm: Create a MemoryZone structure In order to anticipate the need for storing memory regions along with virtio-mem information for each memory zone, we create a new structure MemoryZone that will replace Vec> in the hash map MemoryZones. This makes thing more logical as MemoryZones becomes a list of MemoryZone sorted by their identifier. Signed-off-by: Sebastien Boeuf --- vmm/src/memory_manager.rs | 27 +++++++++++++++++++++++---- vmm/src/vm.rs | 2 +- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index 11f0383a6..5d16c917b 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -64,7 +64,26 @@ struct HotPlugState { removing: bool, } -pub type MemoryZones = HashMap>>; +#[derive(Default)] +pub struct MemoryZone { + regions: Vec>, + virtiomem_region: Option>, + virtiomem_resize: Option, +} + +impl MemoryZone { + pub fn regions(&self) -> &Vec> { + &self.regions + } + pub fn virtiomem_region(&self) -> &Option> { + &self.virtiomem_region + } + pub fn virtiomem_resize(&self) -> &Option { + &self.virtiomem_resize + } +} + +pub type MemoryZones = HashMap; pub struct MemoryManager { guest_memory: GuestMemoryAtomic, @@ -300,7 +319,7 @@ impl MemoryManager { let mut memory_zones = HashMap::new(); // Add zone id to the list of memory zones. - memory_zones.insert(zone.id.clone(), Vec::new()); + memory_zones.insert(zone.id.clone(), MemoryZone::default()); for ram_region in ram_regions.iter() { let mut ram_region_offset = 0; @@ -346,7 +365,7 @@ impl MemoryManager { // Add region to the list of regions associated with the // current memory zone. if let Some(memory_zone) = memory_zones.get_mut(&zone.id) { - memory_zone.push(region.clone()); + memory_zone.regions.push(region.clone()); } mem_regions.push(region); @@ -371,7 +390,7 @@ impl MemoryManager { ); return Err(Error::DuplicateZoneId); } - memory_zones.insert(zone.id.clone(), Vec::new()); + memory_zones.insert(zone.id.clone(), MemoryZone::default()); } if ram_region_consumed { diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 1377a0fea..fc18b86ca 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -404,7 +404,7 @@ impl Vm { if let Some(memory_zones) = &config.memory_zones { for memory_zone in memory_zones.iter() { if let Some(mm_zone) = mm_zones.get(memory_zone) { - node.memory_regions.extend(mm_zone.clone()); + node.memory_regions.extend(mm_zone.regions().clone()); } else { error!("Unknown memory zone '{}'", memory_zone); return Err(Error::InvalidNumaConfig);