vm: evict PTE entries for transferred vm-object pages
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#include <kernel/printk.h>
|
||||
#include <kernel/address-space.h>
|
||||
#include <kernel/sched.h>
|
||||
#include <kernel/util.h>
|
||||
#include <kernel/vm-controller.h>
|
||||
@@ -236,7 +236,6 @@ extern struct vm_object *vm_object_create_in_place(
|
||||
i += VM_PAGE_SIZE, offset += VM_PAGE_SIZE) {
|
||||
struct vm_page *pg = vm_page_get(i);
|
||||
if (!pg) {
|
||||
printk("vm-object: invalid physical address %08llx", i);
|
||||
object_unref(&vmo->vo_base);
|
||||
return NULL;
|
||||
}
|
||||
@@ -871,8 +870,35 @@ kern_status_t vm_object_transfer(
|
||||
moved += VM_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/* TODO evict all page table entries that reference the transferred
|
||||
* pages in `src` */
|
||||
struct queue_entry *cur = queue_first(&src->vo_mappings);
|
||||
off_t src_limit = src_offset + count - 1;
|
||||
while (cur) {
|
||||
struct vm_area *area = QUEUE_CONTAINER(
|
||||
struct vm_area,
|
||||
vma_object_entry,
|
||||
cur);
|
||||
off_t area_offset = area->vma_object_offset;
|
||||
off_t area_limit
|
||||
= area_offset + (area->vma_limit - area->vma_base);
|
||||
|
||||
if (src_offset > area_limit || src_limit < area_offset) {
|
||||
cur = queue_next(cur);
|
||||
continue;
|
||||
}
|
||||
|
||||
off_t unmap_offset = MAX(area_offset, src_offset);
|
||||
off_t unmap_limit = MIN(area_limit, src_limit);
|
||||
|
||||
virt_addr_t base
|
||||
= area->vma_base + (unmap_offset - area_offset);
|
||||
virt_addr_t limit = base + (unmap_limit - unmap_offset);
|
||||
|
||||
for (virt_addr_t i = base; i < limit; i += VM_PAGE_SIZE) {
|
||||
pmap_remove(area->vma_space->s_pmap, i);
|
||||
}
|
||||
|
||||
cur = queue_next(cur);
|
||||
}
|
||||
|
||||
if (nr_moved) {
|
||||
*nr_moved = moved;
|
||||
|
||||
Reference in New Issue
Block a user