@@ -69,9 +69,9 @@ impl<const MAX_ORDER: usize> BuddyAllocator<MAX_ORDER> {
6969 /// Set the bitmap for the allocator.
7070 pub fn set_bitmap ( & mut self , bitmap : & ' static mut [ u64 ] ) {
7171 self . bitmap = bitmap;
72- // Clear bitmap
73- for x in self . bitmap . iter_mut ( ) {
74- * x = 0 ;
72+ // Faster clear using write_bytes
73+ unsafe {
74+ core :: ptr :: write_bytes ( self . bitmap . as_mut_ptr ( ) , 0 , self . bitmap . len ( ) ) ;
7575 }
7676 }
7777
@@ -245,8 +245,31 @@ impl<const MAX_ORDER: usize> BuddyAllocator<MAX_ORDER> {
245245 pub unsafe fn add_region ( & mut self , start : PhysFrame < Size4KiB > , end : PhysFrame < Size4KiB > ) {
246246 let mut current = start;
247247 while current < end {
248- self . add_frame ( current) ;
249- current += 1 ;
248+ let current_addr = current. start_address ( ) . as_u64 ( ) ;
249+ let end_addr = end. start_address ( ) . as_u64 ( ) ;
250+ let remaining_frames = ( end_addr - current_addr) / 4096 ;
251+
252+ // Find the largest power-of-two block that fits and is aligned
253+ let mut order = 0 ;
254+ while order < MAX_ORDER - 1 {
255+ let next_order = order + 1 ;
256+ let size_frames = 1 << next_order;
257+ let size_bytes = 4096 * size_frames;
258+
259+ // Check alignment
260+ if !current_addr. is_multiple_of ( size_bytes) {
261+ break ;
262+ }
263+ // Check size
264+ if size_frames > remaining_frames {
265+ break ;
266+ }
267+ order = next_order;
268+ }
269+
270+ self . total_frames += 1 << order;
271+ self . merge_block ( current, order) ;
272+ current += 1 << order;
250273 }
251274 }
252275
0 commit comments