From 5b7ed9315c5015ed68612719235ad69dfb53e849 Mon Sep 17 00:00:00 2001 From: mivik Date: Sat, 28 Feb 2026 15:09:55 +0800 Subject: [PATCH 1/5] fix(mm): evict listener not released --- kernel/src/mm/aspace/backend/file.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/kernel/src/mm/aspace/backend/file.rs b/kernel/src/mm/aspace/backend/file.rs index a92a00980..34319c46f 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) { From fe14bc854163ca806cf189a5adce897ec1100618 Mon Sep 17 00:00:00 2001 From: mivik Date: Sat, 28 Feb 2026 15:25:58 +0800 Subject: [PATCH 2/5] fix(mm): add missing on_protect call --- kernel/src/mm/aspace/backend/mod.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/kernel/src/mm/aspace/backend/mod.rs b/kernel/src/mm/aspace/backend/mod.rs index 43b3665a0..7cbd473a0 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() } } From f3ea63623e3e708ceffb6308d76e0910073a11a1 Mon Sep 17 00:00:00 2001 From: mivik Date: Sat, 28 Feb 2026 15:33:03 +0800 Subject: [PATCH 3/5] feat(mm/shared): add error rollback --- kernel/src/mm/aspace/backend/shared.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/kernel/src/mm/aspace/backend/shared.rs b/kernel/src/mm/aspace/backend/shared.rs index 281991a5f..8411ebc75 100644 --- a/kernel/src/mm/aspace/backend/shared.rs +++ b/kernel/src/mm/aspace/backend/shared.rs @@ -14,10 +14,20 @@ pub struct SharedPages { } impl SharedPages { pub fn new(size: usize, page_size: PageSize) -> AxResult { + let mut phys_pages = Vec::with_capacity(divide_page(size, page_size)); + for _ in 0..phys_pages.capacity() { + match alloc_frame(true, page_size) { + Ok(frame) => phys_pages.push(frame), + Err(e) => { + for frame in phys_pages { + dealloc_frame(frame, page_size); + } + return Err(e); + } + } + } Ok(Self { - phys_pages: (0..divide_page(size, page_size)) - .map(|_| alloc_frame(true, page_size)) - .collect::>()?, + phys_pages, size: page_size, }) } From ebc6529817ac787d68963890009a893bd994c8a5 Mon Sep 17 00:00:00 2001 From: mivik Date: Sat, 28 Feb 2026 16:22:41 +0800 Subject: [PATCH 4/5] fix(mm/shared): vec capacity --- kernel/src/mm/aspace/backend/shared.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/src/mm/aspace/backend/shared.rs b/kernel/src/mm/aspace/backend/shared.rs index 8411ebc75..6f5cdb6ed 100644 --- a/kernel/src/mm/aspace/backend/shared.rs +++ b/kernel/src/mm/aspace/backend/shared.rs @@ -14,8 +14,9 @@ pub struct SharedPages { } impl SharedPages { pub fn new(size: usize, page_size: PageSize) -> AxResult { - let mut phys_pages = Vec::with_capacity(divide_page(size, page_size)); - for _ in 0..phys_pages.capacity() { + let num_pages = divide_page(size, page_size); + let mut phys_pages = Vec::with_capacity(num_pages); + for _ in 0..num_pages { match alloc_frame(true, page_size) { Ok(frame) => phys_pages.push(frame), Err(e) => { From a54483b05bd449a4a02e90b5c975e3e071dde12b Mon Sep 17 00:00:00 2001 From: mivik Date: Sat, 28 Feb 2026 23:37:53 +0800 Subject: [PATCH 5/5] style(mm/shared): use RAII style --- kernel/src/mm/aspace/backend/shared.rs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/kernel/src/mm/aspace/backend/shared.rs b/kernel/src/mm/aspace/backend/shared.rs index 6f5cdb6ed..818e991f6 100644 --- a/kernel/src/mm/aspace/backend/shared.rs +++ b/kernel/src/mm/aspace/backend/shared.rs @@ -15,22 +15,14 @@ pub struct SharedPages { impl SharedPages { pub fn new(size: usize, page_size: PageSize) -> AxResult { let num_pages = divide_page(size, page_size); - let mut phys_pages = Vec::with_capacity(num_pages); + let mut result = Self { + phys_pages: Vec::with_capacity(num_pages), + size: page_size, + }; for _ in 0..num_pages { - match alloc_frame(true, page_size) { - Ok(frame) => phys_pages.push(frame), - Err(e) => { - for frame in phys_pages { - dealloc_frame(frame, page_size); - } - return Err(e); - } - } + result.phys_pages.push(alloc_frame(true, page_size)?); } - Ok(Self { - phys_pages, - size: page_size, - }) + Ok(result) } pub fn len(&self) -> usize {