aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Foiani <mfoiani@cs.brown.edu>2024-05-15 00:11:09 -0400
committerMichael Foiani <mfoiani@cs.brown.edu>2024-05-15 00:11:09 -0400
commitc9eb0848a356cd7c32d7f4be389c964f9d568434 (patch)
treebb06ada5e68b5c2d2fd13c34a43a544076bc2ed9
parent712b08007bd8101a624a14ecf1f829d4083e1696 (diff)
improve efficiency of shadow collapse
-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;
}
}