From 006a7813b8401b128c2449ca743105795c941b8f Mon Sep 17 00:00:00 2001 From: sunhaosheng Date: Tue, 30 Dec 2025 17:50:38 +0800 Subject: [PATCH] mm: support shrinking brk --- api/src/syscall/mm/brk.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/api/src/syscall/mm/brk.rs b/api/src/syscall/mm/brk.rs index 6a6f0ba2..178d57d7 100644 --- a/api/src/syscall/mm/brk.rs +++ b/api/src/syscall/mm/brk.rs @@ -48,6 +48,20 @@ pub fn sys_brk(addr: usize) -> AxResult { { return Ok(current_top as isize); } + } else if new_top_aligned < current_top_aligned { + // Only unmap pages beyond the initially mapped heap region. + let shrink_start = VirtAddr::from(initial_heap_end.max(new_top_aligned)); + let shrink_size = current_top_aligned.saturating_sub(shrink_start.as_usize()); + + if shrink_size > 0 + && proc_data + .aspace + .lock() + .unmap(shrink_start, shrink_size) + .is_err() + { + return Ok(current_top as isize); + } } proc_data.set_heap_top(addr);