|
9 | 9 | dead_code
|
10 | 10 | )]
|
11 | 11 |
|
12 |
| -use std::collections::{HashMap, HashSet}; |
| 12 | +use std::collections::HashMap; |
13 | 13 | use std::ffi::c_void;
|
14 | 14 | use std::fs::File;
|
15 | 15 | use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd};
|
@@ -54,7 +54,6 @@ pub struct UffdHandler {
|
54 | 54 | pub page_size: usize,
|
55 | 55 | backing_buffer: *const u8,
|
56 | 56 | uffd: Uffd,
|
57 |
| - removed_pages: HashSet<u64>, |
58 | 57 | }
|
59 | 58 |
|
60 | 59 | impl UffdHandler {
|
@@ -125,32 +124,25 @@ impl UffdHandler {
|
125 | 124 | page_size,
|
126 | 125 | backing_buffer,
|
127 | 126 | uffd,
|
128 |
| - removed_pages: HashSet::new(), |
129 | 127 | }
|
130 | 128 | }
|
131 | 129 |
|
132 | 130 | pub fn read_event(&mut self) -> Result<Option<Event>, Error> {
|
133 | 131 | self.uffd.read_event()
|
134 | 132 | }
|
135 | 133 |
|
136 |
| - pub fn mark_range_removed(&mut self, start: u64, end: u64) { |
137 |
| - let pfn_start = start / self.page_size as u64; |
138 |
| - let pfn_end = end / self.page_size as u64; |
139 |
| - |
140 |
| - for pfn in pfn_start..pfn_end { |
141 |
| - self.removed_pages.insert(pfn); |
142 |
| - } |
| 134 | + pub fn unregister_range(&mut self, start: *mut c_void, end: *mut c_void) { |
| 135 | + // SAFETY: start and end are valid and provided by UFFD |
| 136 | + let len = unsafe { end.offset_from_unsigned(start) }; |
| 137 | + self.uffd |
| 138 | + .unregister(start, len) |
| 139 | + .expect("range should be valid"); |
143 | 140 | }
|
144 | 141 |
|
145 | 142 | pub fn serve_pf(&mut self, addr: *mut u8, len: usize) -> bool {
|
146 | 143 | // Find the start of the page that the current faulting address belongs to.
|
147 | 144 | let dst = (addr as usize & !(self.page_size - 1)) as *mut libc::c_void;
|
148 | 145 | let fault_page_addr = dst as u64;
|
149 |
| - let fault_pfn = fault_page_addr / self.page_size as u64; |
150 |
| - |
151 |
| - if self.removed_pages.contains(&fault_pfn) { |
152 |
| - return self.zero_out(fault_page_addr); |
153 |
| - } |
154 | 146 |
|
155 | 147 | for region in self.mem_regions.iter() {
|
156 | 148 | if region.contains(fault_page_addr) {
|
@@ -193,14 +185,6 @@ impl UffdHandler {
|
193 | 185 |
|
194 | 186 | true
|
195 | 187 | }
|
196 |
| - |
197 |
| - fn zero_out(&mut self, addr: u64) -> bool { |
198 |
| - match unsafe { self.uffd.zeropage(addr as *mut _, self.page_size, true) } { |
199 |
| - Ok(_) => true, |
200 |
| - Err(Error::ZeropageFailed(error)) if error as i32 == libc::EAGAIN => false, |
201 |
| - r => panic!("Unexpected zeropage result: {:?}", r), |
202 |
| - } |
203 |
| - } |
204 | 188 | }
|
205 | 189 |
|
206 | 190 | #[derive(Debug)]
|
|
0 commit comments