aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/vm/shadow.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/kernel/vm/shadow.c b/kernel/vm/shadow.c
index ca20ab0..77adef7 100644
--- a/kernel/vm/shadow.c
+++ b/kernel/vm/shadow.c
@@ -136,10 +136,12 @@ void shadow_collapse(mobj_t *o)
// mobj_lock(next); // lock before iterover
list_iterate(&next->mo_pframes, pf, pframe_t, pf_link)
{
+ // see if shadow pframe is in the current shadow object
pframe_t *pf_shadow = NULL;
mobj_lock(&so->mobj);
mobj_find_pframe(&so->mobj, pf->pf_pagenum, &pf_shadow);
mobj_unlock(&so->mobj);
+ // if so, migrate it
if (!pf_shadow)
{
list_remove(&pf->pf_link);
@@ -148,7 +150,7 @@ void shadow_collapse(mobj_t *o)
}
else
{
- // if it exists, just release it
+ // if already exists, just release the version we will remove
pframe_release(&pf_shadow);
}
}
@@ -158,9 +160,9 @@ void shadow_collapse(mobj_t *o)
// update the refcounts
mobj_ref(so->shadowed);
- mobj_put(&next);
+ mobj_put(&next); // "remove" the next
- // update next
+ // update next for next iter, now that it's removed
next = so->shadowed;
}
}