MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / create

Function create

vmm/src/uffd.rs:96–129  ·  view source on GitHub ↗

Create a userfaultfd file descriptor and perform the API handshake. Prefers `/dev/userfaultfd` (no capability/sysctl requirements, just file permissions) and falls back to the `userfaultfd(2)` syscall.

(required_features: u64)

Source from the content-addressed store, hash-verified

94/// Prefers `/dev/userfaultfd` (no capability/sysctl requirements, just file
95/// permissions) and falls back to the `userfaultfd(2)` syscall.
96pub(crate) fn create(required_features: u64) -> Result<OwnedFd, Error> {
97 let fd = match try_dev_userfaultfd() {
98 Ok(fd) => fd,
99 Err(_) => {
100 // SAFETY: `userfaultfd` syscall with O_CLOEXEC | O_NONBLOCK flags.
101 let raw =
102 unsafe { libc::syscall(libc::SYS_userfaultfd, libc::O_CLOEXEC | libc::O_NONBLOCK) };
103 if raw < 0 {
104 return Err(Error::last_os_error());
105 }
106 // SAFETY: the syscall returned a valid fd above.
107 unsafe { OwnedFd::from_raw_fd(raw as RawFd) }
108 }
109 };
110
111 let mut api = UffdioApi {
112 api: userfaultfd::UFFD_API,
113 features: required_features,
114 ioctls: 0,
115 };
116 // SAFETY: `api` is a valid, correctly-sized struct for this ioctl.
117 let ret = unsafe {
118 libc::ioctl(
119 fd.as_raw_fd(),
120 userfaultfd::UFFDIO_API as libc::Ioctl,
121 &mut api,
122 )
123 };
124 if ret < 0 {
125 return Err(Error::last_os_error());
126 }
127
128 Ok(fd)
129}
130
131/// Register a memory range for missing-page fault handling.
132pub(crate) fn register(fd: BorrowedFd<'_>, addr: u64, len: u64) -> Result<u64, Error> {

Callers 15

start_vmmFunction · 0.85
newMethod · 0.85
restore_by_uffdMethod · 0.85
uffd_handler_loopMethod · 0.85
newMethod · 0.85
wait_vm_boot_fromMethod · 0.85
prepare_cloudinitMethod · 0.85
prepare_filesMethod · 0.85
endMethod · 0.85
newMethod · 0.85

Calls 2

try_dev_userfaultfdFunction · 0.85
as_raw_fdMethod · 0.45

Tested by 1