From 5767d8e1117032e6c55e8a12c3508a78fa6aeb8e Mon Sep 17 00:00:00 2001 From: Joerg Roedel Date: Tue, 20 Aug 2024 17:42:17 +0200 Subject: [PATCH] kernel/mm: Reduce stack footprint of page-table freeing Turns out that the way the iterators are implemented in RawPageTablePart::free_lvl*() the compiler makes copies of entire pages on the stack, which overflows the 32 KiB stack pretty quickly. Iterate over references only and significantly reduce stack usage of the page-table freeing code. Signed-off-by: Joerg Roedel --- kernel/src/mm/pagetable.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/src/mm/pagetable.rs b/kernel/src/mm/pagetable.rs index 8b743b692..fc28ca93b 100644 --- a/kernel/src/mm/pagetable.rs +++ b/kernel/src/mm/pagetable.rs @@ -977,7 +977,7 @@ struct RawPageTablePart { impl RawPageTablePart { /// Frees a level 1 page table. fn free_lvl1(page: &PTPage) { - for entry in page.entries { + for entry in page.entries.iter().copied() { if let Some(page) = PTPage::from_entry(entry) { // SAFETY: the page comes from an entry in the page table, // which we allocated using `PTPage::alloc()`, so this is @@ -989,7 +989,7 @@ impl RawPageTablePart { /// Frees a level 2 page table, including all level 1 tables beneath it. fn free_lvl2(page: &PTPage) { - for entry in page.entries { + for entry in page.entries.iter().copied() { if let Some(l1_page) = PTPage::from_entry(entry) { Self::free_lvl1(l1_page); // SAFETY: the page comes from an entry in the page table,