From f4db8b96de7047c48ba76a6f63af8afdb1b5f322 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Tue, 13 Sep 2016 00:05:51 -0400 Subject: [PATCH] fileobj/shmobj: release pages correctly according to dynamic page frame management --- kernel/fileobj.c | 14 +++++++++++++- kernel/shmobj.c | 12 ++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/kernel/fileobj.c b/kernel/fileobj.c index 2480491f..9b181115 100644 --- a/kernel/fileobj.c +++ b/kernel/fileobj.c @@ -258,6 +258,7 @@ static void fileobj_release(struct memobj *memobj) /* zap page_list */ for (;;) { struct page *page; + void *page_va; int count; page = page_list_first(obj); @@ -265,6 +266,17 @@ static void fileobj_release(struct memobj *memobj) break; } page_list_remove(obj, page); + page_va = phys_to_virt(page_to_phys(page)); + + if (ihk_atomic_read(&page->count) != 1) { + kprintf("%s: WARNING: page count for phys 0x%lx is invalid\n", + __FUNCTION__, page->phys); + } + + if (page_unmap(page)) { + ihk_mc_free_pages(page_va, 1); + } +#if 0 count = ihk_atomic_sub_return(1, &page->count); if (!((page->mode == PM_WILL_PAGEIO) @@ -281,7 +293,7 @@ static void fileobj_release(struct memobj *memobj) } page->mode = PM_NONE; - ihk_mc_free_pages(phys_to_virt(page_to_phys(page)), 1); +#endif } obj_list_remove(free_obj); ihk_mc_spinlock_unlock_noirq(&fileobj_list_lock); diff --git a/kernel/shmobj.c b/kernel/shmobj.c index f87b9b7d..0d39428f 100644 --- a/kernel/shmobj.c +++ b/kernel/shmobj.c @@ -240,6 +240,7 @@ void shmobj_destroy(struct shmobj *obj) npages = (size_t)1 << (obj->pgshift - PAGE_SHIFT); for (;;) { struct page *page; + void *page_va; int count; page = page_list_first(obj); @@ -247,7 +248,17 @@ void shmobj_destroy(struct shmobj *obj) break; } page_list_remove(obj, page); + page_va = phys_to_virt(page_to_phys(page)); + if (ihk_atomic_read(&page->count) != 1) { + kprintf("%s: WARNING: page count for phys 0x%lx is invalid\n", + __FUNCTION__, page->phys); + } + + if (page_unmap(page)) { + ihk_mc_free_pages(page_va, npages); + } +#if 0 dkprintf("shmobj_destroy(%p):" "release page. %p %#lx %d %d", obj, page, page_to_phys(page), @@ -266,6 +277,7 @@ void shmobj_destroy(struct shmobj *obj) page->mode = PM_NONE; ihk_mc_free_pages(phys_to_virt(page_to_phys(page)), npages); +#endif } if (obj->index < 0) { kfree(obj);