Skip to content

Commit 7aaa035

Browse files
committed
feat: update dealloc_tree implementation
1 parent 9564bf5 commit 7aaa035

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

page_table_multiarch/src/bits64.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)