@@ -349,8 +349,8 @@ impl<M: PagingMetaData, PTE: GenericPTE, H: PagingHandler> PageTable64<M, PTE, H
349349 assert ! ( end_idx <= ENTRY_COUNT ) ;
350350 for i in start_idx..end_idx {
351351 let entry = & mut dst_table[ i] ;
352- if !self . borrowed_entries . set ( i, true ) {
353- self . dealloc_tree ( entry, 0 ) ;
352+ if !self . borrowed_entries . set ( i, true ) && self . next_table ( entry ) . is_ok ( ) {
353+ self . dealloc_tree ( entry. paddr ( ) , 1 ) ;
354354 }
355355 * entry = src_table[ i] ;
356356 }
@@ -532,16 +532,16 @@ impl<M: PagingMetaData, PTE: GenericPTE, H: PagingHandler> PageTable64<M, PTE, H
532532 Ok ( ( ) )
533533 }
534534
535- fn dealloc_tree ( & self , table_entry : & PTE , level : usize ) {
535+ fn dealloc_tree ( & self , table_paddr : PhysAddr , level : usize ) {
536536 // don't free the entries in last level, they are not array.
537537 if level < M :: LEVELS - 1 {
538- if let Ok ( table ) = self . next_table ( table_entry ) {
539- for entry in table {
540- self . dealloc_tree ( entry, level + 1 ) ;
538+ for entry in self . table_of ( table_paddr ) {
539+ if self . next_table ( entry) . is_ok ( ) {
540+ self . dealloc_tree ( entry. paddr ( ) , level + 1 ) ;
541541 }
542- H :: dealloc_frame ( table_entry. paddr ( ) ) ;
543542 }
544543 }
544+ H :: dealloc_frame ( table_paddr) ;
545545 }
546546}
547547
@@ -554,7 +554,9 @@ impl<M: PagingMetaData, PTE: GenericPTE, H: PagingHandler> Drop for PageTable64<
554554 if self . borrowed_entries . get ( i) {
555555 continue ;
556556 }
557- self . dealloc_tree ( entry, 0 ) ;
557+ if self . next_table ( entry) . is_ok ( ) {
558+ self . dealloc_tree ( entry. paddr ( ) , 1 ) ;
559+ }
558560 }
559561 H :: dealloc_frame ( self . root_paddr ( ) ) ;
560562 }
0 commit comments