From 398d6b9f66b36d6612d2faa436a86147548d2d27 Mon Sep 17 00:00:00 2001 From: Amory Hoste Date: Wed, 24 Nov 2021 20:11:38 +0000 Subject: [PATCH 1/2] enable specifying custom snapshot load path Signed-off-by: Amory Hoste --- src/devices/src/virtio/block/persist.rs | 2 +- src/vmm/src/persist.rs | 13 ++++++++++++- src/vmm/src/vmm_config/snapshot.rs | 2 ++ tools/devtool | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/devices/src/virtio/block/persist.rs b/src/devices/src/virtio/block/persist.rs index b88f34e441d..d6972e30eba 100644 --- a/src/devices/src/virtio/block/persist.rs +++ b/src/devices/src/virtio/block/persist.rs @@ -57,7 +57,7 @@ pub struct BlockState { )] cache_type: CacheTypeState, root_device: bool, - disk_path: String, + pub disk_path: String, virtio_state: VirtioDeviceState, rate_limiter_state: RateLimiterState, } diff --git a/src/vmm/src/persist.rs b/src/vmm/src/persist.rs index 25814fcb3b8..a361bdaea29 100644 --- a/src/vmm/src/persist.rs +++ b/src/vmm/src/persist.rs @@ -418,7 +418,18 @@ pub fn restore_from_snapshot( ) -> std::result::Result>, LoadSnapshotError> { use self::LoadSnapshotError::*; let track_dirty_pages = params.enable_diff_snapshots; - let microvm_state = snapshot_state_from_file(¶ms.snapshot_path, version_map)?; + let mut microvm_state = snapshot_state_from_file(¶ms.snapshot_path, version_map)?; + + let new_snapshot_path = ¶ms.new_snapshot_path; + + if ! new_snapshot_path.eq("") { + let n = microvm_state.device_states.block_devices.len(); + for i in 0..n { + if microvm_state.device_states.block_devices[i].device_state.disk_path.contains("fc-dev-thinpool-") { + microvm_state.device_states.block_devices[i].device_state.disk_path = new_snapshot_path.clone(); + } + } + } // Some sanity checks before building the microvm. snapshot_state_sanity_check(µvm_state)?; diff --git a/src/vmm/src/vmm_config/snapshot.rs b/src/vmm/src/vmm_config/snapshot.rs index a140899e777..e820d4b7c8a 100644 --- a/src/vmm/src/vmm_config/snapshot.rs +++ b/src/vmm/src/vmm_config/snapshot.rs @@ -50,6 +50,8 @@ pub struct LoadSnapshotParams { pub mem_file_path: PathBuf, /// Setting this flag enables user page faults handling by a different process. pub enable_user_page_faults: bool, + /// Setting this string to nonempty changes the snapshot device + pub new_snapshot_path: String, /// Path to the passfd socket. pub sock_file_path: PathBuf, /// Setting this flag will enable KVM dirty page tracking and will diff --git a/tools/devtool b/tools/devtool index efff7221976..9356c07c2b5 100755 --- a/tools/devtool +++ b/tools/devtool @@ -69,7 +69,7 @@ # would help with reproducible builds (in addition to pinning Cargo.lock) # Development container image (without tag) -DEVCTR_IMAGE_NO_TAG="docker.io/vhiveease/fcuvm_dev" +DEVCTR_IMAGE_NO_TAG="docker.io/amohoste/fcuvm_dev" # Development container tag #DEVCTR_IMAGE_TAG="v30" From 9b375b69f473ffe2417de06fa833f18e5a193a59 Mon Sep 17 00:00:00 2001 From: Amory Hoste Date: Wed, 24 Nov 2021 20:13:26 +0000 Subject: [PATCH 2/2] undo sending transport_reset event on snapshot creation Signed-off-by: Amory Hoste --- src/vmm/src/device_manager/persist.rs | 5 +++-- src/vmm/src/persist.rs | 2 +- tools/devtool | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vmm/src/device_manager/persist.rs b/src/vmm/src/device_manager/persist.rs index aaa6ee7e5b3..1725358d2de 100644 --- a/src/vmm/src/device_manager/persist.rs +++ b/src/vmm/src/device_manager/persist.rs @@ -239,11 +239,12 @@ impl<'a> Persist<'a> for MMIODeviceManager { // Send Transport event to reset connections if device // is activated. - if vsock.is_activated() { + // TODO: temporarily disabled to avoid FC agent becoming unavailable when restoring snapshots + /*if vsock.is_activated() { vsock.send_transport_reset_event().unwrap_or_else(|e| { error!("Failed to send reset transport event: {:?}", e); }); - } + }*/ states.vsock_device = Some(ConnectedVsockState { device_id: devid.clone(), diff --git a/src/vmm/src/persist.rs b/src/vmm/src/persist.rs index a361bdaea29..e6ae526e5e7 100644 --- a/src/vmm/src/persist.rs +++ b/src/vmm/src/persist.rs @@ -425,7 +425,7 @@ pub fn restore_from_snapshot( if ! new_snapshot_path.eq("") { let n = microvm_state.device_states.block_devices.len(); for i in 0..n { - if microvm_state.device_states.block_devices[i].device_state.disk_path.contains("fc-dev-thinpool-") { + if microvm_state.device_states.block_devices[i].device_state.disk_path.contains("thinpool-snap") { microvm_state.device_states.block_devices[i].device_state.disk_path = new_snapshot_path.clone(); } } diff --git a/tools/devtool b/tools/devtool index 9356c07c2b5..d7b6bcda5c6 100755 --- a/tools/devtool +++ b/tools/devtool @@ -72,8 +72,8 @@ DEVCTR_IMAGE_NO_TAG="docker.io/amohoste/fcuvm_dev" # Development container tag -#DEVCTR_IMAGE_TAG="v30" -DEVCTR_IMAGE_TAG="v16_upf" +DEVCTR_IMAGE_TAG="v30" +#DEVCTR_IMAGE_TAG="v16_upf" # Development container image (name:tag) # This should be updated whenever we upgrade the development container.