Skip to content

Commit

Permalink
VM: Free objpages properly.
Browse files Browse the repository at this point in the history
  • Loading branch information
netbsduser committed Jun 24, 2023
1 parent a3af871 commit 79dee7a
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 7 deletions.
12 changes: 11 additions & 1 deletion kernel/vm/cleaner.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include "kdk/amd64/vmamd64.h"
#include "kdk/devmgr.h"
#include "kdk/kernel.h"
#include "kdk/objhdr.h"
#include "kdk/kmem.h"
#include "kdk/process.h"
#include "kdk/vfs.h"
#include "kdk/vm.h"
Expand Down Expand Up @@ -226,3 +226,13 @@ vmp_objpage_dirty(vm_object_t *obj, struct vmp_objpage *opage)
out:
vmp_release_pfn_lock(ipl);
}

void
vmp_objpage_free(vm_map_t *map, struct vmp_objpage *opage)
{
vmp_page_free(map, opage->page);
opage->page = NULL;
kassert(opage->stat == kVMPObjPageClean);
TAILQ_REMOVE(&dirty_queue, opage, dirtyqueue_entry);
kmem_free(opage, sizeof(*opage));
}
21 changes: 15 additions & 6 deletions kernel/vm/obj.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,26 @@ vm_object_new_vnode(vm_object_t **out, struct vnode *vnode)
int
vm_object_free(vm_map_t *map, vm_object_t *obj)
{
/* here, we know the object can't be mapped anywhere anymore */
/*
* Acquire the object lock to prevent any unexpected pageouts. (todo!)
*/

if (obj->is_anonymous)
vmp_amap_free(map, &obj->amap);
else {
struct vmp_objpage *objpage;
RB_FOREACH(objpage, vmp_objpage_rbtree ,&obj->page_rbtree ) {
/* todo(HIGH): !!! Come back to this ; queues? */
vmp_page_free(map, objpage->page);
objpage->page = NULL;
struct vmp_objpage *opage, *tmp;

/*
* Dirty object pages keep a reference to objects - if we are
* here, there cannot be any.
*/

RB_FOREACH_SAFE (opage, vmp_objpage_rbtree, &obj->page_rbtree,
tmp) {
RB_REMOVE(vmp_objpage_rbtree, &obj->page_rbtree, opage);
vmp_objpage_free(map, opage);
}

kmem_free(obj, sizeof(*obj));
}
return 0;
Expand Down
3 changes: 3 additions & 0 deletions kernel/vm/vm_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ void vmp_objpage_created(struct vmp_objpage *opage);
/*! @brief Inform the cleaner an object page is potentially dirty. */
void vmp_objpage_dirty(vm_object_t *obj, struct vmp_objpage *opage);

/*! @brief Free an object page. Must be clean & object must be LOCKED. */
void vmp_objpage_free(vm_map_t *map, struct vmp_objpage *opage);

/*! @brief Initialise an amap. */
int vmp_amap_init(vm_map_t *map, struct vm_amap *amap);

Expand Down

0 comments on commit 79dee7a

Please sign in to comment.