diff options
author | sotech117 <26747948+sotech117@users.noreply.github.com> | 2024-04-25 03:45:32 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-25 03:45:32 -0400 |
commit | c9f4da6024393310e254a2cba679b1f1cc67607a (patch) | |
tree | 6f7a61225676b9578c0e0c46cdd54a10bad9c9e3 /kernel/mm/mobj.c | |
parent | a17999858ddaada83071d953d920e3c2a2b390c8 (diff) | |
parent | fb4b8fbec69f50c7386017896f0add4d46314a1d (diff) |
Merge branch 'brown-cs1690:master' into master
Diffstat (limited to 'kernel/mm/mobj.c')
-rw-r--r-- | kernel/mm/mobj.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/kernel/mm/mobj.c b/kernel/mm/mobj.c index 4b9c80f..83addd5 100644 --- a/kernel/mm/mobj.c +++ b/kernel/mm/mobj.c @@ -122,9 +122,6 @@ long mobj_get_pframe(mobj_t *o, uint64_t pagenum, long forwrite, * Create and initialize a pframe and add it to the mobj's mo_pframes list. * Upon successful return, the pframe's pf_mutex is locked. */ -#ifdef OLD -static void mobj_create_pframe(mobj_t *o, uint64_t pagenum, pframe_t **pfp) -#endif void mobj_create_pframe(mobj_t *o, uint64_t pagenum, uint64_t loc, pframe_t **pfp) { KASSERT(kmutex_owns_mutex(&o->mo_mutex)); @@ -285,6 +282,29 @@ long mobj_free_pframe(mobj_t *o, pframe_t **pfp) return 0; } +void mobj_delete_pframe(mobj_t *o, size_t pagenum) +{ + pframe_t *pf = NULL; + list_iterate(&o->mo_pframes, p, pframe_t, pf_link) + { + if (p->pf_pagenum == pagenum) + pf = p; + } + + if (pf) + { + kmutex_lock(&pf->pf_mutex); + list_remove(&pf->pf_link); + + pf->pf_dirty = 0; + if (pf->pf_addr) + { + page_free(pf->pf_addr); + pf->pf_addr = NULL; + } + pframe_free(&pf); + } +} /* * Simply flush the memory object */ |