diff options
author | Michael Foiani <mfoiani@cs.brown.edu> | 2024-05-15 00:11:09 -0400 |
---|---|---|
committer | Michael Foiani <mfoiani@cs.brown.edu> | 2024-05-15 00:11:09 -0400 |
commit | c9eb0848a356cd7c32d7f4be389c964f9d568434 (patch) | |
tree | bb06ada5e68b5c2d2fd13c34a43a544076bc2ed9 | |
parent | 712b08007bd8101a624a14ecf1f829d4083e1696 (diff) |
improve efficiency of shadow collapse
-rw-r--r-- | kernel/vm/shadow.c | 8 |
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; } } |