aboutsummaryrefslogtreecommitdiff
path: root/kernel/mm
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mm')
-rw-r--r--kernel/mm/mobj.c26
-rw-r--r--kernel/mm/pagecache.c7
2 files changed, 23 insertions, 10 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
*/
diff --git a/kernel/mm/pagecache.c b/kernel/mm/pagecache.c
index b1763ba..e3bf73e 100644
--- a/kernel/mm/pagecache.c
+++ b/kernel/mm/pagecache.c
@@ -14,10 +14,3 @@ long pagecache_get_page(pframe_t *pf) {
KASSERT(0 && "page not in pagecache");
return 0;
}
-
-#ifdef NO
-void pagecache_newsource(pframe_t pf, blockdev_t *dev, long loc) {
- pf->pf_srcdev.pf_dev = dev;
- pf->pf_loc = loc;
-}
-#endif \ No newline at end of file