sandbox: vm: implement page freeing; merge/split bugfix
This commit is contained in:
@@ -190,9 +190,12 @@ int vm_page_split(vm_page_t *pg, vm_page_t **a, vm_page_t **b)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* NOTE that we cannot use vm_page_foreach here,
|
||||
as we are modifying the flags that vm_page_foreach
|
||||
uses to determine where a given page block ends */
|
||||
size_t nr_frames = vm_page_order_to_pages(pg->p_order);
|
||||
for (size_t i = 0; i < nr_frames; i++) {
|
||||
pg[i].p_order = pg->p_order - 1;
|
||||
pg[i].p_order--;
|
||||
}
|
||||
|
||||
vm_page_t *buddy = vm_page_get_buddy(pg);
|
||||
@@ -224,12 +227,8 @@ vm_page_t *vm_page_merge(vm_page_t *a, vm_page_t *b)
|
||||
if (vm_page_get_buddy(a) != b) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (VM_PAGE_IS_RESERVED(a) && !VM_PAGE_IS_RESERVED(b)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!VM_PAGE_IS_RESERVED(a) && VM_PAGE_IS_RESERVED(b)) {
|
||||
if ((a->p_flags & (VM_PAGE_ALLOC | VM_PAGE_RESERVED)) != (b->p_flags & (VM_PAGE_ALLOC | VM_PAGE_RESERVED))) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -242,6 +241,9 @@ vm_page_t *vm_page_merge(vm_page_t *a, vm_page_t *b)
|
||||
|
||||
a->p_order++;
|
||||
|
||||
/* NOTE that we cannot use vm_page_foreach here,
|
||||
as we are modifying the flags that vm_page_foreach
|
||||
uses to determine where a given page block ends */
|
||||
size_t nr_frames = vm_page_order_to_pages(a->p_order);
|
||||
for (size_t i = 0; i < nr_frames; i++) {
|
||||
a[i].p_flags &= ~VM_PAGE_HEAD;
|
||||
@@ -251,7 +253,7 @@ vm_page_t *vm_page_merge(vm_page_t *a, vm_page_t *b)
|
||||
|
||||
a->p_flags |= VM_PAGE_HEAD;
|
||||
|
||||
return 0;
|
||||
return a;
|
||||
}
|
||||
|
||||
vm_page_t *vm_page_get_buddy(vm_page_t *pg)
|
||||
|
||||
Reference in New Issue
Block a user