diff --git a/src/context/memory.rs b/src/context/memory.rs index 29a0b35573..beebab74cb 100644 --- a/src/context/memory.rs +++ b/src/context/memory.rs @@ -329,7 +329,7 @@ impl AddrSpaceWrapper { requested_dst_base: Option, new_page_count: usize, new_flags: MapFlags, - notify_files: &mut Vec, + mut notify_files_out: Option<&mut Vec>, ) -> Result { let dst_lock = self; let mut dst = dst_lock.acquire_write(); @@ -360,13 +360,16 @@ impl AddrSpaceWrapper { } Some(base) if new_flags.contains(MapFlags::MAP_FIXED) => { let unpin = false; - notify_files.append(&mut AddrSpace::munmap_inner( + let notify_files = AddrSpace::munmap_inner( &mut dst.grants, &mut dst.table.utable, &mut dst_flusher, PageSpan::new(base, new_page_count), unpin, - )?); + )?; + if let Some(notify_files_out) = notify_files_out.as_mut() { + notify_files_out.extend(notify_files); + } base } @@ -401,7 +404,7 @@ impl AddrSpaceWrapper { if new_page_count < src_span.count { let unpin = false; - notify_files.append(&mut AddrSpace::munmap_inner( + let notify_files: Vec = AddrSpace::munmap_inner( src_grants, src_mapper, src_flusher, @@ -410,7 +413,10 @@ impl AddrSpaceWrapper { src_span.count - new_page_count, ), unpin, - )?); + )?; + if let Some(notify_files_out) = notify_files_out.as_mut() { + notify_files_out.extend(notify_files); + } } let mut remaining_src_span = @@ -662,7 +668,7 @@ impl AddrSpace { flags: MapFlags, map: impl FnOnce(Page, PageFlags, &mut PageMapper, &mut Flusher) -> Result, ) -> Result { - self.mmap(dst_lock, None, page_count, flags, &mut Vec::new(), map) + self.mmap(dst_lock, None, page_count, flags, None, map) } pub fn mmap( &mut self, @@ -670,7 +676,7 @@ impl AddrSpace { requested_base_opt: Option, page_count: NonZeroUsize, flags: MapFlags, - notify_files_out: &mut Vec, + notify_files_out: Option<&mut Vec>, map: impl FnOnce(Page, PageFlags, &mut PageMapper, &mut Flusher) -> Result, ) -> Result { debug_assert_eq!(dst_lock.inner.as_mut_ptr(), self as *mut Self); @@ -695,7 +701,9 @@ impl AddrSpace { requested_span, unpin, )?; - notify_files_out.append(&mut notify_files); + if let Some(notify_files_out) = notify_files_out { + notify_files_out.append(&mut notify_files); + } requested_span } else { diff --git a/src/scheme/memory.rs b/src/scheme/memory.rs index 9a483bd2eb..a2f4cb2407 100644 --- a/src/scheme/memory.rs +++ b/src/scheme/memory.rs @@ -98,7 +98,7 @@ impl MemoryScheme { (map.address != 0 || fixed).then_some(span.base), page_count, map.flags, - &mut notify_files, + Some(&mut notify_files), |dst_page, flags, mapper, flusher| { let span = PageSpan::new(dst_page, page_count.get()); if is_phys_contiguous { diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index 91e79c7d29..732be724ea 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -525,7 +525,7 @@ impl KernelScheme for ProcScheme { requested_dst_base, src_page_count.get(), map.flags, - &mut notify_files, + Some(&mut notify_files), )? } else { let mut dst_addrsp_guard = dst_addr_space.acquire_write(); @@ -534,7 +534,7 @@ impl KernelScheme for ProcScheme { requested_dst_base, src_page_count, map.flags, - &mut notify_files, + Some(&mut notify_files), |dst_page, _, dst_mapper, flusher| { Grant::borrow( Arc::clone(addrspace), @@ -574,7 +574,7 @@ impl KernelScheme for ProcScheme { None, NonZeroUsize::new(1).unwrap(), MapFlags::PROT_READ | MapFlags::PROT_WRITE, - &mut Vec::new(), + None, |page, flags, mapper, flusher| { Grant::allocated_shared_one_page( frame.get(), diff --git a/src/scheme/sys/iostat.rs b/src/scheme/sys/iostat.rs index 7c8e41e214..cc218d9417 100644 --- a/src/scheme/sys/iostat.rs +++ b/src/scheme/sys/iostat.rs @@ -96,7 +96,7 @@ pub fn resource(token: &mut CleanLockToken) -> Result> { None, page_count, MapFlags::PROT_READ | MapFlags::PROT_WRITE, - &mut Vec::new(), + None, |page, flags, mapper, flusher| { let shared = false; Ok(Grant::zeroed( diff --git a/src/scheme/user.rs b/src/scheme/user.rs index eb43027c9a..c3c3b6ba86 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -568,7 +568,7 @@ impl UserInner { Some(free_span.base), ONE, map_flags | MAP_FIXED_NOREPLACE, - &mut Vec::new(), + None, move |dst_page, page_flags, mapper, flusher| { let is_pinned = true; Grant::allocated_shared_one_page( @@ -606,7 +606,7 @@ impl UserInner { Some(first_middle_dst_page), middle_page_count, map_flags | MAP_FIXED_NOREPLACE, - &mut Vec::new(), + None, move |dst_page, _, mapper, flusher| { let eager = true; @@ -663,7 +663,7 @@ impl UserInner { Some(tail_dst_page), ONE, map_flags | MAP_FIXED_NOREPLACE, - &mut Vec::new(), + None, move |dst_page, page_flags, mapper, flusher| { let is_pinned = true; Grant::allocated_shared_one_page( @@ -1109,7 +1109,7 @@ impl UserInner { dst_base, page_count_nz, map.flags, - &mut notify_files, + Some(&mut notify_files), |dst_base, flags, mapper, flusher| { Grant::borrow_fmap( PageSpan::new(dst_base, page_count), diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs index c6bb6d4474..0b97cecfff 100644 --- a/src/syscall/fs.rs +++ b/src/syscall/fs.rs @@ -637,7 +637,7 @@ pub fn mremap( requested_dst_base, NonZeroUsize::new(1).expect("value specified is not zero"), map_flags, - &mut Vec::new(), + None, |page, page_flags, mapper, flusher| { let frame = raii_frame.take(); // XXX: add_ref(RefKind::Shared) is internally done by borrow_frame_enforce_rw_allocated(src_span.base). @@ -663,7 +663,7 @@ pub fn mremap( requested_dst_base, new_page_count, map_flags, - &mut Vec::new(), + None, )?; Ok(base.start_address().data()) diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 57a88c828c..51c76ff499 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -1,4 +1,4 @@ -use alloc::{sync::Arc, vec::Vec}; +use alloc::sync::Arc; use core::{mem, num::NonZeroUsize}; use rmm::Arch; @@ -117,7 +117,7 @@ pub unsafe fn usermode_bootstrap(bootstrap: &Bootstrap, token: &mut CleanLockTok Some(base), page_count, flags, - &mut Vec::new(), + None, |page, flags, mapper, flusher| { let shared = false; Ok(Grant::zeroed( @@ -173,7 +173,7 @@ pub unsafe fn usermode_bootstrap(bootstrap: &Bootstrap, token: &mut CleanLockTok ))), NonZeroUsize::new(KERNEL_METADATA_PAGE_COUNT).unwrap(), MapFlags::MAP_FIXED_NOREPLACE | MapFlags::PROT_READ | MapFlags::PROT_WRITE, - &mut Vec::new(), + None, |page, flags, mapper, flusher| { let shared = false; Ok(Grant::zeroed(