

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 |   20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)

diff -puN mm/mmigrate.c~P19-memsection_swapout mm/mmigrate.c
--- memhotplug/mm/mmigrate.c~P19-memsection_swapout	2004-10-12 10:11:20.000000000 -0700
+++ memhotplug-dave/mm/mmigrate.c	2004-10-12 10:11:20.000000000 -0700
@@ -416,10 +416,17 @@ int try_to_migrate_pages(struct list_hea
 {
 	struct page *page, *page2, *newpage;
 	struct address_space* mapping;
+	LIST_HEAD(discharge_list);
 	LIST_HEAD(pass1_list);
 	LIST_HEAD(pass2_list);
 	int nr_busy = 0;
 	int nr_noswap = 0;
+	struct scan_control sc = {
+		.nr_scanned	= 0,
+		.nr_reclaimed	= 0,
+		.priority	= GFP_ATOMIC,
+		.may_writepage	= 0,
+	};
 
 	current->flags |= PF_KSWAPD;    /*  It's fake */
 	list_for_each_entry_safe(page, page2, page_list, lru) {
@@ -431,13 +438,22 @@ int try_to_migrate_pages(struct list_hea
 			if (!TestSetPageLocked(page)) {
 				mapping = page_mapping(page);
 				if (!mapping || mapping->a_ops->migrate_page ||
-				    pageout(page, mapping) != PAGE_SUCCESS)
+				    pageout(page, mapping) != PAGE_SUCCESS) {
 					unlock_page(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.
_
