diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-09 16:06:17 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-09 16:06:17 -0400 |
commit | 4edcfc0ce150f8752b8dfc9f37c585d516785a49 (patch) | |
tree | 155c0690a10394d5a5eb46d02481ea8c63a34b77 /sys | |
parent | b0025dc0cda5acf6a4b061a3b31f32798c664e5f (diff) |
kernel: physmem: Only set bits if memory is found
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/vm/vm_physmem.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/sys/vm/vm_physmem.c b/sys/vm/vm_physmem.c index 90d6cd1..ed9b5d2 100644 --- a/sys/vm/vm_physmem.c +++ b/sys/vm/vm_physmem.c @@ -141,38 +141,35 @@ uintptr_t vm_alloc_frame(size_t count) { size_t frames = 0; - ssize_t free_i = -1; - size_t start, end; + ssize_t idx = -1; uintptr_t ret = 0; spinlock_acquire(&lock); for (size_t i = 0; i < highest_frame_idx; ++i) { - if (testbit(bitmap, i)) { - /* Not free, try again... */ - frames = 0; - free_i = -1; + if (!testbit(bitmap, i)) { + if (idx < 0) + idx = i; + if (++frames >= count) + break; + continue; } - if (free_i < 0) { - free_i = i; - } + idx = -1; + frames = 0; + } - /* We have a free page */ - if (++frames == count) { - ret = free_i * DEFAULT_PAGESIZE; - break; - } + if (idx < 0 || frames != count) { + ret = 0; + goto done; } - if (ret > 0) { - start = free_i; - end = free_i + count; - for (size_t i = start; i < end; ++i) { - setbit(bitmap, i); - } + for (size_t i = idx; i < idx + count; ++i) { + setbit(bitmap, i); } + ret = idx * DEFAULT_PAGESIZE; +done: spinlock_release(&lock); return ret; } |