Skip to content

Commit 9f7c093

Browse files
committed
chore: upgrade userfaultfd-rs dependency
Upgrade uffd-rs to 0.9.0, which comes with support for UFFDIO_CONTINUE, so we can drop our homegrown version of it. Signed-off-by: Patrick Roy <[email protected]>
1 parent 21b774f commit 9f7c093

File tree

6 files changed

+16
-65
lines changed

6 files changed

+16
-65
lines changed

src/firecracker/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ regex = { version = "1.11.2", default-features = false, features = [
4949

5050
# Dev-Dependencies for uffd examples
5151
serde = { version = "1.0.219", features = ["derive"] }
52-
userfaultfd = "0.9.0"
52+
userfaultfd = { version = "0.9.0", features = ["linux5_13"] }
5353

5454
[lints]
5555
workspace = true

src/firecracker/examples/uffd/fault_all_handler.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,11 @@
1010
mod uffd_utils;
1111

1212
use std::fs::File;
13-
use std::os::fd::AsRawFd;
1413
use std::os::unix::net::UnixListener;
1514

1615
use uffd_utils::{Runtime, UffdHandler};
1716
use utils::time::{ClockType, get_time_us};
1817

19-
use crate::uffd_utils::uffd_continue;
20-
2118
fn main() {
2219
let mut args = std::env::args();
2320
let uffd_sock_path = args.nth(1).expect("No socket path given");
@@ -57,12 +54,10 @@ fn main() {
5754
// TODO: we currently ignore the result as we may attempt to
5855
// populate the page that is already present as we may receive
5956
// multiple minor fault events per page.
60-
let _ = uffd_continue(
61-
uffd_handler.uffd.as_raw_fd(),
62-
addr as _,
63-
uffd_handler.page_size as u64,
64-
)
65-
.inspect_err(|err| println!("Error during uffdio_continue: {:?}", err));
57+
_ = uffd_handler
58+
.uffd
59+
.r#continue(addr, uffd_handler.page_size, true)
60+
.inspect_err(|err| println!("Error during uffdio_continue: {:?}", err));
6661
} else {
6762
fault_all(uffd_handler, addr);
6863
}

src/firecracker/examples/uffd/on_demand_handler.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@
1010
mod uffd_utils;
1111

1212
use std::fs::File;
13-
use std::os::fd::AsRawFd;
1413
use std::os::unix::net::UnixListener;
1514

1615
use uffd_utils::{Runtime, UffdHandler};
1716

18-
use crate::uffd_utils::uffd_continue;
19-
2017
fn main() {
2118
let mut args = std::env::args();
2219
let uffd_sock_path = args.nth(1).expect("No socket path given");
@@ -112,14 +109,12 @@ fn main() {
112109
// TODO: we currently ignore the result as we may attempt to
113110
// populate the page that is already present as we may receive
114111
// multiple minor fault events per page.
115-
let _ = uffd_continue(
116-
uffd_handler.uffd.as_raw_fd(),
117-
addr as _,
118-
uffd_handler.page_size as u64,
119-
)
120-
.inspect_err(|err| {
121-
println!("uffdio_continue error: {:?}", err)
122-
});
112+
let _ = uffd_handler
113+
.uffd
114+
.r#continue(addr.cast(), uffd_handler.page_size, true)
115+
.inspect_err(|err| {
116+
println!("uffdio_continue error: {:?}", err)
117+
});
123118
}
124119
} else if !uffd_handler.serve_pf(addr.cast(), uffd_handler.page_size) {
125120
deferred_events.push(event);

src/firecracker/examples/uffd/uffd_utils.rs

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use std::ffi::c_void;
1818
use std::fs::File;
1919
use std::io::{Read, Write};
2020
use std::num::NonZero;
21-
use std::os::fd::RawFd;
2221
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd};
2322
use std::os::unix::net::UnixStream;
2423
use std::ptr;
@@ -28,47 +27,10 @@ use std::time::Duration;
2827
use serde::{Deserialize, Serialize};
2928
use serde_json::{Deserializer, StreamDeserializer};
3029
use userfaultfd::{Error, Event, Uffd};
31-
use vmm_sys_util::ioctl::ioctl_with_mut_ref;
32-
use vmm_sys_util::ioctl_iowr_nr;
3330
use vmm_sys_util::sock_ctrl_msg::ScmSocket;
3431

3532
use crate::uffd_utils::userfault_bitmap::UserfaultBitmap;
3633

37-
// TODO: remove when UFFDIO_CONTINUE for guest_memfd is available in the crate
38-
#[repr(C)]
39-
struct uffdio_continue {
40-
range: uffdio_range,
41-
mode: u64,
42-
mapped: u64,
43-
}
44-
45-
ioctl_iowr_nr!(UFFDIO_CONTINUE, 0xAA, 0x7, uffdio_continue);
46-
47-
#[repr(C)]
48-
struct uffdio_range {
49-
start: u64,
50-
len: u64,
51-
}
52-
53-
pub fn uffd_continue(uffd: RawFd, fault_addr: u64, len: u64) -> std::io::Result<()> {
54-
let mut cont = uffdio_continue {
55-
range: uffdio_range {
56-
start: fault_addr,
57-
len,
58-
},
59-
mode: 0, // Normal continuation mode
60-
mapped: 0,
61-
};
62-
63-
let ret = unsafe { ioctl_with_mut_ref(&uffd, UFFDIO_CONTINUE(), &mut cont) };
64-
65-
if ret == -1 {
66-
return Err(std::io::Error::last_os_error());
67-
}
68-
69-
Ok(())
70-
}
71-
7234
// This is the same with the one used in src/vmm.
7335
/// This describes the mapping between Firecracker base virtual address and offset in the
7436
/// buffer or file backend for a guest memory region. It is used to tell an external
@@ -440,7 +402,9 @@ impl UffdHandler {
440402
.unwrap()
441403
.reset_addr_range(offset, len);
442404

443-
uffd_continue(self.uffd.as_raw_fd(), dst, len as u64).expect("uffd_continue");
405+
self.uffd
406+
.r#continue(dst as _, len, true)
407+
.expect("uffd_continue");
444408

445409
true
446410
}

src/vmm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ serde_json = "1.0.143"
4848
slab = "0.4.11"
4949
thiserror = "2.0.16"
5050
timerfd = "1.5.0"
51-
userfaultfd = "0.9.0"
51+
userfaultfd = { version = "0.9.0", features = ["linux5_13"] }
5252
utils = { path = "../utils" }
5353
uuid = "1.18.1"
5454
vhost = { version = "0.14.0", features = ["vhost-user-frontend"] }

src/vmm/src/persist.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,6 @@ pub enum GuestMemoryFromUffdError {
497497
HugetlbfsSnapshot,
498498
}
499499

500-
// TODO remove these when the UFFD crate supports minor faults for guest_memfd
501-
const UFFDIO_REGISTER_MODE_MINOR: u64 = 1 << 2;
502-
503500
type GuestMemoryResult =
504501
Result<(Vec<GuestRegionMmap>, Option<Uffd>, Option<UnixStream>), GuestMemoryFromUffdError>;
505502

@@ -535,7 +532,7 @@ pub fn guest_memory_from_uffd(
535532
let mut fds = vec![uffd.as_raw_fd()];
536533

537534
if let Some(gmem) = guest_memfd_fd {
538-
mode = RegisterMode::from_bits_retain(UFFDIO_REGISTER_MODE_MINOR);
535+
mode = RegisterMode::MINOR;
539536
fds.push(gmem);
540537
fds.push(
541538
userfault_bitmap_memfd

0 commit comments

Comments
 (0)