Try to free inactive pages when migrating pages. These pages can be freed if they are clean and not referenced. Signed-off-by: Hirokazu Takahashi Signed-off-by: Dave Hansen --- memhotplug-dave/mm/mmigrate.c | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletion(-) diff -puN mm/mmigrate.c~AA-PM-19.0-memsection_swapout mm/mmigrate.c --- memhotplug/mm/mmigrate.c~AA-PM-19.0-memsection_swapout 2005-07-28 13:50:50.000000000 -0700 +++ memhotplug-dave/mm/mmigrate.c 2005-07-28 13:50:50.000000000 -0700 @@ -461,15 +461,31 @@ int try_to_migrate_pages(struct list_hea struct page *page, *page2, *newpage; LIST_HEAD(pass1_list); LIST_HEAD(pass2_list); + LIST_HEAD(discharge_list); int nr_busy = 0; int nr_noswap = 0; + struct scan_control sc = { + .nr_scanned = 0, + .nr_reclaimed = 0, + .gfp_mask = GFP_ATOMIC, + .may_writepage = 0, + }; + current->flags |= PF_KSWAPD; /* It's fake */ list_for_each_entry_safe(page, page2, page_list, lru) { page_start_writeback(page); list_del(&page->lru); - list_add(&page->lru, &pass1_list); + if (PageActive(page)) + list_add(&page->lru, &pass1_list); + else + list_add(&page->lru, &discharge_list); } + /* + * Try to free inactive pages only. + */ + shrink_list(&discharge_list, &sc); + list_splice(&discharge_list, &pass1_list); /* * Try to migrate easily movable pages first. _