

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 <taka@valinux.co.jp>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 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-03-28 16:38:26.000000000 -0800
+++ memhotplug-dave/mm/mmigrate.c	2005-03-28 16:38:26.000000000 -0800
@@ -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.
_
