Skip to content

Commit 3ab85d2

Browse files
committed
refactor: hoist up hugepages/file-based restore incompatibility check
Move this check out of the memory allocation code and up into the snapshot restoration code. This allows us to encode the impossibility of mmap-ing a snapshot file with hugepages at the type level (by simply not giving an option to pass a `HugePageConfig` to `GuestMemoryMmap::create` if `MemoryKind::Snapshot(_)` is passed). Signed-off-by: Patrick Roy <[email protected]>
1 parent d1ebfbe commit 3ab85d2

File tree

7 files changed

+44
-89
lines changed

7 files changed

+44
-89
lines changed

src/vmm/src/devices/virtio/block/vhost_user/device.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,6 @@ mod tests {
379379
use crate::devices::virtio::block::virtio::device::FileEngineType;
380380
use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG;
381381
use crate::test_utils::create_tmp_socket;
382-
use crate::vmm_config::machine_config::HugePageConfig;
383382
use crate::vstate::memory::{GuestMemoryExtension, MemoryKind};
384383

385384
#[test]
@@ -784,7 +783,6 @@ mod tests {
784783
[(GuestAddress(0), region_size)].into_iter(),
785784
MemoryKind::FilePrivate(file),
786785
false,
787-
HugePageConfig::None,
788786
)
789787
.unwrap();
790788

src/vmm/src/devices/virtio/block/virtio/io/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,8 @@ pub mod tests {
232232
fn create_mem() -> GuestMemoryMmap {
233233
GuestMemoryMmap::create(
234234
[(GuestAddress(0), MEM_LEN)].into_iter(),
235-
MemoryKind::MapAnonymous,
235+
MemoryKind::MapAnonymous(HugePageConfig::None),
236236
true,
237-
HugePageConfig::None,
238237
)
239238
.unwrap()
240239
}

src/vmm/src/devices/virtio/vhost_user.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,6 @@ mod tests {
466466

467467
use super::*;
468468
use crate::test_utils::create_tmp_socket;
469-
use crate::vmm_config::machine_config::HugePageConfig;
470469
use crate::vstate::memory::{GuestAddress, GuestMemoryExtension, MemoryKind};
471470

472471
#[test]
@@ -764,13 +763,9 @@ mod tests {
764763
(GuestAddress(0x10000), region_size),
765764
];
766765

767-
let guest_memory = GuestMemoryMmap::create(
768-
regions.into_iter(),
769-
MemoryKind::FilePrivate(file),
770-
false,
771-
HugePageConfig::None,
772-
)
773-
.unwrap();
766+
let guest_memory =
767+
GuestMemoryMmap::create(regions.into_iter(), MemoryKind::FilePrivate(file), false)
768+
.unwrap();
774769

775770
vuh.update_mem_table(&guest_memory).unwrap();
776771

@@ -887,7 +882,6 @@ mod tests {
887882
[(GuestAddress(0), region_size)].into_iter(),
888883
MemoryKind::FilePrivate(file),
889884
false,
890-
HugePageConfig::None,
891885
)
892886
.unwrap();
893887

src/vmm/src/persist.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -449,16 +449,20 @@ pub fn restore_from_snapshot(
449449
let mem_state = &microvm_state.memory_state;
450450

451451
let (guest_memory, uffd) = match params.mem_backend.backend_type {
452-
MemBackendType::File => (
453-
guest_memory_from_file(
454-
mem_backend_path,
455-
mem_state,
456-
track_dirty_pages,
457-
vm_resources.machine_config.huge_pages,
452+
MemBackendType::File => {
453+
if vm_resources.machine_config.huge_pages.is_hugetlbfs() {
454+
return Err(RestoreFromSnapshotGuestMemoryError::File(
455+
GuestMemoryFromFileError::HugetlbfsSnapshot,
456+
)
457+
.into());
458+
}
459+
460+
(
461+
guest_memory_from_file(mem_backend_path, mem_state, track_dirty_pages)
462+
.map_err(RestoreFromSnapshotGuestMemoryError::File)?,
463+
None,
458464
)
459-
.map_err(RestoreFromSnapshotGuestMemoryError::File)?,
460-
None,
461-
),
465+
}
462466
MemBackendType::Uffd => guest_memory_from_uffd(
463467
mem_backend_path,
464468
mem_state,
@@ -514,14 +518,15 @@ pub enum GuestMemoryFromFileError {
514518
File(#[from] std::io::Error),
515519
/// Failed to restore guest memory: {0}
516520
Restore(#[from] MemoryError),
521+
/// Cannot restore hugetlbfs backed snapshot by mapping the memory file. Please use uffd.
522+
HugetlbfsSnapshot,
517523
}
518524

519525
/// Creates a [`GuestMemoryMmap`] from a snapshot file
520526
pub fn guest_memory_from_file(
521527
mem_file_path: &Path,
522528
mem_state: &GuestMemoryState,
523529
track_dirty_pages: bool,
524-
huge_pages: HugePageConfig,
525530
) -> Result<GuestMemoryMmap, GuestMemoryFromFileError> {
526531
let mem_file = File::open(mem_file_path)?;
527532
let guest_mem = GuestMemoryMmap::create(
@@ -531,7 +536,6 @@ pub fn guest_memory_from_file(
531536
.map(|region| (GuestAddress(region.base_address), region.size)),
532537
MemoryKind::FilePrivate(mem_file),
533538
track_dirty_pages,
534-
huge_pages,
535539
)?;
536540
Ok(guest_mem)
537541
}
@@ -596,9 +600,8 @@ fn create_guest_memory(
596600
.regions
597601
.iter()
598602
.map(|region| (GuestAddress(region.base_address), region.size)),
599-
MemoryKind::MapAnonymous,
603+
MemoryKind::MapAnonymous(huge_pages),
600604
track_dirty_pages,
601-
huge_pages,
602605
)?;
603606
let mut backend_mappings = Vec::with_capacity(guest_memory.num_regions());
604607
for (mem_region, state_region) in guest_memory.iter().zip(mem_state.regions.iter()) {

src/vmm/src/resources.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,14 +471,13 @@ impl VmResources {
471471
self.machine_config.huge_pages,
472472
)?
473473
} else {
474-
MemoryKind::MapAnonymous
474+
MemoryKind::MapAnonymous(self.machine_config.huge_pages)
475475
};
476476

477477
GuestMemoryMmap::create(
478478
crate::arch::arch_memory_regions(self.machine_config.mem_size_mib << 20).into_iter(),
479479
memory_kind,
480480
self.machine_config.track_dirty_pages,
481-
self.machine_config.huge_pages,
482481
)
483482
}
484483
}

src/vmm/src/test_utils/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ pub fn single_region_mem_at(at: u64, size: usize) -> GuestMemoryMmap {
3636
pub fn multi_region_mem(regions: &[(GuestAddress, usize)]) -> GuestMemoryMmap {
3737
GuestMemoryMmap::create(
3838
regions.iter().copied(),
39-
MemoryKind::MapAnonymous,
39+
MemoryKind::MapAnonymous(HugePageConfig::None),
4040
false,
41-
HugePageConfig::None,
4241
)
4342
.expect("Cannot initialize memory")
4443
}

0 commit comments

Comments
 (0)