diff --git a/kernel/src/mm/aspace/backend/file.rs b/kernel/src/mm/aspace/backend/file.rs index a92a0098..34319c46 100644 --- a/kernel/src/mm/aspace/backend/file.rs +++ b/kernel/src/mm/aspace/backend/file.rs @@ -33,9 +33,12 @@ impl Drop for FileBackendInner { } } impl FileBackendInner { - pub fn register_listener(self: &Arc, aspace: &Arc>) -> usize { + pub fn register_listener(self: &Arc, aspace: &Arc>) { + if self.handle.load(Ordering::Acquire) != 0 { + panic!("Listener already registered"); + } let aspace = Arc::downgrade(aspace); - self.cache.add_evict_listener({ + let handle = self.cache.add_evict_listener({ let this = Arc::downgrade(self); move |pn, _page| { let Some(this) = this.upgrade() else { @@ -53,7 +56,8 @@ impl FileBackendInner { }; this.on_evict(pn, &mut aspace); } - }) + }); + self.handle.store(handle, Ordering::Release); } fn on_evict(self: &Arc, pn: u32, aspace: &mut AddrSpace) { diff --git a/kernel/src/mm/aspace/backend/mod.rs b/kernel/src/mm/aspace/backend/mod.rs index 43b3665a..7cbd473a 100644 --- a/kernel/src/mm/aspace/backend/mod.rs +++ b/kernel/src/mm/aspace/backend/mod.rs @@ -145,6 +145,12 @@ impl MappingBackend for Backend { new_flags: Self::Flags, pt: &mut Self::PageTable, ) -> bool { - pt.cursor().protect_region(start, size, new_flags).is_ok() + let range = VirtAddrRange::from_start_size(start, size); + let mut cursor = pt.cursor(); + if let Err(err) = BackendOps::on_protect(self, range, new_flags, &mut cursor) { + warn!("Failed to protect area: {:?}", err); + return false; + } + cursor.protect_region(start, size, new_flags).is_ok() } } diff --git a/kernel/src/mm/aspace/backend/shared.rs b/kernel/src/mm/aspace/backend/shared.rs index 281991a5..818e991f 100644 --- a/kernel/src/mm/aspace/backend/shared.rs +++ b/kernel/src/mm/aspace/backend/shared.rs @@ -14,12 +14,15 @@ pub struct SharedPages { } impl SharedPages { pub fn new(size: usize, page_size: PageSize) -> AxResult { - Ok(Self { - phys_pages: (0..divide_page(size, page_size)) - .map(|_| alloc_frame(true, page_size)) - .collect::>()?, + let num_pages = divide_page(size, page_size); + let mut result = Self { + phys_pages: Vec::with_capacity(num_pages), size: page_size, - }) + }; + for _ in 0..num_pages { + result.phys_pages.push(alloc_frame(true, page_size)?); + } + Ok(result) } pub fn len(&self) -> usize {