diff options
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; } |