Destroys vmrs on __proc_free()
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 4 Aug 2010 23:08:31 +0000 (16:08 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:50 +0000 (17:35 -0700)
kern/include/mm.h
kern/src/mm.c
kern/src/process.c

index 69da2ea..bcc5b52 100644 (file)
@@ -57,6 +57,7 @@ void destroy_vmr(struct vm_region *vmr);
 struct vm_region *find_vmr(struct proc *p, uintptr_t va);
 struct vm_region *find_first_vmr(struct proc *p, uintptr_t va);
 void isolate_vmrs(struct proc *p, uintptr_t va, size_t len);
+void destroy_vmrs(struct proc *p);
 void duplicate_vmrs(struct proc *p, struct proc *new_p);
 void print_vmrs(struct proc *p);
 
index 1f118e6..2d6a0ba 100644 (file)
@@ -226,6 +226,15 @@ void isolate_vmrs(struct proc *p, uintptr_t va, size_t len)
                split_vmr(vmr, va + len);
 }
 
+/* Destroys all vmrs of a process - important for when files are mmap()d and
+ * probably later when we share memory regions */
+void destroy_vmrs(struct proc *p)
+{
+       struct vm_region *vm_i;
+       TAILQ_FOREACH(vm_i, &p->vm_regions, vm_link)
+               destroy_vmr(vm_i);
+}
+
 /* This will make new_p have the same VMRs as p, though it does nothing to
  * ensure the physical pages or whatever are shared/mapped/copied/whatever.
  * This is used by fork().
index 2a9bef5..1f353cd 100644 (file)
@@ -366,6 +366,7 @@ static void __proc_free(struct kref *kref)
        assert(atomic_read(&p->kref.refcount) == 0);
 
        close_all_files(&p->open_files);
+       destroy_vmrs(p);
        frontend_proc_free(p);  /* TODO: please remove me one day */
        /* Free any colors allocated to this process */
        if(p->cache_colors_map != global_cache_colors_map) {