From 83b9ebf87d783abdde3ffbb73f12256d77906670 Mon Sep 17 00:00:00 2001 From: Zhang Junyang Date: Thu, 20 Mar 2025 20:22:48 +0800 Subject: [PATCH] Avoid repetitive locking for clearing cache --- osdk/deps/frame-allocator/src/cache.rs | 20 +++++++++------- osdk/deps/frame-allocator/src/pools/mod.rs | 27 ++++++++++++---------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/osdk/deps/frame-allocator/src/cache.rs b/osdk/deps/frame-allocator/src/cache.rs index 7a3957b0..6aa26bc8 100644 --- a/osdk/deps/frame-allocator/src/cache.rs +++ b/osdk/deps/frame-allocator/src/cache.rs @@ -71,13 +71,17 @@ impl CacheArray Option 4 { - super::pools::dealloc(guard, addr, size); + super::pools::dealloc(guard, [(addr, size)].into_iter()); return; } @@ -146,6 +150,6 @@ pub(super) fn dealloc(guard: &DisabledLocalIrqGuard, addr: Paddr, size: usize) { 2 => cache.cache2.dealloc(guard, addr), 3 => cache.cache3.dealloc(guard, addr), 4 => cache.cache4.dealloc(guard, addr), - _ => super::pools::dealloc(guard, addr, size), + _ => super::pools::dealloc(guard, [(addr, size)].into_iter()), } } diff --git a/osdk/deps/frame-allocator/src/pools/mod.rs b/osdk/deps/frame-allocator/src/pools/mod.rs index 90d0b29e..e01561cd 100644 --- a/osdk/deps/frame-allocator/src/pools/mod.rs +++ b/osdk/deps/frame-allocator/src/pools/mod.rs @@ -82,8 +82,7 @@ pub(super) fn alloc(guard: &DisabledLocalIrqGuard, layout: Layout) -> Option Option, +) { let local_pool_cell = LOCAL_POOL.get_with(guard); let mut local_pool = local_pool_cell.borrow_mut(); let mut global_pool = OnDemandGlobalLock::new(); - do_dealloc(&mut local_pool, &mut global_pool, addr, size); + do_dealloc(&mut local_pool, &mut global_pool, segments); balancing::balance(local_pool.deref_mut(), &mut global_pool); @@ -120,15 +122,16 @@ pub(super) fn add_free_memory(_guard: &DisabledLocalIrqGuard, addr: Paddr, size: fn do_dealloc( local_pool: &mut BuddySet, global_pool: &mut OnDemandGlobalLock, - addr: Paddr, - size: usize, + segments: impl Iterator, ) { - split_to_chunks(addr, size).for_each(|(addr, order)| { - if order >= MAX_LOCAL_BUDDY_ORDER { - global_pool.get().insert_chunk(addr, order); - } else { - local_pool.insert_chunk(addr, order); - } + segments.for_each(|(addr, size)| { + split_to_chunks(addr, size).for_each(|(addr, order)| { + if order >= MAX_LOCAL_BUDDY_ORDER { + global_pool.get().insert_chunk(addr, order); + } else { + local_pool.insert_chunk(addr, order); + } + }); }); }