shmobj: Don't page_unmap() when count isn't one in shmobj_destroy()

Change-Id: If9d567d61e1dc4db808a2aeee290034acf7be4b5
This commit is contained in:
Masamichi Takagi
2019-02-07 15:14:00 +09:00
committed by Dominique Martinet
parent 366e95856c
commit 501531f3b3

View File

@ -244,6 +244,7 @@ static void shmobj_destroy(struct shmobj *obj)
}
shmlock_users_unlock();
}
/* zap page_list */
npages = (size_t)1 << (obj->pgshift - PAGE_SHIFT);
for (;;) {
@ -263,13 +264,13 @@ static void shmobj_destroy(struct shmobj *obj)
if (ihk_atomic_read(&page->count) != 1) {
kprintf("%s: WARNING: page count for phys 0x%lx is invalid\n",
__FUNCTION__, page->phys);
}
} else if (page_unmap(page)) {
/* Other call sites of page_unmap are:
* (1) MADV_REMOVE --> ... --> ihk_mc_pt_free_range()
* (2) do_munmap --> ... --> free_process_memory_range()
* (3) terminate() --> ... --> free_process_memory_range()
*/
/* Other call sites of page_unmap are:
* (1) MADV_REMOVE --> ... --> ihk_mc_pt_free_range()
* (2) munmap --> ... --> free_process_memory_range()
*/
if (page_unmap(page)) {
size_t free_pgsize = 1UL << obj->pgshift;
size_t free_size = 1UL << obj->pgshift;
@ -280,6 +281,7 @@ static void shmobj_destroy(struct shmobj *obj)
memory_stat_rss_sub(free_size, free_pgsize);
kfree(page);
}
#if 0
dkprintf("shmobj_destroy(%p):"
"release page. %p %#lx %d %d",
@ -415,7 +417,10 @@ static int shmobj_get_page(struct memobj *memobj, off_t off, int p2align,
memset(virt, 0, npages*PAGE_SIZE);
page->mode = PM_MAPPED;
page->offset = off;
/* Page contents should survive over unmap */
ihk_atomic_set(&page->count, 1);
ihk_atomic64_set(&page->mapped, 0);
page_list_insert(obj, page);
virt = NULL;