diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-09 01:47:19 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-09 01:47:19 -0400 |
commit | 418e9ea04e5feda5f17a8d29d69b0d6576be7f8f (patch) | |
tree | 4debb2f719a7c97a3e7cbe6a70b791b64f60fd4c | |
parent | 547faafc2b5731256c77e7799c34d0c62a2195c6 (diff) |
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 <ian@osmora.org>
-rw-r--r-- | sys/vm/vm_physmem.c | 31 |
1 files changed, 22 insertions, 9 deletions
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; } |