From 7f18d0a281a3c03e9c9787087bcace487b2b7e32 Mon Sep 17 00:00:00 2001 From: Changyuan Lyu Date: Fri, 7 Jul 2023 23:11:11 -0700 Subject: [PATCH] memory_manager: improve memory region creation Instead of making an owned `zones`, using an iterator is cheaper since `Vec::remove` may have the performance O(n) [1]. [1]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.remove Signed-off-by: Changyuan Lyu --- vmm/src/memory_manager.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index 6fb0ce64f..c38cd8533 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -528,10 +528,10 @@ impl MemoryManager { prefault: Option, thp: bool, ) -> Result<(Vec>, MemoryZones), Error> { - let mut zones = zones.to_owned(); + let mut zone_iter = zones.iter(); let mut mem_regions = Vec::new(); - let mut zone = zones.remove(0); - let mut zone_align_size = memory_zone_get_align_size(&zone)?; + let mut zone = zone_iter.next().ok_or(Error::MissingMemoryZones)?; + let mut zone_align_size = memory_zone_get_align_size(zone)?; let mut zone_offset = 0u64; let mut memory_zones = HashMap::new(); @@ -609,12 +609,13 @@ impl MemoryManager { if pull_next_zone { // Get the next zone and reset the offset. zone_offset = 0; - if zones.is_empty() { + if let Some(z) = zone_iter.next() { + zone = z; + } else { exit = true; break; } - zone = zones.remove(0); - zone_align_size = memory_zone_get_align_size(&zone)?; + zone_align_size = memory_zone_get_align_size(zone)?; if !is_aligned(zone.size, zone_align_size) { return Err(Error::MisalignedMemorySize); }