Skip to content

Commit 107fcb1

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 519a859 commit 107fcb1

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

src/vmm/src/builder.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,7 @@ pub fn build_microvm_for_boot(
256256

257257
Some(InitrdConfig::from_reader(
258258
vmm.vm.guest_memory(),
259-
MaybeBounce::new(
260-
initrd_file.as_fd(),
261-
vm_resources.machine_config.secret_free,
262-
),
259+
MaybeBounce::new(initrd_file.as_fd(), vm_resources.machine_config.secret_free),
263260
u64_to_usize(size),
264261
)?)
265262
}

src/vmm/src/vstate/vm.rs

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

15-
use kvm_bindings::{KVM_MEM_LOG_DIRTY_PAGES, kvm_create_guest_memfd, kvm_userspace_memory_region};
15+
use kvm_bindings::{
16+
KVM_MEM_LOG_DIRTY_PAGES, kvm_create_guest_memfd, kvm_userspace_memory_region,
17+
kvm_userspace_memory_region2,
18+
};
1619
use kvm_ioctls::{Cap, VmFd};
1720
use vmm_sys_util::eventfd::EventFd;
1821

@@ -185,21 +188,37 @@ impl Vm {
185188
0
186189
};
187190

188-
let memory_region = kvm_userspace_memory_region {
191+
let memory_region = kvm_userspace_memory_region2 {
189192
slot: next_slot,
190193
guest_phys_addr: region.start_addr().raw_value(),
191194
memory_size: region.len(),
192195
userspace_addr: region.as_ptr() as u64,
193196
flags,
197+
..Default::default()
194198
};
195199

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

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)?;
202+
if self.fd().check_extension(Cap::UserMemory2) {
203+
// SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
204+
unsafe {
205+
self.fd()
206+
.set_user_memory_region2(memory_region)
207+
.map_err(VmError::SetUserMemoryRegion)?;
208+
}
209+
} else {
210+
// SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
211+
unsafe {
212+
self.fd()
213+
.set_user_memory_region(kvm_userspace_memory_region {
214+
slot: memory_region.slot,
215+
flags: memory_region.flags,
216+
guest_phys_addr: memory_region.guest_phys_addr,
217+
memory_size: memory_region.memory_size,
218+
userspace_addr: memory_region.userspace_addr,
219+
})
220+
.map_err(VmError::SetUserMemoryRegion)?;
221+
}
203222
}
204223

205224
self.common.guest_memory = new_guest_memory;

0 commit comments

Comments
 (0)