diff options
author | Michael Foiani <mfoiani@cs.brown.edu> | 2024-05-14 23:12:24 -0400 |
---|---|---|
committer | Michael Foiani <mfoiani@cs.brown.edu> | 2024-05-14 23:12:24 -0400 |
commit | d28f705ee3b1c850e41b165bfb966572f0c6a815 (patch) | |
tree | 24ea51113fb929fe013bb090c9caacc55a227666 | |
parent | a27bbe631191814fe02990afccd9fe0565f6bdc5 (diff) |
small fixes and add locks
-rw-r--r-- | kernel/vm/pagefault.c | 7 | ||||
-rw-r--r-- | kernel/vm/shadow.c | 17 | ||||
-rw-r--r-- | kernel/vm/vmmap.c | 6 |
3 files changed, 9 insertions, 21 deletions
diff --git a/kernel/vm/pagefault.c b/kernel/vm/pagefault.c index 39e5776..4be12cd 100644 --- a/kernel/vm/pagefault.c +++ b/kernel/vm/pagefault.c @@ -91,17 +91,12 @@ void handle_pagefault(uintptr_t vaddr, uintptr_t cause) } // Obtain the corresponding pframe from the vmarea's mobj - long forwrite = 0; - if (cause & FAULT_WRITE) - { - forwrite = 1; - } pframe_t* pfp; mobj_lock(vma->vma_obj); long status = mobj_get_pframe( vma->vma_obj, pn - vma->vma_start + vma->vma_off, - forwrite, + (long) ((cause & FAULT_WRITE) ? 1 : 0), &pfp ); mobj_unlock(vma->vma_obj); diff --git a/kernel/vm/shadow.c b/kernel/vm/shadow.c index 4166597..e0a8674 100644 --- a/kernel/vm/shadow.c +++ b/kernel/vm/shadow.c @@ -128,10 +128,10 @@ void shadow_collapse(mobj_t *o) dbg(DBG_PRINT, "shadow_collapse: refcount bottom: %d\n", so->bottom_mobj->mo_refcount); - while (shadowed->mo_type == MOBJ_SHADOW) + while (shadowed && shadowed->mo_type == MOBJ_SHADOW) { - mobj_shadow_t *so_shadowed = MOBJ_TO_SO(shadowed); - mobj_t *shadowed_shadowed = so_shadowed->shadowed; + // mobj_shadow_t *so_shadowed = MOBJ_TO_SO(shadowed); + mobj_t *shadowed_shadowed = MOBJ_TO_SO(shadowed)->shadowed; // if the refcount is not 1, then we can't collapse if (shadowed_shadowed->mo_refcount != 1) @@ -157,19 +157,14 @@ void shadow_collapse(mobj_t *o) pframe_release(&pf_shadow); } } - mobj_unlock(shadowed_shadowed); - - if (shadowed_shadowed->mo_type != MOBJ_SHADOW) - { - // put the shadowed object - mobj_put(&shadowed); - break; - } // get the pointer to the shadowed object mobj_shadow_t *so_shadowed_shadowed = MOBJ_TO_SO(shadowed_shadowed); so->shadowed = shadowed_shadowed; + + mobj_lock(so->shadowed); mobj_ref(so->shadowed); + mobj_unlock(so->shadowed); // put the shadowed object mobj_put(&shadowed); diff --git a/kernel/vm/vmmap.c b/kernel/vm/vmmap.c index 34dfaa5..ad95d33 100644 --- a/kernel/vm/vmmap.c +++ b/kernel/vm/vmmap.c @@ -201,7 +201,6 @@ ssize_t vmmap_find_range(vmmap_t *map, size_t npages, int dir) // if the range exists, return the start if (contig_page == npages) { - KASSERT(start_page >= ADDR_TO_PN(USER_MEM_LOW)); return start_page; } } @@ -231,7 +230,6 @@ ssize_t vmmap_find_range(vmmap_t *map, size_t npages, int dir) // if there are n contiguous pages, return the current vfn if (contig == npages) { - KASSERT(vfn >= ADDR_TO_PN(USER_MEM_LOW)); return vfn; } } @@ -301,6 +299,8 @@ vmmap_t *vmmap_clone(vmmap_t *map) { // NOT_YET_IMPLEMENTED("VM: vmmap_clone"); + vmmap_collapse(map); + // Create a new vmmap vmmap_t *new_vmmap = vmmap_create(); if (new_vmmap == NULL) @@ -308,8 +308,6 @@ vmmap_t *vmmap_clone(vmmap_t *map) return NULL; } - vmmap_collapse(map); - // Iterate over the list of vmareas list_iterate(&map->vmm_list, vma, vmarea_t, vma_plink) { |