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 <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2020-11-11 18:32:03 +00:00
parent 8baa244ec1
commit 041724a7cf
2 changed files with 15 additions and 0 deletions

View File

@ -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<Vec<u64>> {
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 {

View File

@ -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<dyn VmmOps>) -> Result<()>;
/// Get dirty pages bitmap
fn get_dirty_log(&self, slot: u32, memory_size: u64) -> Result<Vec<u64>>;
}
pub trait VmmOps: Send + Sync {