From a8cd1d79d8f7f4f61809949cf693bf6530d603fd Mon Sep 17 00:00:00 2001 From: Zhang Junyu Date: Wed, 29 Apr 2026 23:23:53 +0800 Subject: [PATCH 1/3] feat: Introduce vm-snapshot --- Cargo.lock | 9 +++++++++ crates/vm-snapshot/Cargo.toml | 9 +++++++++ crates/vm-snapshot/src/lib.rs | 3 +++ crates/vm-snapshot/src/ops.rs | 27 +++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 crates/vm-snapshot/Cargo.toml create mode 100644 crates/vm-snapshot/src/lib.rs create mode 100644 crates/vm-snapshot/src/ops.rs diff --git a/Cargo.lock b/Cargo.lock index 27e6b55..ac70de1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1168,6 +1168,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "vm-snapshot" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "vm-virtio" version = "0.1.0" diff --git a/crates/vm-snapshot/Cargo.toml b/crates/vm-snapshot/Cargo.toml new file mode 100644 index 0000000..4816016 --- /dev/null +++ b/crates/vm-snapshot/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "vm-snapshot" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } diff --git a/crates/vm-snapshot/src/lib.rs b/crates/vm-snapshot/src/lib.rs new file mode 100644 index 0000000..af83854 --- /dev/null +++ b/crates/vm-snapshot/src/lib.rs @@ -0,0 +1,3 @@ +#![deny(warnings)] + +pub mod ops; diff --git a/crates/vm-snapshot/src/ops.rs b/crates/vm-snapshot/src/ops.rs new file mode 100644 index 0000000..75573e8 --- /dev/null +++ b/crates/vm-snapshot/src/ops.rs @@ -0,0 +1,27 @@ +use std::io::{Read, Write}; + +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum Error { + #[error("IO error: {0}")] + Io(#[from] std::io::Error), +} + +pub trait Pausable { + fn is_running(&self) -> bool; + + fn pause(&mut self) -> Result<(), Error>; + + fn resume(&mut self) -> Result<(), Error>; +} + +pub trait Snapshotable { + fn save(&self, writer: &mut W) -> Result, Error> + where + W: Write; + + fn restore(&mut self, reader: &mut R) -> Result<(), Error> + where + R: Read; +} From 7133f4de694690f399bdf0d3292beb2dbea68798 Mon Sep 17 00:00:00 2001 From: Zhang Junyu Date: Wed, 29 Apr 2026 23:36:56 +0800 Subject: [PATCH 2/3] feat: Update device trait for snapshot --- Cargo.lock | 1 + Cargo.toml | 1 + crates/vm-core/Cargo.toml | 1 + crates/vm-core/src/device.rs | 11 +++++++++++ crates/vm-snapshot/src/ops.rs | 13 ++++--------- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac70de1..bdcfc66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1106,6 +1106,7 @@ dependencies = [ "vm-aarch64", "vm-fdt", "vm-mm", + "vm-snapshot", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8336c76..f347f89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ vm-device = { path = "crates/vm-device" } vm-fdt = "0.3.0" vm-mm = { path = "crates/vm-mm" } vm-pci = { path = "crates/vm-pci" } +vm-snapshot = { path = "crates/vm-snapshot" } vm-virtio = { path = "crates/vm-virtio" } vm-vmm = { path = "crates/vm-vmm" } zerocopy = { version = "0.8.33", features = ["derive"] } diff --git a/crates/vm-core/Cargo.toml b/crates/vm-core/Cargo.toml index 19a9a52..2070719 100644 --- a/crates/vm-core/Cargo.toml +++ b/crates/vm-core/Cargo.toml @@ -17,6 +17,7 @@ thiserror = { workspace = true } tokio = { workspace = true } vm-fdt = { workspace = true } vm-mm = { workspace = true } +vm-snapshot = { workspace = true } [target.'cfg(target_arch = "aarch64")'.dependencies] vm-aarch64 = { workspace = true } diff --git a/crates/vm-core/src/device.rs b/crates/vm-core/src/device.rs index 169ef88..2ddd5ed 100644 --- a/crates/vm-core/src/device.rs +++ b/crates/vm-core/src/device.rs @@ -1,6 +1,17 @@ +use vm_snapshot::ops::Pausable; +use vm_snapshot::ops::Snapshotable; + pub mod mmio; pub mod pio; pub trait Device: Send + Sync { fn name(&self) -> String; + + fn support_pause(&mut self) -> Option<&mut dyn Pausable> { + None + } + + fn support_snapshot(&mut self) -> Option<&mut dyn Snapshotable> { + None + } } diff --git a/crates/vm-snapshot/src/ops.rs b/crates/vm-snapshot/src/ops.rs index 75573e8..10c6ee8 100644 --- a/crates/vm-snapshot/src/ops.rs +++ b/crates/vm-snapshot/src/ops.rs @@ -1,4 +1,5 @@ -use std::io::{Read, Write}; +use std::io::Read; +use std::io::Write; use thiserror::Error; @@ -9,19 +10,13 @@ pub enum Error { } pub trait Pausable { - fn is_running(&self) -> bool; - fn pause(&mut self) -> Result<(), Error>; fn resume(&mut self) -> Result<(), Error>; } pub trait Snapshotable { - fn save(&self, writer: &mut W) -> Result, Error> - where - W: Write; + fn save(&self, writer: &mut dyn Write) -> Result, Error>; - fn restore(&mut self, reader: &mut R) -> Result<(), Error> - where - R: Read; + fn restore(&mut self, reader: &mut dyn Read) -> Result<(), Error>; } From eeff511676c71296814fc8f78a5cfebc94149029 Mon Sep 17 00:00:00 2001 From: Zhang Junyu Date: Wed, 29 Apr 2026 23:38:50 +0800 Subject: [PATCH 3/3] fix: Fix udeps --- Cargo.lock | 2 -- crates/vm-snapshot/Cargo.toml | 2 -- 2 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bdcfc66..5e450dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1173,8 +1173,6 @@ dependencies = [ name = "vm-snapshot" version = "0.1.0" dependencies = [ - "serde", - "serde_json", "thiserror", ] diff --git a/crates/vm-snapshot/Cargo.toml b/crates/vm-snapshot/Cargo.toml index 4816016..4d1750e 100644 --- a/crates/vm-snapshot/Cargo.toml +++ b/crates/vm-snapshot/Cargo.toml @@ -4,6 +4,4 @@ version = "0.1.0" edition = "2024" [dependencies] -serde = { workspace = true } -serde_json = { workspace = true } thiserror = { workspace = true }