From 041724a7cf970f6c95d1174e570e039e38823af4 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Wed, 11 Nov 2020 18:32:03 +0000 Subject: [PATCH] hypervisor: Add ability to get dirty logged pages Return a bitmap of pages that have been dirtied (written to) since it was last called. Signed-off-by: Rob Bradford --- hypervisor/src/kvm/mod.rs | 8 ++++++++ hypervisor/src/vm.rs | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index f94dff5e2..8d60da1d8 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -369,6 +369,14 @@ impl vm::Vm for KvmVm { self.vmmops.store(Some(Arc::new(vmmops))); Ok(()) } + /// + /// Get dirty pages bitmap (one bit per page) + /// + fn get_dirty_log(&self, slot: u32, memory_size: u64) -> vm::Result> { + self.fd + .get_dirty_log(slot, memory_size as usize) + .map_err(|e| vm::HypervisorVmError::GetDirtyLog(e.into())) + } } /// Wrapper over KVM system ioctls. pub struct KvmHypervisor { diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 072ee6edd..9184fbea9 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -147,6 +147,11 @@ pub enum HypervisorVmError { /// #[error("Failed to write to IO Bus: {0}")] IoBusWrite(#[source] anyhow::Error), + /// + /// Get dirty log error + /// + #[error("Failed to get dirty log: {0}")] + GetDirtyLog(#[source] anyhow::Error), } /// /// Result type for returning from a function @@ -217,6 +222,8 @@ pub trait Vm: Send + Sync { fn set_state(&self, state: VmState) -> Result<()>; /// Set VmmOps interface fn set_vmmops(&self, vmmops: Box) -> Result<()>; + /// Get dirty pages bitmap + fn get_dirty_log(&self, slot: u32, memory_size: u64) -> Result>; } pub trait VmmOps: Send + Sync {