Skip to content

Commit 954ddfb

Browse files
committed
switch to using kvm_userspace_region2
Fall back to kvm_user_memory_region in case the 2 version of the struct isnt supported. Signed-off-by: Patrick Roy <roypat@amazon.co.uk>
1 parent ce7d263 commit 954ddfb

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

src/vmm/src/vstate/vm.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::os::fd::FromRawFd;
1212
use std::path::Path;
1313
use std::sync::Arc;
1414

15-
use kvm_bindings::{kvm_create_guest_memfd, kvm_userspace_memory_region, KVM_MEM_LOG_DIRTY_PAGES};
15+
use kvm_bindings::{kvm_create_guest_memfd, kvm_userspace_memory_region, kvm_userspace_memory_region2, KVM_MEM_LOG_DIRTY_PAGES};
1616
use kvm_ioctls::{Cap, VmFd};
1717
use vmm_sys_util::eventfd::EventFd;
1818

@@ -185,21 +185,37 @@ impl Vm {
185185
0
186186
};
187187

188-
let memory_region = kvm_userspace_memory_region {
188+
let memory_region = kvm_userspace_memory_region2 {
189189
slot: next_slot,
190190
guest_phys_addr: region.start_addr().raw_value(),
191191
memory_size: region.len(),
192192
userspace_addr: region.as_ptr() as u64,
193193
flags,
194+
..Default::default()
194195
};
195196

196197
let new_guest_memory = self.common.guest_memory.insert_region(Arc::new(region))?;
197198

198-
// SAFETY: Safe because the fd is a valid KVM file descriptor.
199-
unsafe {
200-
self.fd()
201-
.set_user_memory_region(memory_region)
202-
.map_err(VmError::SetUserMemoryRegion)?;
199+
if self.fd().check_extension(Cap::UserMemory2) {
200+
// SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
201+
unsafe {
202+
self.fd()
203+
.set_user_memory_region2(memory_region)
204+
.map_err(VmError::SetUserMemoryRegion)?;
205+
}
206+
} else {
207+
// SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
208+
unsafe {
209+
self.fd()
210+
.set_user_memory_region(kvm_userspace_memory_region {
211+
slot: memory_region.slot,
212+
flags: memory_region.flags,
213+
guest_phys_addr: memory_region.guest_phys_addr,
214+
memory_size: memory_region.memory_size,
215+
userspace_addr: memory_region.userspace_addr,
216+
})
217+
.map_err(VmError::SetUserMemoryRegion)?;
218+
}
203219
}
204220

205221
self.common.guest_memory = new_guest_memory;

0 commit comments

Comments
 (0)