Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/vmm/src/persist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -584,13 +584,15 @@ fn create_guest_memory(
) -> Result<(GuestMemoryMmap, Vec<GuestRegionUffdMapping>), GuestMemoryFromUffdError> {
let guest_memory = GuestMemoryMmap::from_state(None, mem_state, track_dirty_pages, huge_pages)?;
let mut backend_mappings = Vec::with_capacity(guest_memory.num_regions());
for (mem_region, state_region) in guest_memory.iter().zip(mem_state.regions.iter()) {
let mut offset = 0;
for mem_region in guest_memory.iter() {
backend_mappings.push(GuestRegionUffdMapping {
base_host_virt_addr: mem_region.as_ptr() as u64,
size: mem_region.size(),
offset: state_region.offset,
offset,
page_size_kib: huge_pages.page_size_kib(),
});
offset += mem_region.size() as u64;
}

Ok((guest_memory, backend_mappings))
Expand Down Expand Up @@ -770,7 +772,6 @@ mod tests {
regions: vec![GuestMemoryRegionState {
base_address: 0,
size: 0x20000,
offset: 0x10000,
}],
};

Expand All @@ -779,7 +780,7 @@ mod tests {

assert_eq!(uffd_regions.len(), 1);
assert_eq!(uffd_regions[0].size, 0x20000);
assert_eq!(uffd_regions[0].offset, 0x10000);
assert_eq!(uffd_regions[0].offset, 0);
assert_eq!(
uffd_regions[0].page_size_kib,
HugePageConfig::None.page_size_kib()
Expand Down
20 changes: 6 additions & 14 deletions src/vmm/src/vstate/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,6 @@ pub struct GuestMemoryRegionState {
pub base_address: u64,
/// Region size.
pub size: usize,
/// Offset in file/buffer where the region is saved.
pub offset: u64,
}

/// Describes guest memory regions and their snapshot file mappings.
Expand Down Expand Up @@ -232,6 +230,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
track_dirty_pages: bool,
huge_pages: HugePageConfig,
) -> Result<Self, MemoryError> {
let mut offset = 0;
match file {
Some(f) => {
if huge_pages.is_hugetlbfs() {
Expand All @@ -242,10 +241,12 @@ impl GuestMemoryExtension for GuestMemoryMmap {
.regions
.iter()
.map(|r| {
f.try_clone().map(|file_clone| {
let offset = FileOffset::new(file_clone, r.offset);
let fo = f.try_clone().map(|file_clone| {
let offset = FileOffset::new(file_clone, offset);
(offset, GuestAddress(r.base_address), r.size)
})
});
offset += r.size as u64;
fo
})
.collect::<Result<Vec<_>, std::io::Error>>()
.map_err(MemoryError::FileError)?;
Expand All @@ -266,15 +267,11 @@ impl GuestMemoryExtension for GuestMemoryMmap {
/// Describes GuestMemoryMmap through a GuestMemoryState struct.
fn describe(&self) -> GuestMemoryState {
let mut guest_memory_state = GuestMemoryState::default();
let mut offset = 0;
self.iter().for_each(|region| {
guest_memory_state.regions.push(GuestMemoryRegionState {
base_address: region.start_addr().0,
size: u64_to_usize(region.len()),
offset,
});

offset += region.len();
});
guest_memory_state
}
Expand Down Expand Up @@ -536,7 +533,6 @@ mod tests {
regions: vec![GuestMemoryRegionState {
base_address: 0,
size: 4096,
offset: 0,
}],
};
let file = TempFile::new().unwrap().into_file();
Expand Down Expand Up @@ -652,12 +648,10 @@ mod tests {
GuestMemoryRegionState {
base_address: 0,
size: page_size,
offset: 0,
},
GuestMemoryRegionState {
base_address: page_size as u64 * 2,
size: page_size,
offset: page_size as u64,
},
],
};
Expand All @@ -679,12 +673,10 @@ mod tests {
GuestMemoryRegionState {
base_address: 0,
size: page_size * 3,
offset: 0,
},
GuestMemoryRegionState {
base_address: page_size as u64 * 4,
size: page_size * 3,
offset: page_size as u64 * 3,
},
],
};
Expand Down