From d28f705ee3b1c850e41b165bfb966572f0c6a815 Mon Sep 17 00:00:00 2001 From: Michael Foiani Date: Tue, 14 May 2024 23:12:24 -0400 Subject: small fixes and add locks --- kernel/vm/shadow.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'kernel/vm/shadow.c') 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); -- cgit v1.2.3-70-g09d2