Index: linux-2.6.9-rc2-mm1/include/linux/swap.h
===================================================================
--- linux-2.6.9-rc2-mm1.orig/include/linux/swap.h	2004-09-21 11:28:45.758428784 +1000
+++ linux-2.6.9-rc2-mm1/include/linux/swap.h	2004-09-21 12:24:12.834636320 +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-mm1/include/linux/sysctl.h
===================================================================
--- linux-2.6.9-rc2-mm1.orig/include/linux/sysctl.h	2004-09-21 11:28:45.761428328 +1000
+++ linux-2.6.9-rc2-mm1/include/linux/sysctl.h	2004-09-21 12:25:16.084020952 +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-mm1/kernel/sysctl.c
===================================================================
--- linux-2.6.9-rc2-mm1.orig/kernel/sysctl.c	2004-09-21 11:28:45.763428024 +1000
+++ linux-2.6.9-rc2-mm1/kernel/sysctl.c	2004-09-21 12:24:12.836636016 +1000
@@ -714,6 +714,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-mm1/mm/vmscan.c
===================================================================
--- linux-2.6.9-rc2-mm1.orig/mm/vmscan.c	2004-09-21 11:28:45.855414040 +1000
+++ linux-2.6.9-rc2-mm1/mm/vmscan.c	2004-09-21 12:26:56.883697072 +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);

