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 /kernel/vm/shadow.c | |
parent | a27bbe631191814fe02990afccd9fe0565f6bdc5 (diff) |
small fixes and add locks
Diffstat (limited to 'kernel/vm/shadow.c')
-rw-r--r-- | kernel/vm/shadow.c | 17 |
1 files changed, 6 insertions, 11 deletions
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); |