From 418e9ea04e5feda5f17a8d29d69b0d6576be7f8f Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 9 Jun 2025 01:47:19 -0400 Subject: kernel: physmem: Allocate unfragmented phys memory - Ensure a contiguous region of physical memory is allocated in vm_alloc_frame() - Fix issues with physical memory being clobbered with excessive allocations - Clean up frame walk loop Signed-off-by: Ian Moffett --- sys/vm/vm_physmem.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'sys/vm/vm_physmem.c') diff --git a/sys/vm/vm_physmem.c b/sys/vm/vm_physmem.c index ad8a38d..90d6cd1 100644 --- a/sys/vm/vm_physmem.c +++ b/sys/vm/vm_physmem.c @@ -141,25 +141,38 @@ uintptr_t vm_alloc_frame(size_t count) { size_t frames = 0; + ssize_t free_i = -1; + size_t start, end; uintptr_t ret = 0; spinlock_acquire(&lock); for (size_t i = 0; i < highest_frame_idx; ++i) { - if (!testbit(bitmap, i)) { - /* We have a free page */ - if (++frames != count) { - continue; - } + if (testbit(bitmap, i)) { + /* Not free, try again... */ + frames = 0; + free_i = -1; + continue; + } - for (size_t j = i; j < i + count; ++j) { - setbit(bitmap, j); - } + if (free_i < 0) { + free_i = i; + } - ret = i * DEFAULT_PAGESIZE; + /* We have a free page */ + if (++frames == count) { + ret = free_i * DEFAULT_PAGESIZE; break; } } + if (ret > 0) { + start = free_i; + end = free_i + count; + for (size_t i = start; i < end; ++i) { + setbit(bitmap, i); + } + } + spinlock_release(&lock); return ret; } -- cgit v1.2.3