diff --git a/.buildkite/common.py b/.buildkite/common.py index 1ccd8b306e2..d8a2d2bc994 100644 --- a/.buildkite/common.py +++ b/.buildkite/common.py @@ -126,7 +126,7 @@ def run_all_tests(changed_files): return not changed_files or any( x.suffix != ".md" and not (x.parts[0] == ".github" and x.suffix == ".yml") - and x.parts[1] != "hiding_ci" + and (len(x.parts) < 2 or x.parts[1] != "hiding_ci") for x in changed_files ) diff --git a/Cargo.lock b/Cargo.lock index 7e0eaddf53d..2c1a943c068 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,7 +136,7 @@ version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2608e5a7965cc9d58c56234d346c9c89b824c4c8652b6f047b3bd0a777c0644f" dependencies = [ - "bindgen 0.69.5", + "bindgen", "cc", "cmake", "dunce", @@ -162,7 +162,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" dependencies = [ - "bindgen 0.69.5", + "bindgen", "cc", "cmake", "dunce", @@ -195,26 +195,6 @@ dependencies = [ "virtue", ] -[[package]] -name = "bindgen" -version = "0.68.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", -] - [[package]] name = "bindgen" version = "0.69.5" @@ -1056,12 +1036,6 @@ dependencies = [ "vmm-sys-util", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "polyval" version = "0.6.2" @@ -1537,9 +1511,9 @@ checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" [[package]] name = "userfaultfd" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d8b176d4d3e420685e964f87c25df5fdd5b26d7eb0d0e7c892d771f5b81035" +checksum = "5b3a8a0cb358f7d1b7ee9b6784be122b6f51248a6d9e214d555beb9b44c72aea" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -1551,11 +1525,11 @@ dependencies = [ [[package]] name = "userfaultfd-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75595d2a62b7db16bd47f5a1ce14e1fe05ccbe27d6c96721a958e0a027cad41" +checksum = "dc91d95a797a81604af22946d0e86656f27feb0b9665c60665cf3554df12d1a8" dependencies = [ - "bindgen 0.68.1", + "bindgen", "cc", "cfg-if", ] diff --git a/src/firecracker/Cargo.toml b/src/firecracker/Cargo.toml index d003df79728..863d83486a8 100644 --- a/src/firecracker/Cargo.toml +++ b/src/firecracker/Cargo.toml @@ -49,7 +49,7 @@ regex = { version = "1.11.1", default-features = false, features = [ # Dev-Dependencies for uffd examples serde = { version = "1.0.219", features = ["derive"] } -userfaultfd = "0.8.1" +userfaultfd = { version = "0.9.0", features = ["linux5_13"] } [lints] workspace = true diff --git a/src/firecracker/examples/uffd/fault_all_handler.rs b/src/firecracker/examples/uffd/fault_all_handler.rs index 90c25e6b5f9..9aadc42670e 100644 --- a/src/firecracker/examples/uffd/fault_all_handler.rs +++ b/src/firecracker/examples/uffd/fault_all_handler.rs @@ -10,14 +10,11 @@ mod uffd_utils; use std::fs::File; -use std::os::fd::AsRawFd; use std::os::unix::net::UnixListener; use uffd_utils::{Runtime, UffdHandler}; use utils::time::{ClockType, get_time_us}; -use crate::uffd_utils::uffd_continue; - fn main() { let mut args = std::env::args(); let uffd_sock_path = args.nth(1).expect("No socket path given"); @@ -57,12 +54,10 @@ fn main() { // TODO: we currently ignore the result as we may attempt to // populate the page that is already present as we may receive // multiple minor fault events per page. - let _ = uffd_continue( - uffd_handler.uffd.as_raw_fd(), - addr as _, - uffd_handler.page_size as u64, - ) - .inspect_err(|err| println!("Error during uffdio_continue: {:?}", err)); + _ = uffd_handler + .uffd + .r#continue(addr, uffd_handler.page_size, true) + .inspect_err(|err| println!("Error during uffdio_continue: {:?}", err)); } else { fault_all(uffd_handler, addr); } diff --git a/src/firecracker/examples/uffd/on_demand_handler.rs b/src/firecracker/examples/uffd/on_demand_handler.rs index 755b29ceb4a..3b8bc0a9288 100644 --- a/src/firecracker/examples/uffd/on_demand_handler.rs +++ b/src/firecracker/examples/uffd/on_demand_handler.rs @@ -10,13 +10,10 @@ mod uffd_utils; use std::fs::File; -use std::os::fd::AsRawFd; use std::os::unix::net::UnixListener; use uffd_utils::{Runtime, UffdHandler}; -use crate::uffd_utils::uffd_continue; - fn main() { let mut args = std::env::args(); let uffd_sock_path = args.nth(1).expect("No socket path given"); @@ -112,14 +109,12 @@ fn main() { // TODO: we currently ignore the result as we may attempt to // populate the page that is already present as we may receive // multiple minor fault events per page. - let _ = uffd_continue( - uffd_handler.uffd.as_raw_fd(), - addr as _, - uffd_handler.page_size as u64, - ) - .inspect_err(|err| { - println!("uffdio_continue error: {:?}", err) - }); + let _ = uffd_handler + .uffd + .r#continue(addr.cast(), uffd_handler.page_size, true) + .inspect_err(|err| { + println!("uffdio_continue error: {:?}", err) + }); } } else if !uffd_handler.serve_pf(addr.cast(), uffd_handler.page_size) { deferred_events.push(event); diff --git a/src/firecracker/examples/uffd/uffd_utils.rs b/src/firecracker/examples/uffd/uffd_utils.rs index 3c01651201f..480e09e3ad7 100644 --- a/src/firecracker/examples/uffd/uffd_utils.rs +++ b/src/firecracker/examples/uffd/uffd_utils.rs @@ -18,7 +18,6 @@ use std::ffi::c_void; use std::fs::File; use std::io::{Read, Write}; use std::num::NonZero; -use std::os::fd::RawFd; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; use std::os::unix::net::UnixStream; use std::ptr; @@ -28,47 +27,10 @@ use std::time::Duration; use serde::{Deserialize, Serialize}; use serde_json::{Deserializer, StreamDeserializer}; use userfaultfd::{Error, Event, Uffd}; -use vmm_sys_util::ioctl::ioctl_with_mut_ref; -use vmm_sys_util::ioctl_iowr_nr; use vmm_sys_util::sock_ctrl_msg::ScmSocket; use crate::uffd_utils::userfault_bitmap::UserfaultBitmap; -// TODO: remove when UFFDIO_CONTINUE for guest_memfd is available in the crate -#[repr(C)] -struct uffdio_continue { - range: uffdio_range, - mode: u64, - mapped: u64, -} - -ioctl_iowr_nr!(UFFDIO_CONTINUE, 0xAA, 0x7, uffdio_continue); - -#[repr(C)] -struct uffdio_range { - start: u64, - len: u64, -} - -pub fn uffd_continue(uffd: RawFd, fault_addr: u64, len: u64) -> std::io::Result<()> { - let mut cont = uffdio_continue { - range: uffdio_range { - start: fault_addr, - len, - }, - mode: 0, // Normal continuation mode - mapped: 0, - }; - - let ret = unsafe { ioctl_with_mut_ref(&uffd, UFFDIO_CONTINUE(), &mut cont) }; - - if ret == -1 { - return Err(std::io::Error::last_os_error()); - } - - Ok(()) -} - // This is the same with the one used in src/vmm. /// This describes the mapping between Firecracker base virtual address and offset in the /// buffer or file backend for a guest memory region. It is used to tell an external @@ -440,7 +402,9 @@ impl UffdHandler { .unwrap() .reset_addr_range(offset, len); - uffd_continue(self.uffd.as_raw_fd(), dst, len as u64).expect("uffd_continue"); + self.uffd + .r#continue(dst as _, len, true) + .expect("uffd_continue"); true } diff --git a/src/vmm/Cargo.toml b/src/vmm/Cargo.toml index d4aee069c7e..bf786dd1b8f 100644 --- a/src/vmm/Cargo.toml +++ b/src/vmm/Cargo.toml @@ -48,7 +48,7 @@ serde_json = "1.0.142" slab = "0.4.11" thiserror = "2.0.14" timerfd = "1.5.0" -userfaultfd = "0.8.1" +userfaultfd = { version = "0.9.0", features = ["linux5_13"] } utils = { path = "../utils" } uuid = "1.18.0" vhost = { version = "0.14.0", features = ["vhost-user-frontend"] } diff --git a/src/vmm/src/persist.rs b/src/vmm/src/persist.rs index 94e11c91478..efa6f7f5016 100644 --- a/src/vmm/src/persist.rs +++ b/src/vmm/src/persist.rs @@ -504,9 +504,6 @@ pub enum GuestMemoryFromUffdError { HugetlbfsSnapshot, } -// TODO remove these when the UFFD crate supports minor faults for guest_memfd -const UFFDIO_REGISTER_MODE_MINOR: u64 = 1 << 2; - type GuestMemoryResult = Result<(Vec, Option, Option), GuestMemoryFromUffdError>; @@ -542,7 +539,7 @@ pub fn guest_memory_from_uffd( let mut fds = vec![uffd.as_raw_fd()]; if let Some(gmem) = guest_memfd_fd { - mode = RegisterMode::from_bits_retain(UFFDIO_REGISTER_MODE_MINOR); + mode = RegisterMode::MINOR; fds.push(gmem); fds.push( userfault_bitmap_memfd