diff --git a/vm/vm-object.c b/vm/vm-object.c index 598800e..726f673 100644 --- a/vm/vm-object.c +++ b/vm/vm-object.c @@ -15,10 +15,30 @@ (p) += VM_PAGE_SIZE; \ } +static kern_status_t vm_object_cleanup(struct object *obj, struct queue *q) +{ + struct vm_object *vmo = vm_object_cast(obj); + struct btree_node *cur = btree_first(&vmo->vo_pages); + while (cur) { + struct vm_page *pg + = BTREE_CONTAINER(struct vm_page, p_bnode, cur); + struct btree_node *next = btree_next(cur); + btree_delete(&vmo->vo_pages, cur); + + vm_page_free(pg); + cur = next; + } + + return KERN_OK; +} + static struct object_type vm_object_type = { .ob_name = "vm-object", .ob_size = sizeof(struct vm_object), .ob_header_offset = offsetof(struct vm_object, vo_base), + .ob_ops = { + .destroy = vm_object_cleanup, + }, }; struct object_iterator {