Skip to content

Commit 6417786

Browse files
committed
example(uffd): handle EAGAIN from UFFDIO_ZEROPAGE
If a remove event is pending to be read from the uffd, then all uffdio ioctls return EAGAIN. We correctly handle this for COPY, but did not for ZEROPAGE. Also handle this for zeropage to fix spurious test failures. See commit e92a7ff ("fix(example): correctly handle `remove` events in uffd exammple") for more details. Signed-off-by: Patrick Roy <[email protected]>
1 parent 0e1eb81 commit 6417786

File tree

1 file changed

+12
-15
lines changed

1 file changed

+12
-15
lines changed

src/firecracker/examples/uffd/uffd_utils.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,12 @@ impl UffdHandler {
144144
let fault_pfn = fault_page_addr / self.page_size as u64;
145145

146146
if self.removed_pages.contains(&fault_pfn) {
147-
self.zero_out(fault_page_addr);
148-
return true;
149-
} else {
150-
for region in self.mem_regions.iter() {
151-
if region.contains(fault_page_addr) {
152-
return self.populate_from_file(region, fault_page_addr, len);
153-
}
147+
return self.zero_out(fault_page_addr);
148+
}
149+
150+
for region in self.mem_regions.iter() {
151+
if region.contains(fault_page_addr) {
152+
return self.populate_from_file(region, fault_page_addr, len);
154153
}
155154
}
156155

@@ -190,14 +189,12 @@ impl UffdHandler {
190189
true
191190
}
192191

193-
fn zero_out(&mut self, addr: u64) {
194-
let ret = unsafe {
195-
self.uffd
196-
.zeropage(addr as *mut _, self.page_size, true)
197-
.expect("Uffd zeropage failed")
198-
};
199-
// Make sure the UFFD zeroed out some bytes.
200-
assert!(ret > 0);
192+
fn zero_out(&mut self, addr: u64) -> bool {
193+
match unsafe { self.uffd.zeropage(addr as *mut _, self.page_size, true) } {
194+
Ok(r) if r >= 0 => true,
195+
Err(Error::ZeropageFailed(error)) if error as i32 == libc::EAGAIN => false,
196+
r => panic!("Unexpected zeropage result: {:?}", r),
197+
}
201198
}
202199
}
203200

0 commit comments

Comments
 (0)