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 <liuwe@microsoft.com>
This commit is contained in:
Wei Liu
2020-07-04 11:38:17 +00:00
committed by Samuel Ortiz
parent 8d97d628c3
commit cfa758fbb1
5 changed files with 49 additions and 25 deletions

View File

@@ -172,6 +172,25 @@ impl vm::Vm for KvmVm {
.map_err(|e| vm::HypervisorVmError::SetGsiRouting(e.into())) .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. /// Creates/modifies a guest physical memory slot.
/// ///
fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> { fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> {

View File

@@ -143,6 +143,15 @@ pub trait Vm: Send + Sync {
fn unregister_ioevent(&self, fd: &EventFd, addr: &IoEventAddress) -> Result<()>; fn unregister_ioevent(&self, fd: &EventFd, addr: &IoEventAddress) -> Result<()>;
/// Sets the GSI routing table entries, overwriting any previously set /// Sets the GSI routing table entries, overwriting any previously set
fn set_gsi_routing(&self, irq_routing: &IrqRouting) -> Result<()>; 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. /// Creates/modifies a guest physical memory slot.
fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> Result<()>; fn set_user_memory_region(&self, user_memory_region: MemoryRegion) -> Result<()>;
/// Creates an emulated device in the kernel. /// Creates an emulated device in the kernel.

View File

@@ -588,13 +588,13 @@ impl DeviceRelocation for AddressManager {
if let Some(mut shm_regions) = virtio_dev.get_shm_regions() { if let Some(mut shm_regions) = virtio_dev.get_shm_regions() {
if shm_regions.addr.raw_value() == old_base { if shm_regions.addr.raw_value() == old_base {
// Remove old region from KVM by passing a size of 0. // Remove old region from KVM by passing a size of 0.
let mut mem_region = hypervisor::MemoryRegion { let mut mem_region = self.vm.make_user_memory_region(
slot: shm_regions.mem_slot, shm_regions.mem_slot,
guest_phys_addr: old_base, old_base,
memory_size: 0, 0,
userspace_addr: shm_regions.host_addr, shm_regions.host_addr,
flags: 0, false,
}; );
self.vm.set_user_memory_region(mem_region).map_err(|e| { self.vm.set_user_memory_region(mem_region).map_err(|e| {
io::Error::new( io::Error::new(

View File

@@ -676,17 +676,13 @@ impl MemoryManager {
readonly: bool, readonly: bool,
) -> Result<u32, Error> { ) -> Result<u32, Error> {
let slot = self.allocate_memory_slot(); let slot = self.allocate_memory_slot();
let mem_region = hypervisor::MemoryRegion { let mem_region = self.vm.make_user_memory_region(
slot, slot,
guest_phys_addr, guest_phys_addr,
memory_size, memory_size,
userspace_addr, userspace_addr,
flags: if readonly { readonly,
hypervisor::kvm::KVM_MEM_READONLY );
} else {
0
},
};
self.vm self.vm
.set_user_memory_region(mem_region) .set_user_memory_region(mem_region)
@@ -733,13 +729,13 @@ impl MemoryManager {
mergeable: bool, mergeable: bool,
slot: u32, slot: u32,
) -> Result<(), Error> { ) -> Result<(), Error> {
let mem_region = hypervisor::MemoryRegion { let mem_region = self.vm.make_user_memory_region(
slot, slot,
guest_phys_addr, guest_phys_addr,
memory_size: 0, 0, /* memory_size -- using 0 removes this slot */
userspace_addr, userspace_addr,
flags: 0, false, /* readonly -- don't care */
}; );
self.vm self.vm
.set_user_memory_region(mem_region) .set_user_memory_region(mem_region)

View File

@@ -1451,13 +1451,13 @@ pub fn test_vm() {
let vm = hv.create_vm().expect("new VM creation failed"); let vm = hv.create_vm().expect("new VM creation failed");
mem.with_regions(|index, region| { mem.with_regions(|index, region| {
let mem_region = hypervisor::MemoryRegion { let mem_region = vm.make_user_memory_region(
slot: index as u32, index as u32,
guest_phys_addr: region.start_addr().raw_value(), region.start_addr().raw_value(),
memory_size: region.len() as u64, region.len() as u64,
userspace_addr: region.as_ptr() as u64, region.as_ptr() as u64,
flags: 0, false,
}; );
vm.set_user_memory_region(mem_region) vm.set_user_memory_region(mem_region)
}) })