Skip to content

Commit f6c87ff

Browse files
committed
refactor: Hoist update_vm_config call to begin of restore path
Ensure that the vm_config field of the `VmResources` struct is initialized from snapshot data as early as possible. This means that further steps in the snapshot restore procedure can rely on the vm_resources object for vm configuration information, instead of needing to access the microvm state (or passing various parameters down to ever snapshot restore function aslong with the uninitialized `VmResources` struct, as was done for dirty page tracking). This change also ensures that we fail early if the snapshot is malformed in some way, as opposed to failing after various KVM resources have already (potentially incorrectly) been initialized. Signed-off-by: Patrick Roy <[email protected]>
1 parent 43f9cbf commit f6c87ff

File tree

3 files changed

+22
-22
lines changed

3 files changed

+22
-22
lines changed

src/vmm/src/builder.rs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use crate::snapshot::Persist;
5656
use crate::vmm_config::boot_source::BootConfig;
5757
use crate::vmm_config::drive::BlockDeviceType;
5858
use crate::vmm_config::instance_info::InstanceInfo;
59-
use crate::vmm_config::machine_config::{MachineConfigUpdate, VmConfig, VmConfigError};
59+
use crate::vmm_config::machine_config::{VmConfig, VmConfigError};
6060
use crate::vstate::memory::{GuestAddress, GuestMemory, GuestMemoryExtension, GuestMemoryMmap};
6161
use crate::vstate::vcpu::{Vcpu, VcpuConfig, VcpuError};
6262
use crate::vstate::vm::Vm;
@@ -363,8 +363,6 @@ pub fn build_and_boot_microvm(
363363
pub enum BuildMicrovmFromSnapshotError {
364364
/// Failed to create microVM and vCPUs: {0}
365365
CreateMicrovmAndVcpus(#[from] StartMicrovmError),
366-
/// Only 255 vCPU state are supported, but {0} states where given.
367-
TooManyVCPUs(usize),
368366
/// Could not access KVM: {0}
369367
KvmAccess(#[from] utils::errno::Error),
370368
/// Error configuring the TSC, frequency not present in the given snapshot.
@@ -406,23 +404,18 @@ pub fn build_microvm_from_snapshot(
406404
microvm_state: MicrovmState,
407405
guest_memory: GuestMemoryMmap,
408406
uffd: Option<Uffd>,
409-
track_dirty_pages: bool,
410407
seccomp_filters: &BpfThreadMap,
411408
vm_resources: &mut VmResources,
412409
) -> Result<Arc<Mutex<Vmm>>, BuildMicrovmFromSnapshotError> {
413-
let vcpu_count = u8::try_from(microvm_state.vcpu_states.len()).map_err(|_| {
414-
BuildMicrovmFromSnapshotError::TooManyVCPUs(microvm_state.vcpu_states.len())
415-
})?;
416-
417410
// Build Vmm.
418411
debug!("event_start: build microvm from snapshot");
419412
let (mut vmm, mut vcpus) = create_vmm_and_vcpus(
420413
instance_info,
421414
event_manager,
422415
guest_memory.clone(),
423416
uffd,
424-
track_dirty_pages,
425-
vcpu_count,
417+
vm_resources.vm_config.track_dirty_pages,
418+
vm_resources.vm_config.vcpu_count,
426419
microvm_state.vm_state.kvm_cap_modifiers.clone(),
427420
)?;
428421

@@ -466,14 +459,6 @@ pub fn build_microvm_from_snapshot(
466459
#[cfg(target_arch = "x86_64")]
467460
vmm.vm.restore_state(&microvm_state.vm_state)?;
468461

469-
vm_resources.update_vm_config(&MachineConfigUpdate {
470-
vcpu_count: Some(vcpu_count),
471-
mem_size_mib: Some(u64_to_usize(microvm_state.vm_info.mem_size_mib)),
472-
smt: Some(microvm_state.vm_info.smt),
473-
cpu_template: Some(microvm_state.vm_info.cpu_template),
474-
track_dirty_pages: Some(track_dirty_pages),
475-
})?;
476-
477462
// Restore the boot source config paths.
478463
vm_resources.set_boot_source_config(microvm_state.vm_info.boot_source);
479464

src/vmm/src/persist.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::resources::VmResources;
3232
use crate::snapshot::Snapshot;
3333
use crate::vmm_config::boot_source::BootSourceConfig;
3434
use crate::vmm_config::instance_info::InstanceInfo;
35-
use crate::vmm_config::machine_config::MAX_SUPPORTED_VCPUS;
35+
use crate::vmm_config::machine_config::{MachineConfigUpdate, VmConfigError, MAX_SUPPORTED_VCPUS};
3636
use crate::vmm_config::snapshot::{
3737
CreateSnapshotParams, LoadSnapshotParams, MemBackendType, SnapshotType,
3838
};
@@ -392,13 +392,30 @@ pub fn restore_from_snapshot(
392392
vm_resources: &mut VmResources,
393393
) -> Result<Arc<Mutex<Vmm>>, RestoreFromSnapshotError> {
394394
let microvm_state = snapshot_state_from_file(&params.snapshot_path)?;
395+
let track_dirty_pages = params.enable_diff_snapshots;
396+
397+
let vcpu_count = microvm_state
398+
.vcpu_states
399+
.len()
400+
.try_into()
401+
.map_err(|_| VmConfigError::InvalidVcpuCount)
402+
.map_err(BuildMicrovmFromSnapshotError::VmUpdateConfig)?;
403+
404+
vm_resources
405+
.update_vm_config(&MachineConfigUpdate {
406+
vcpu_count: Some(vcpu_count),
407+
mem_size_mib: Some(u64_to_usize(microvm_state.vm_info.mem_size_mib)),
408+
smt: Some(microvm_state.vm_info.smt),
409+
cpu_template: Some(microvm_state.vm_info.cpu_template),
410+
track_dirty_pages: Some(track_dirty_pages),
411+
})
412+
.map_err(BuildMicrovmFromSnapshotError::VmUpdateConfig)?;
395413

396414
// Some sanity checks before building the microvm.
397415
snapshot_state_sanity_check(&microvm_state)?;
398416

399417
let mem_backend_path = &params.mem_backend.backend_path;
400418
let mem_state = &microvm_state.memory_state;
401-
let track_dirty_pages = params.enable_diff_snapshots;
402419

403420
let (guest_memory, uffd) = match params.mem_backend.backend_type {
404421
MemBackendType::File => (
@@ -422,7 +439,6 @@ pub fn restore_from_snapshot(
422439
microvm_state,
423440
guest_memory,
424441
uffd,
425-
track_dirty_pages,
426442
seccomp_filters,
427443
vm_resources,
428444
)

src/vmm/tests/integration_tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,6 @@ fn verify_load_snapshot(snapshot_file: TempFile, memory_file: TempFile) {
254254
microvm_state,
255255
mem,
256256
None,
257-
false,
258257
&empty_seccomp_filters,
259258
vm_resources,
260259
)

0 commit comments

Comments
 (0)