From c9eb0848a356cd7c32d7f4be389c964f9d568434 Mon Sep 17 00:00:00 2001 From: Michael Foiani Date: Wed, 15 May 2024 00:11:09 -0400 Subject: improve efficiency of shadow collapse --- kernel/vm/shadow.c | 8 +++++--- 1 file 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; } } -- cgit v1.2.3-70-g09d2