From 72ec98b8a8d72e922ba042b53cb4715c4083b0c5 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Wed, 26 May 2021 15:06:28 +0000 Subject: [PATCH] arch: aarch64: Versionize Gicv3State Signed-off-by: Rob Bradford --- Cargo.lock | 2 ++ arch/Cargo.toml | 2 ++ arch/src/aarch64/gic/gicv3.rs | 11 ++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37b865d46..7b4b53d4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,6 +73,8 @@ dependencies = [ "serde_derive", "serde_json", "thiserror", + "versionize", + "versionize_derive", "vm-fdt", "vm-memory", "vm-migration", diff --git a/arch/Cargo.toml b/arch/Cargo.toml index b20cf8a9f..b5de208b7 100644 --- a/arch/Cargo.toml +++ b/arch/Cargo.toml @@ -21,6 +21,8 @@ serde = {version = ">=1.0.27", features = ["rc"] } serde_derive = ">=1.0.27" serde_json = ">=1.0.9" thiserror = "1.0" +versionize = "0.1.6" +versionize_derive = "0.1.4" vm-fdt = { git = "https://github.com/rust-vmm/vm-fdt", branch = "master" } vm-memory = { version = "0.5.0", features = ["backend-mmap"] } vm-migration = { path = "../vm-migration" } diff --git a/arch/src/aarch64/gic/gicv3.rs b/arch/src/aarch64/gic/gicv3.rs index 199b42208..690c3e7c9 100644 --- a/arch/src/aarch64/gic/gicv3.rs +++ b/arch/src/aarch64/gic/gicv3.rs @@ -14,8 +14,11 @@ pub mod kvm { use std::convert::TryInto; use std::sync::Arc; use std::{boxed::Box, result}; + use versionize::{VersionMap, Versionize, VersionizeResult}; + use versionize_derive::Versionize; use vm_migration::{ Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable, + VersionMapped, }; /// Errors thrown while saving/restoring the GICv3. @@ -57,7 +60,7 @@ pub mod kvm { vcpu_count: u64, } - #[derive(Serialize, Deserialize)] + #[derive(Serialize, Deserialize, Versionize)] pub struct Gicv3State { dist: Vec, rdist: Vec, @@ -66,6 +69,8 @@ pub mod kvm { gicd_ctlr: u32, } + impl VersionMapped for Gicv3State {} + impl KvmGicV3 { // Unfortunately bindgen omits defines that are based on other defines. // See arch/arm64/include/uapi/asm/kvm.h file from the linux kernel. @@ -229,12 +234,12 @@ pub mod kvm { fn snapshot(&mut self) -> std::result::Result { let gicr_typers = self.gicr_typers.clone(); - Snapshot::new_from_state(&self.id(), &self.state(&gicr_typers).unwrap()) + Snapshot::new_from_versioned_state(&self.id(), &self.state(&gicr_typers).unwrap()) } fn restore(&mut self, snapshot: Snapshot) -> std::result::Result<(), MigratableError> { let gicr_typers = self.gicr_typers.clone(); - self.set_state(&gicr_typers, &snapshot.to_state(&self.id())?) + self.set_state(&gicr_typers, &snapshot.to_versioned_state(&self.id())?) .map_err(|e| { MigratableError::Restore(anyhow!("Could not restore GICv3 state {:?}", e)) })