From 4cfa1f295859d87f50419dae223fd54fdfcf7aec Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Mon, 22 Nov 2021 14:02:29 +0200 Subject: [PATCH] feature: faster single-page alloc --- kernel/src/mem/phys/manager.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/kernel/src/mem/phys/manager.rs b/kernel/src/mem/phys/manager.rs index 4ad8b48..74ce890 100644 --- a/kernel/src/mem/phys/manager.rs +++ b/kernel/src/mem/phys/manager.rs @@ -17,6 +17,7 @@ pub struct SimpleManager { pages: &'static mut [PageInfo], stats: PageStatistics, base_index: usize, + last_index: usize, } impl SimpleManager { pub(super) unsafe fn initialize(base: usize, at: usize, count: usize) -> Self { @@ -34,6 +35,7 @@ impl SimpleManager { } Self { base_index: base / PAGE_SIZE, + last_index: 0, stats: PageStatistics { available: 0, kernel: 0, @@ -57,11 +59,21 @@ impl SimpleManager { } fn alloc_single_index(&mut self, pu: PageUsage) -> Result { - for index in 0..self.pages.len() { + for index in self.last_index..self.pages.len() { let page = &mut self.pages[index]; if page.usage == PageUsage::Available { page.usage = pu; page.refcount = 1; + self.last_index = index; + return Ok(index); + } + } + for index in 0..self.last_index { + let page = &mut self.pages[index]; + if page.usage == PageUsage::Available { + page.usage = pu; + page.refcount = 1; + self.last_index = index; return Ok(index); } } @@ -135,6 +147,8 @@ unsafe impl Manager for SimpleManager { assert_eq!(page.refcount, 1); page.usage = PageUsage::Available; page.refcount = 0; + + self.last_index = index; } usage