From cfa758fbb113c77fb65ed41cec48a60efbbd0ca1 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Sat, 4 Jul 2020 11:38:17 +0000 Subject: [PATCH] vmm, hypervisor: introduce and use make_user_memory_region This removes the last KVM-ism from memory_manager. Also make use of that method in other places. Signed-off-by: Wei Liu --- hypervisor/src/kvm/mod.rs | 19 +++++++++++++++++++ hypervisor/src/vm.rs | 9 +++++++++ vmm/src/device_manager.rs | 14 +++++++------- vmm/src/memory_manager.rs | 18 +++++++----------- vmm/src/vm.rs | 14 +++++++------- 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 49c2a21a9..278f69004 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -172,6 +172,25 @@ impl vm::Vm for KvmVm { .map_err(|e| vm::HypervisorVmError::SetGsiRouting(e.into())) } /// + /// Creates a memory region structure that can be used with set_user_memory_region + /// + fn make_user_memory_region( + &self, + slot: u32, + guest_phys_addr: u64, + memory_size: u64, + userspace_addr: u64, + readonly: bool, + ) -> MemoryRegion { + MemoryRegion { + slot, + guest_phys_addr, + memory_size, + userspace_addr, + flags: if readonly { KVM_MEM_READONLY } else { 0 }, + } + } + /// /// Creates/modifies a guest physical memory slot. /// fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> { diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 1c1f31d51..0a5b3fd22 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -143,6 +143,15 @@ pub trait Vm: Send + Sync { fn unregister_ioevent(&self, fd: &EventFd, addr: &IoEventAddress) -> Result<()>; /// Sets the GSI routing table entries, overwriting any previously set fn set_gsi_routing(&self, irq_routing: &IrqRouting) -> Result<()>; + /// Creates a memory region structure that can be used with set_user_memory_region + fn make_user_memory_region( + &self, + slot: u32, + guest_phys_addr: u64, + memory_size: u64, + userspace_addr: u64, + readonly: bool, + ) -> MemoryRegion; /// Creates/modifies a guest physical memory slot. fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> Result<()>; /// Creates an emulated device in the kernel. diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 9619631dc..f0f99c63c 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -588,13 +588,13 @@ impl DeviceRelocation for AddressManager { if let Some(mut shm_regions) = virtio_dev.get_shm_regions() { if shm_regions.addr.raw_value() == old_base { // Remove old region from KVM by passing a size of 0. - let mut mem_region = hypervisor::MemoryRegion { - slot: shm_regions.mem_slot, - guest_phys_addr: old_base, - memory_size: 0, - userspace_addr: shm_regions.host_addr, - flags: 0, - }; + let mut mem_region = self.vm.make_user_memory_region( + shm_regions.mem_slot, + old_base, + 0, + shm_regions.host_addr, + false, + ); self.vm.set_user_memory_region(mem_region).map_err(|e| { io::Error::new( diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index fdab22bb8..dddeb13d6 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -676,17 +676,13 @@ impl MemoryManager { readonly: bool, ) -> Result { let slot = self.allocate_memory_slot(); - let mem_region = hypervisor::MemoryRegion { + let mem_region = self.vm.make_user_memory_region( slot, guest_phys_addr, memory_size, userspace_addr, - flags: if readonly { - hypervisor::kvm::KVM_MEM_READONLY - } else { - 0 - }, - }; + readonly, + ); self.vm .set_user_memory_region(mem_region) @@ -733,13 +729,13 @@ impl MemoryManager { mergeable: bool, slot: u32, ) -> Result<(), Error> { - let mem_region = hypervisor::MemoryRegion { + let mem_region = self.vm.make_user_memory_region( slot, guest_phys_addr, - memory_size: 0, + 0, /* memory_size -- using 0 removes this slot */ userspace_addr, - flags: 0, - }; + false, /* readonly -- don't care */ + ); self.vm .set_user_memory_region(mem_region) diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index da1ca5123..b8833d9ed 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -1451,13 +1451,13 @@ pub fn test_vm() { let vm = hv.create_vm().expect("new VM creation failed"); mem.with_regions(|index, region| { - let mem_region = hypervisor::MemoryRegion { - slot: index as u32, - guest_phys_addr: region.start_addr().raw_value(), - memory_size: region.len() as u64, - userspace_addr: region.as_ptr() as u64, - flags: 0, - }; + let mem_region = vm.make_user_memory_region( + index as u32, + region.start_addr().raw_value(), + region.len() as u64, + region.as_ptr() as u64, + false, + ); vm.set_user_memory_region(mem_region) })