diff options
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 */ |