diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index a968e6df1..f94dff5e2 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -70,7 +70,8 @@ use std::mem; pub use kvm_bindings; pub use kvm_bindings::{ kvm_create_device, kvm_device_type_KVM_DEV_TYPE_VFIO, kvm_irq_routing, kvm_irq_routing_entry, - kvm_userspace_memory_region, KVM_IRQ_ROUTING_MSI, KVM_MEM_READONLY, KVM_MSI_VALID_DEVID, + kvm_userspace_memory_region, KVM_IRQ_ROUTING_MSI, KVM_MEM_LOG_DIRTY_PAGES, KVM_MEM_READONLY, + KVM_MSI_VALID_DEVID, }; pub use kvm_ioctls; pub use kvm_ioctls::{Cap, Kvm}; @@ -255,13 +256,19 @@ impl vm::Vm for KvmVm { memory_size: u64, userspace_addr: u64, readonly: bool, + log_dirty_pages: bool, ) -> MemoryRegion { MemoryRegion { slot, guest_phys_addr, memory_size, userspace_addr, - flags: if readonly { KVM_MEM_READONLY } else { 0 }, + flags: if readonly { KVM_MEM_READONLY } else { 0 } + | if log_dirty_pages { + KVM_MEM_LOG_DIRTY_PAGES + } else { + 0 + }, } } /// diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 467a23a05..072ee6edd 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -189,6 +189,7 @@ pub trait Vm: Send + Sync { memory_size: u64, userspace_addr: u64, readonly: bool, + log_dirty_pages: bool, ) -> MemoryRegion; /// Creates/modifies a guest physical memory slot. fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> Result<()>; diff --git a/pci/src/vfio.rs b/pci/src/vfio.rs index 5e18660c3..9b84f2950 100644 --- a/pci/src/vfio.rs +++ b/pci/src/vfio.rs @@ -561,6 +561,7 @@ impl VfioPciDevice { mmap_size as u64, host_addr as u64, false, + false, ); vm.set_user_memory_region(mem_region) @@ -590,6 +591,7 @@ impl VfioPciDevice { 0, host_addr as u64, false, + false, ); if let Err(e) = self.vm.set_user_memory_region(r) { @@ -1012,6 +1014,7 @@ impl PciDevice for VfioPciDevice { 0, host_addr as u64, false, + false, ); self.vm @@ -1025,6 +1028,7 @@ impl PciDevice for VfioPciDevice { mmap_size as u64, host_addr as u64, false, + false, ); self.vm diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 9c2634458..9b8dcc8a0 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -612,6 +612,7 @@ impl DeviceRelocation for AddressManager { 0, shm_regions.host_addr, false, + false, ); self.vm.set_user_memory_region(mem_region).map_err(|e| { @@ -628,6 +629,7 @@ impl DeviceRelocation for AddressManager { shm_regions.len, shm_regions.host_addr, false, + false, ); self.vm.set_user_memory_region(mem_region).map_err(|e| { diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index 2f94e12c7..28e966380 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -1115,6 +1115,7 @@ impl MemoryManager { memory_size, userspace_addr, readonly, + false, ); self.vm @@ -1168,6 +1169,7 @@ impl MemoryManager { 0, /* memory_size -- using 0 removes this slot */ userspace_addr, false, /* readonly -- don't care */ + false, /* log dirty */ ); self.vm diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 2d45d95cf..79d44b034 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -2131,6 +2131,7 @@ pub fn test_vm() { region.len() as u64, region.as_ptr() as u64, false, + false, ); vm.set_user_memory_region(mem_region)