Index: linux-2.6.9-rc2-mm2/include/linux/swap.h
===================================================================
--- linux-2.6.9-rc2-mm2.orig/include/linux/swap.h	2004-09-24 09:13:21.868275982 +1000
+++ linux-2.6.9-rc2-mm2/include/linux/swap.h	2004-09-24 09:13:27.212438977 +1000
@@ -175,6 +175,7 @@ extern void swap_setup(void);
 extern int try_to_free_pages(struct zone **, unsigned int, unsigned int);
 extern int shrink_all_memory(int);
 extern int vm_mapped;
+extern int vm_hardmaplimit;
 
 #ifdef CONFIG_MMU
 /* linux/mm/shmem.c */
Index: linux-2.6.9-rc2-mm2/include/linux/sysctl.h
===================================================================
--- linux-2.6.9-rc2-mm2.orig/include/linux/sysctl.h	2004-09-24 09:13:21.868275982 +1000
+++ linux-2.6.9-rc2-mm2/include/linux/sysctl.h	2004-09-24 09:13:27.212438977 +1000
@@ -169,6 +169,7 @@ enum
 	VM_HUGETLB_GROUP=25,	/* permitted hugetlb group */
 	VM_VFS_CACHE_PRESSURE=26, /* dcache/icache reclaim pressure */
 	VM_LEGACY_VA_LAYOUT=27, /* legacy/compatibility virtual address space layout */
+	VM_HARDMAPLIMIT=28,	/* Make mapped a hard limit */
 };
 
 
Index: linux-2.6.9-rc2-mm2/kernel/sysctl.c
===================================================================
--- linux-2.6.9-rc2-mm2.orig/kernel/sysctl.c	2004-09-24 09:13:21.869275825 +1000
+++ linux-2.6.9-rc2-mm2/kernel/sysctl.c	2004-09-24 09:13:27.213438820 +1000
@@ -731,6 +731,14 @@ static ctl_table vm_table[] = {
 		.extra1		= &zero,
 		.extra2		= &one_hundred,
 	},
+	{
+		.ctl_name	= VM_HARDMAPLIMIT,
+		.procname	= "hardmaplimit",
+		.data		= &vm_hardmaplimit,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
 #ifdef CONFIG_HUGETLB_PAGE
 	 {
 		.ctl_name	= VM_HUGETLB_PAGES,
Index: linux-2.6.9-rc2-mm2/mm/vmscan.c
===================================================================
--- linux-2.6.9-rc2-mm2.orig/mm/vmscan.c	2004-09-24 09:13:21.872275356 +1000
+++ linux-2.6.9-rc2-mm2/mm/vmscan.c	2004-09-24 09:13:27.214438663 +1000
@@ -118,6 +118,7 @@ struct shrinker {
 #endif
 
 int vm_mapped = 66;
+int vm_hardmaplimit = 1;
 static long total_memory;
 
 static LIST_HEAD(shrinker_list);
@@ -650,6 +651,7 @@ refill_inactive_zone(struct zone *zone, 
 	int pgdeactivate = 0;
 	int pgscanned = 0;
 	int nr_pages = sc->nr_to_scan;
+	unsigned int mapped_ratio;
 	LIST_HEAD(l_hold);	/* The pages which were snipped off */
 	LIST_HEAD(l_inactive);	/* Pages to go onto the inactive_list */
 	LIST_HEAD(l_active);	/* Pages to go onto the active_list */
@@ -684,6 +686,7 @@ refill_inactive_zone(struct zone *zone, 
 	zone->nr_active -= pgmoved;
 	spin_unlock_irq(&zone->lru_lock);
 
+	mapped_ratio = (sc->nr_mapped * 100) / total_memory;
 
 	while (!list_empty(&l_hold)) {
 		cond_resched();
@@ -691,6 +694,7 @@ refill_inactive_zone(struct zone *zone, 
 		list_del(&page->lru);
 		if (page_mapped(page)) {
 			if (zone->zone_pgdat->mapped_nrpages ||
+			    (vm_hardmaplimit && mapped_ratio < vm_mapped) ||
 			    (total_swap_pages == 0 && PageAnon(page)) ||
 			    page_referenced(page, 0)) {
 				list_add(&page->lru, &l_active);
