Skip to content

Commit 1f3bef0

Browse files
committed
add Vm::create_guest_memfd
Add a utility function for creating a guest_memfd and wrapping it into a `File` object. Signed-off-by: Patrick Roy <roypat@amazon.co.uk>
1 parent 71e33a0 commit 1f3bef0

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

src/vmm/src/vstate/vm.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66
// found in the THIRD-PARTY file.
77

88
use std::collections::HashMap;
9-
use std::fs::OpenOptions;
9+
use std::fs::{File, OpenOptions};
1010
use std::io::Write;
11+
use std::os::fd::FromRawFd;
1112
use std::path::Path;
1213
use std::sync::Arc;
1314

14-
use kvm_ioctls::VmFd;
15+
use kvm_bindings::kvm_create_guest_memfd;
16+
use kvm_ioctls::{Cap, VmFd};
1517
use userfaultfd::{FeatureFlags, Uffd, UffdBuilder};
1618
use vmm_sys_util::eventfd::EventFd;
1719

20+
use crate::arch::host_page_size;
1821
pub use crate::arch::{ArchVm as Vm, ArchVmError, VmState};
1922
use crate::logger::info;
2023
use crate::persist::{CreateSnapshotError, GuestRegionUffdMapping};
@@ -58,6 +61,10 @@ pub enum VmError {
5861
NotEnoughMemorySlots,
5962
/// Memory Error: {0}
6063
VmMemory(#[from] vm_memory::Error),
64+
/// Failure to create guest_memfd: {0}
65+
GuestMemfd(kvm_ioctls::Error),
66+
/// guest_memfd is not supported on this host kernel.
67+
GuestMemfdNotSupported,
6168
}
6269

6370
/// Contains Vm functions that are usable across CPU architectures
@@ -128,6 +135,32 @@ impl Vm {
128135
Ok((vcpus, exit_evt))
129136
}
130137

138+
/// Create a guest_memfd of the specified size
139+
pub fn create_guest_memfd(&self, size: usize, flags: u64) -> Result<File, VmError> {
140+
assert_eq!(
141+
size & (host_page_size() - 1),
142+
0,
143+
"guest_memfd size must be page aligned"
144+
);
145+
146+
if !self.fd().check_extension(Cap::GuestMemfd) {
147+
return Err(VmError::GuestMemfdNotSupported);
148+
}
149+
150+
let kvm_gmem = kvm_create_guest_memfd {
151+
size: size as u64,
152+
flags,
153+
..Default::default()
154+
};
155+
156+
self.fd()
157+
.create_guest_memfd(kvm_gmem)
158+
.map_err(VmError::GuestMemfd)
159+
// SAFETY: We know rawfd is a valid fd because create_guest_memfd didn't return an
160+
// error.
161+
.map(|rawfd| unsafe { File::from_raw_fd(rawfd) })
162+
}
163+
131164
/// Register a list of new memory regions to this [`Vm`].
132165
pub fn register_memory_regions(
133166
&mut self,

0 commit comments

Comments
 (0)