aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Foiani <mfoiani@cs.brown.edu>2024-05-14 23:12:24 -0400
committerMichael Foiani <mfoiani@cs.brown.edu>2024-05-14 23:12:24 -0400
commitd28f705ee3b1c850e41b165bfb966572f0c6a815 (patch)
tree24ea51113fb929fe013bb090c9caacc55a227666
parenta27bbe631191814fe02990afccd9fe0565f6bdc5 (diff)
small fixes and add locks
-rw-r--r--kernel/vm/pagefault.c7
-rw-r--r--kernel/vm/shadow.c17
-rw-r--r--kernel/vm/vmmap.c6
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)
{