diff --git a/Cargo.lock b/Cargo.lock index bf592b7e3..17d95e838 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,11 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "anyhow" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "arc-swap" version = "0.4.4" @@ -925,6 +930,24 @@ dependencies = [ "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "thiserror" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thiserror-impl 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread_local" version = "0.3.6" @@ -1044,6 +1067,13 @@ dependencies = [ [[package]] name = "vm-device" version = "0.1.0" +dependencies = [ + "anyhow 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "vm-memory" @@ -1167,6 +1197,7 @@ dependencies = [ [metadata] "checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +"checksum anyhow 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1072d8f55592084072d2d3cb23a4b680a8543c00f10d446118e85ad3718142" "checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" @@ -1262,6 +1293,8 @@ dependencies = [ "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +"checksum thiserror 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "cc6b305ec0e323c7b6cfff6098a22516e0063d0bb7c3d88660a890217dca099a" +"checksum thiserror-impl 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45ba8d810d9c48fc456b7ad54574e8bfb7c7918a57ad7a6e6a0985d7959e8597" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" "checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb" diff --git a/vm-device/Cargo.toml b/vm-device/Cargo.toml index 88b5c228d..aa1725538 100644 --- a/vm-device/Cargo.toml +++ b/vm-device/Cargo.toml @@ -5,3 +5,8 @@ authors = ["The Cloud Hypervisor Authors"] edition = "2018" [dependencies] +anyhow = "1.0" +thiserror = "1.0" +serde = {version = ">=1.0.27", features = ["rc"] } +serde_derive = ">=1.0.27" +serde_json = ">=1.0.9" diff --git a/vm-device/src/lib.rs b/vm-device/src/lib.rs index c4d9b5bac..124e1338d 100644 --- a/vm-device/src/lib.rs +++ b/vm-device/src/lib.rs @@ -1,3 +1,8 @@ +extern crate serde; +extern crate thiserror; + +use thiserror::Error; + /// Trait meant for triggering the DMA mapping update related to an external /// device not managed fully through virtio. It is dedicated to virtio-iommu /// in order to trigger the map update anytime the mapping is updated from the @@ -9,3 +14,31 @@ pub trait ExternalDmaMapping: Send + Sync { /// Unmap a memory range fn unmap(&self, iova: u64, size: u64) -> std::result::Result<(), std::io::Error>; } + +#[derive(Error, Debug)] +pub enum MigratableError { + #[error("Failed to pause migratable component: {0}")] + Pause(#[source] anyhow::Error), + + #[error("Failed to resume migratable component: {0}")] + Resume(#[source] anyhow::Error), +} + +/// A Pausable component can be paused and resumed. +pub trait Pausable { + /// Pause the component. + fn pause(&mut self) -> std::result::Result<(), MigratableError>; + + /// Resume the component. + fn resume(&mut self) -> std::result::Result<(), MigratableError>; +} + +/// A snapshotable component can be snapshoted. +pub trait Snapshotable {} + +/// Trait to be implemented by any component (device, CPU, RAM, etc) that +/// can be migrated. +/// All migratable components are paused before being snapshotted, and then +/// eventually resumed. Thus any Migratable component must be both Pausable +/// and Snapshotable. +pub trait Migratable: Pausable + Snapshotable {}