mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
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:
@@ -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<()> {
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user