Skip to content

Commit 816a073

Browse files
committed
allow creation of snapshots of secret hidden VMs
To take snapshots of secret hidden VMs, we need to bounce guest memory through a userspace buffer. Reuse the `Bounce` wrapper type that is already in use for loading the guest kernel / initrd. Signed-off-by: Patrick Roy <[email protected]>
1 parent c0b9ac8 commit 816a073

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/vmm/src/resources.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -525,8 +525,7 @@ impl VmResources {
525525
// because that would require running a backend process. If in the future we converge to
526526
// a single way of backing guest memory for vhost-user and non-vhost-user cases,
527527
// that would not be worth the effort.
528-
let regions =
529-
crate::arch::arch_memory_regions(0, self.memory_size()).into_iter();
528+
let regions = crate::arch::arch_memory_regions(0, self.memory_size()).into_iter();
530529
match guest_memfd {
531530
Some(file) => memory::file_shared(
532531
file,
@@ -536,8 +535,11 @@ impl VmResources {
536535
),
537536
None => {
538537
if self.vhost_user_devices_used() {
539-
let memfd = create_memfd(self.memory_size() as u64, self.machine_config.huge_pages.into())?
540-
.into_file();
538+
let memfd = create_memfd(
539+
self.memory_size() as u64,
540+
self.machine_config.huge_pages.into(),
541+
)?
542+
.into_file();
541543
memory::file_shared(
542544
memfd,
543545
regions,

src/vmm/src/vstate/vm.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
use std::collections::HashMap;
99
use std::fs::{File, OpenOptions};
1010
use std::io::Write;
11-
use std::os::fd::{AsRawFd, FromRawFd};
11+
use std::os::fd::{AsFd, AsRawFd, FromRawFd};
1212
use std::path::Path;
1313
use std::sync::Arc;
1414

15-
use kvm_bindings::{KVM_MEM_LOG_DIRTY_PAGES, kvm_create_guest_memfd, kvm_userspace_memory_region, kvm_userspace_memory_region2, KVM_MEM_GUEST_MEMFD};
15+
use kvm_bindings::{
16+
KVM_MEM_GUEST_MEMFD, KVM_MEM_LOG_DIRTY_PAGES, kvm_create_guest_memfd,
17+
kvm_userspace_memory_region, kvm_userspace_memory_region2,
18+
};
1619
use kvm_ioctls::{Cap, VmFd};
1720
use vmm_sys_util::eventfd::EventFd;
1821

@@ -23,7 +26,8 @@ use crate::persist::CreateSnapshotError;
2326
use crate::utils::u64_to_usize;
2427
use crate::vmm_config::snapshot::SnapshotType;
2528
use crate::vstate::memory::{
26-
Address, GuestMemory, GuestMemoryExtension, GuestMemoryMmap, GuestMemoryRegion, GuestRegionMmap,
29+
Address, GuestMemory, GuestMemoryExtension, GuestMemoryMmap, GuestMemoryRegion,
30+
GuestRegionMmap, MaybeBounce,
2731
};
2832
use crate::vstate::vcpu::VcpuError;
2933
use crate::{DirtyBitmap, Vcpu, mem_size_mib};
@@ -350,7 +354,12 @@ impl Vm {
350354
self.guest_memory().dump_dirty(&mut file, &dirty_bitmap)?;
351355
}
352356
SnapshotType::Full => {
353-
self.guest_memory().dump(&mut file)?;
357+
let secret_hidden = self
358+
.guest_memory()
359+
.iter()
360+
.any(|r| r.file_offset().is_some()); // FIXME
361+
self.guest_memory()
362+
.dump(&mut MaybeBounce::new(file.as_fd(), secret_hidden))?;
354363
self.reset_dirty_bitmap();
355364
self.guest_memory().reset_dirty();
356365
}

0 commit comments

Comments
 (0)