sandbox: vm: implement page freeing; merge/split bugfix
This commit is contained in:
@@ -184,7 +184,7 @@ static int replenish_free_page_list(vm_zone_t *z, vm_page_order_t order)
|
||||
|
||||
queue_push_back(&z->z_free_pages[order - 1], &a->p_free_list);
|
||||
queue_push_back(&z->z_free_pages[order - 1], &b->p_free_list);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -194,13 +194,32 @@ vm_page_t *vm_zone_alloc_page(vm_zone_t *z, vm_page_order_t order, vm_flags_t fl
|
||||
if (result != 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
queue_entry_t *pg_entry = queue_pop_front(&z->z_free_pages[order]);
|
||||
return QUEUE_CONTAINER(vm_page_t, p_free_list, pg_entry);
|
||||
vm_page_t *pg = QUEUE_CONTAINER(vm_page_t, p_free_list, pg_entry);
|
||||
vm_page_foreach (pg, i) {
|
||||
i->p_flags |= VM_PAGE_ALLOC;
|
||||
}
|
||||
|
||||
return pg;
|
||||
}
|
||||
|
||||
void vm_zone_free_page(vm_zone_t *z, vm_page_t *pg)
|
||||
{
|
||||
pg->p_flags &= ~VM_PAGE_ALLOC;
|
||||
queue_push_back(&z->z_free_pages[pg->p_order], &pg->p_free_list);
|
||||
|
||||
while (1) {
|
||||
vm_page_t *buddy = vm_page_get_buddy(pg);
|
||||
vm_page_t *huge = vm_page_merge(pg, buddy);
|
||||
if (!huge) {
|
||||
break;
|
||||
}
|
||||
|
||||
queue_delete(&z->z_free_pages[buddy->p_order - 1], &buddy->p_free_list);
|
||||
queue_delete(&z->z_free_pages[buddy->p_order - 1], &pg->p_free_list);
|
||||
queue_push_back(&z->z_free_pages[huge->p_order], &huge->p_free_list);
|
||||
|
||||
pg = huge;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user