diff --git a/ostd/src/mm/page_table/cursor.rs b/ostd/src/mm/page_table/cursor.rs index f6468eafe..d24df7073 100644 --- a/ostd/src/mm/page_table/cursor.rs +++ b/ostd/src/mm/page_table/cursor.rs @@ -271,12 +271,16 @@ where fn level_down(&mut self) { debug_assert!(self.level > 1); - if let Child::PageTable(nxt_lvl_ptn) = self.cur_child() { - self.level -= 1; - self.guards[(self.level - 1) as usize] = Some(nxt_lvl_ptn.lock()); - } else { + let Child::PageTable(nxt_lvl_ptn) = self.cur_child() else { panic!("Trying to level down when it is not mapped to a page table"); - } + }; + + let nxt_lvl_ptn_locked = nxt_lvl_ptn.lock(); + + self.level -= 1; + debug_assert_eq!(self.level, nxt_lvl_ptn_locked.level()); + + self.guards[(self.level - 1) as usize] = Some(nxt_lvl_ptn_locked); } fn cur_node(&self) -> &PageTableNode { diff --git a/ostd/src/mm/page_table/node.rs b/ostd/src/mm/page_table/node.rs index 5d7c227a4..14d306edb 100644 --- a/ostd/src/mm/page_table/node.rs +++ b/ostd/src/mm/page_table/node.rs @@ -56,7 +56,6 @@ where [(); C::NR_LEVELS as usize]:, { pub(super) raw: Paddr, - pub(super) level: PagingLevel, _phantom: PhantomData<(E, C)>, } @@ -74,7 +73,6 @@ where // transferring the ownership to a new handle. No increment of the reference // count is needed. let page = unsafe { Page::>::from_raw(self.paddr()) }; - debug_assert!(page.meta().level == self.level); // Acquire the lock. while page @@ -98,7 +96,6 @@ where Self { raw: self.raw, - level: self.level, _phantom: PhantomData, } } @@ -121,8 +118,6 @@ where mm::CachePolicy, }; - debug_assert_eq!(self.level, PagingConsts::NR_LEVELS); - let last_activated_paddr = current_page_table_paddr(); activate_page_table(self.raw, CachePolicy::Writeback); @@ -137,7 +132,6 @@ where // Restore and drop the last activated page table. drop(Self { raw: last_activated_paddr, - level: PagingConsts::NR_LEVELS, _phantom: PhantomData, }); } @@ -149,8 +143,6 @@ where pub(super) unsafe fn first_activate(&self) { use crate::{arch::mm::activate_page_table, mm::CachePolicy}; - debug_assert_eq!(self.level, PagingConsts::NR_LEVELS); - self.inc_ref(); activate_page_table(self.raw, CachePolicy::Writeback); @@ -240,7 +232,6 @@ where /// Converts the handle into a raw handle to be stored in a PTE or CPU. pub(super) fn into_raw(self) -> RawPageTableNode { - let level = self.level(); let raw = self.page.paddr(); self.page.meta().lock.store(0, Ordering::Release); @@ -248,7 +239,6 @@ where RawPageTableNode { raw, - level, _phantom: PhantomData, } } @@ -259,7 +249,6 @@ where RawPageTableNode { raw: self.page.paddr(), - level: self.level(), _phantom: PhantomData, } } @@ -283,7 +272,6 @@ where core::mem::forget(inc_ref); Child::PageTable(RawPageTableNode { raw: paddr, - level: self.level() - 1, _phantom: PhantomData, }) } else if in_tracked_range { @@ -368,7 +356,6 @@ where ) { // They should be ensured by the cursor. debug_assert!(idx < nr_subpage_per_huge::()); - debug_assert_eq!(pt.level, self.level() - 1); let pte = Some(E::new_pt(pt.paddr())); self.overwrite_pte(idx, pte, in_tracked_range);