pm: Implement pm_destroy()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 29 Mar 2018 15:33:57 +0000 (11:33 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Apr 2018 18:36:28 +0000 (14:36 -0400)
We had been just leaking memory.  Though it is hard to see this, since all
of the pages are actually just sitting in slab magazines, and not freed all
the way back to the arenas.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/pagemap.c

index 5662983..c56353f 100644 (file)
@@ -613,9 +613,21 @@ handle_dirty:
        return nr_removed;
 }
 
+static bool __destroy_cb(void **slot, unsigned long tree_idx, void *arg)
+{
+       struct page *page = pm_slot_get_page(*slot);
+
+       /* Should be no users or need to sync */
+       assert(pm_slot_check_refcnt(*slot) == 0);
+       atomic_set(&page->pg_flags, 0); /* catch bugs */
+       page_decref(page);
+       return true;
+}
+
 void pm_destroy(struct page_map *pm)
 {
-       /* TODO: implement me! */
+       radix_for_each_slot(&pm->pm_tree, __destroy_cb, pm);
+       radix_tree_destroy(&pm->pm_tree);
 }
 
 void print_page_map_info(struct page_map *pm)