Skip to content

Commit d835805

Browse files
committed
refactor: drop offset field from GuestMemoryRegionState
In praxis, the way we wrote our snapshot files has always been just writing all regions in-order. This mean that the offset of a region is simply the sum of the sizes of the preceding regions. The new `GuestMemoryMmap::create` code already computes the offsets for mapping the memory file this way, so drop the explicit calculation at snapshot creation time (as the calculated value isnt used by the restoration anymore). Do not bump the snapshot version number, because we already did so since the last release. Signed-off-by: Patrick Roy <[email protected]>
1 parent 441f6a8 commit d835805

File tree

2 files changed

+11
-18
lines changed

2 files changed

+11
-18
lines changed

src/vmm/src/persist.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -584,13 +584,15 @@ fn create_guest_memory(
584584
) -> Result<(GuestMemoryMmap, Vec<GuestRegionUffdMapping>), GuestMemoryFromUffdError> {
585585
let guest_memory = GuestMemoryMmap::from_state(None, mem_state, track_dirty_pages, huge_pages)?;
586586
let mut backend_mappings = Vec::with_capacity(guest_memory.num_regions());
587-
for (mem_region, state_region) in guest_memory.iter().zip(mem_state.regions.iter()) {
587+
let mut offset = 0;
588+
for mem_region in guest_memory.iter() {
588589
backend_mappings.push(GuestRegionUffdMapping {
589590
base_host_virt_addr: mem_region.as_ptr() as u64,
590591
size: mem_region.size(),
591-
offset: state_region.offset,
592+
offset,
592593
page_size_kib: huge_pages.page_size_kib(),
593594
});
595+
offset += mem_region.size() as u64;
594596
}
595597

596598
Ok((guest_memory, backend_mappings))
@@ -770,7 +772,6 @@ mod tests {
770772
regions: vec![GuestMemoryRegionState {
771773
base_address: 0,
772774
size: 0x20000,
773-
offset: 0x10000,
774775
}],
775776
};
776777

@@ -779,7 +780,7 @@ mod tests {
779780

780781
assert_eq!(uffd_regions.len(), 1);
781782
assert_eq!(uffd_regions[0].size, 0x20000);
782-
assert_eq!(uffd_regions[0].offset, 0x10000);
783+
assert_eq!(uffd_regions[0].offset, 0);
783784
assert_eq!(
784785
uffd_regions[0].page_size_kib,
785786
HugePageConfig::None.page_size_kib()

src/vmm/src/vstate/memory.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,6 @@ pub struct GuestMemoryRegionState {
122122
pub base_address: u64,
123123
/// Region size.
124124
pub size: usize,
125-
/// Offset in file/buffer where the region is saved.
126-
pub offset: u64,
127125
}
128126

129127
/// Describes guest memory regions and their snapshot file mappings.
@@ -232,6 +230,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
232230
track_dirty_pages: bool,
233231
huge_pages: HugePageConfig,
234232
) -> Result<Self, MemoryError> {
233+
let mut offset = 0;
235234
match file {
236235
Some(f) => {
237236
if huge_pages.is_hugetlbfs() {
@@ -242,10 +241,12 @@ impl GuestMemoryExtension for GuestMemoryMmap {
242241
.regions
243242
.iter()
244243
.map(|r| {
245-
f.try_clone().map(|file_clone| {
246-
let offset = FileOffset::new(file_clone, r.offset);
244+
let fo = f.try_clone().map(|file_clone| {
245+
let offset = FileOffset::new(file_clone, offset);
247246
(offset, GuestAddress(r.base_address), r.size)
248-
})
247+
});
248+
offset += r.size as u64;
249+
fo
249250
})
250251
.collect::<Result<Vec<_>, std::io::Error>>()
251252
.map_err(MemoryError::FileError)?;
@@ -266,15 +267,11 @@ impl GuestMemoryExtension for GuestMemoryMmap {
266267
/// Describes GuestMemoryMmap through a GuestMemoryState struct.
267268
fn describe(&self) -> GuestMemoryState {
268269
let mut guest_memory_state = GuestMemoryState::default();
269-
let mut offset = 0;
270270
self.iter().for_each(|region| {
271271
guest_memory_state.regions.push(GuestMemoryRegionState {
272272
base_address: region.start_addr().0,
273273
size: u64_to_usize(region.len()),
274-
offset,
275274
});
276-
277-
offset += region.len();
278275
});
279276
guest_memory_state
280277
}
@@ -536,7 +533,6 @@ mod tests {
536533
regions: vec![GuestMemoryRegionState {
537534
base_address: 0,
538535
size: 4096,
539-
offset: 0,
540536
}],
541537
};
542538
let file = TempFile::new().unwrap().into_file();
@@ -652,12 +648,10 @@ mod tests {
652648
GuestMemoryRegionState {
653649
base_address: 0,
654650
size: page_size,
655-
offset: 0,
656651
},
657652
GuestMemoryRegionState {
658653
base_address: page_size as u64 * 2,
659654
size: page_size,
660-
offset: page_size as u64,
661655
},
662656
],
663657
};
@@ -679,12 +673,10 @@ mod tests {
679673
GuestMemoryRegionState {
680674
base_address: 0,
681675
size: page_size * 3,
682-
offset: 0,
683676
},
684677
GuestMemoryRegionState {
685678
base_address: page_size as u64 * 4,
686679
size: page_size * 3,
687-
offset: page_size as u64 * 3,
688680
},
689681
],
690682
};

0 commit comments

Comments
 (0)