summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/vm/vm_physmem.c37
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;
}