Skip to content

Commit 043680c

Browse files
committed
vmm/vstate: guest_memfd, update SET_USER_MEMORY_REGION API
Signed-off-by: Tyler Fanelli <[email protected]>
1 parent 321faae commit 043680c

File tree

1 file changed

+41
-8
lines changed

1 file changed

+41
-8
lines changed

src/vmm/src/linux/vstate.rs

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@ use kvm_bindings::{
4040
kvm_clock_data, kvm_debugregs, kvm_irqchip, kvm_lapic_state, kvm_mp_state, kvm_pit_config,
4141
kvm_pit_state2, kvm_regs, kvm_sregs, kvm_vcpu_events, kvm_xcrs, kvm_xsave, CpuId, MsrList,
4242
Msrs, KVM_CLOCK_TSC_STABLE, KVM_IRQCHIP_IOAPIC, KVM_IRQCHIP_PIC_MASTER, KVM_IRQCHIP_PIC_SLAVE,
43-
KVM_MAX_CPUID_ENTRIES, KVM_PIT_SPEAKER_DUMMY,
43+
KVM_MAX_CPUID_ENTRIES, KVM_MEMORY_ATTRIBUTE_PRIVATE, KVM_PIT_SPEAKER_DUMMY,
44+
};
45+
use kvm_bindings::{
46+
kvm_create_guest_memfd, kvm_memory_attributes, kvm_userspace_memory_region2, KVM_API_VERSION,
47+
KVM_MEM_GUEST_MEMFD,
4448
};
45-
use kvm_bindings::{kvm_userspace_memory_region, KVM_API_VERSION};
4649
use kvm_ioctls::*;
4750
use utils::eventfd::EventFd;
4851
use utils::signal::{register_signal_handler, sigrtmin, Killable};
@@ -103,7 +106,9 @@ pub enum Error {
103106
/// Error setting up the global interrupt controller.
104107
SetupGIC(arch::aarch64::gic::Error),
105108
/// Cannot set the memory regions.
106-
SetUserMemoryRegion(kvm_ioctls::Error),
109+
SetUserMemoryRegion2(kvm_ioctls::Error),
110+
/// Unable to set memory region attributes.
111+
SetMemoryAttributes(kvm_ioctls::Error),
107112
/// Error creating memory map for SHM region.
108113
ShmMmap(io::Error),
109114
#[cfg(feature = "amd-sev")]
@@ -255,7 +260,8 @@ impl Display for Error {
255260
f,
256261
"Cannot set the local interruption due to bad configuration: {e:?}"
257262
),
258-
SetUserMemoryRegion(e) => write!(f, "Cannot set the memory regions: {e}"),
263+
SetUserMemoryRegion2(e) => write!(f, "Cannot set the memory regions: {e}"),
264+
SetMemoryAttributes(e) => write!(f, "Unable to set memory attributes: {e}"),
259265
ShmMmap(e) => write!(f, "Error creating memory map for SHM region: {e}"),
260266
#[cfg(feature = "tee")]
261267
SnpSecVirtInit(e) => write!(
@@ -526,20 +532,47 @@ impl Vm {
526532
// It's safe to unwrap because the guest address is valid.
527533
let host_addr = guest_mem.get_host_address(region.start_addr()).unwrap();
528534
debug!("Guest memory starts at {:x?}", host_addr);
529-
let memory_region = kvm_userspace_memory_region {
535+
536+
let guest_memfd = self
537+
.fd
538+
.create_guest_memfd(kvm_create_guest_memfd {
539+
size: region.size() as u64,
540+
flags: 0,
541+
reserved: [0; 6],
542+
})
543+
.unwrap();
544+
545+
let memory_region = kvm_userspace_memory_region2 {
530546
slot: self.next_mem_slot,
547+
flags: KVM_MEM_GUEST_MEMFD,
531548
guest_phys_addr: region.start_addr().raw_value(),
532549
memory_size: region.len(),
533550
userspace_addr: host_addr as u64,
534-
flags: 0,
551+
guest_memfd_offset: 0,
552+
guest_memfd: guest_memfd as u32,
553+
pad1: 0,
554+
pad2: [0; 14],
535555
};
556+
536557
// Safe because we mapped the memory region, we made sure that the regions
537558
// are not overlapping.
538559
unsafe {
539560
self.fd
540-
.set_user_memory_region(memory_region)
541-
.map_err(Error::SetUserMemoryRegion)?;
561+
.set_user_memory_region2(memory_region)
562+
.map_err(Error::SetUserMemoryRegion2)?;
542563
};
564+
565+
let attr = kvm_memory_attributes {
566+
address: region.start_addr().raw_value(),
567+
size: region.len(),
568+
attributes: KVM_MEMORY_ATTRIBUTE_PRIVATE as u64,
569+
flags: 0,
570+
};
571+
572+
self.fd
573+
.set_memory_attributes(attr)
574+
.map_err(Error::SetMemoryAttributes)?;
575+
543576
self.next_mem_slot += 1;
544577
}
545578

0 commit comments

Comments
 (0)