Index: linux-2.6.11-rc3-ck1/include/linux/mmzone.h
===================================================================
--- linux-2.6.11-rc3-ck1.orig/include/linux/mmzone.h	2005-02-03 21:41:29.000000000 +1100
+++ linux-2.6.11-rc3-ck1/include/linux/mmzone.h	2005-02-03 21:45:51.400548915 +1100
@@ -110,7 +110,7 @@ struct per_cpu_pageset {
 struct zone {
 	/* Fields commonly accessed by the page allocator */
 	unsigned long		free_pages;
-	unsigned long		pages_min, pages_low, pages_high;
+	unsigned long		pages_min, pages_low, pages_high, pages_lots;
 	/*
 	 * We don't know if the memory that we're going to allocate will be freeable
 	 * or/and it will be released eventually, so to avoid totally wasting several
Index: linux-2.6.11-rc3-ck1/include/linux/swap.h
===================================================================
--- linux-2.6.11-rc3-ck1.orig/include/linux/swap.h	2004-12-25 10:14:51.000000000 +1100
+++ linux-2.6.11-rc3-ck1/include/linux/swap.h	2005-02-03 21:45:51.400548915 +1100
@@ -174,7 +174,8 @@ extern void swap_setup(void);
 /* linux/mm/vmscan.c */
 extern int try_to_free_pages(struct zone **, unsigned int, unsigned int);
 extern int shrink_all_memory(int);
-extern int vm_swappiness;
+extern int vm_mapped;
+extern int vm_hardmaplimit;
 
 #ifdef CONFIG_MMU
 /* linux/mm/shmem.c */
Index: linux-2.6.11-rc3-ck1/include/linux/sysctl.h
===================================================================
--- linux-2.6.11-rc3-ck1.orig/include/linux/sysctl.h	2005-02-03 21:44:45.415324540 +1100
+++ linux-2.6.11-rc3-ck1/include/linux/sysctl.h	2005-02-03 21:46:21.260672892 +1100
@@ -163,7 +163,7 @@ enum
 	VM_OVERCOMMIT_RATIO=16, /* percent of RAM to allow overcommit in */
 	VM_PAGEBUF=17,		/* struct: Control pagebuf parameters */
 	VM_HUGETLB_PAGES=18,	/* int: Number of available Huge Pages */
-	VM_SWAPPINESS=19,	/* Tendency to steal mapped memory */
+	VM_MAPPED=19,		/* percent mapped min while evicting cache */
 	VM_LOWMEM_RESERVE_RATIO=20,/* reservation ratio for lower memory zones */
 	VM_MIN_FREE_KBYTES=21,	/* Minimum free kilobytes to maintain */
 	VM_MAX_MAP_COUNT=22,	/* int: Maximum number of mmaps/address-space */
@@ -173,7 +173,8 @@ enum
 	VM_VFS_CACHE_PRESSURE=26, /* dcache/icache reclaim pressure */
 	VM_LEGACY_VA_LAYOUT=27, /* legacy/compatibility virtual address space layout */
 	VM_SWAP_TOKEN_TIMEOUT=28, /* default time for token time out */
-};
+	VM_HARDMAPLIMIT=29,	/* Make mapped a hard limit */
+ };
 
 
 /* CTL_NET names: */
Index: linux-2.6.11-rc3-ck1/kernel/sysctl.c
===================================================================
--- linux-2.6.11-rc3-ck1.orig/kernel/sysctl.c	2005-02-03 21:44:45.420323723 +1100
+++ linux-2.6.11-rc3-ck1/kernel/sysctl.c	2005-02-03 21:45:51.402548589 +1100
@@ -747,16 +747,24 @@ static ctl_table vm_table[] = {
 		.proc_handler	= &proc_dointvec,
 	},
 	{
-		.ctl_name	= VM_SWAPPINESS,
-		.procname	= "swappiness",
-		.data		= &vm_swappiness,
-		.maxlen		= sizeof(vm_swappiness),
+		.ctl_name	= VM_MAPPED,
+		.procname	= "mapped",
+		.data		= &vm_mapped,
+		.maxlen		= sizeof(vm_mapped),
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec_minmax,
 		.strategy	= &sysctl_intvec,
 		.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.11-rc3-ck1/mm/page_alloc.c
===================================================================
--- linux-2.6.11-rc3-ck1.orig/mm/page_alloc.c	2005-02-03 21:41:30.000000000 +1100
+++ linux-2.6.11-rc3-ck1/mm/page_alloc.c	2005-02-03 21:45:51.403548426 +1100
@@ -1988,6 +1988,7 @@ static void setup_per_zone_pages_min(voi
 		 */
 		zone->pages_low   = (zone->pages_min * 5) / 4;
 		zone->pages_high  = (zone->pages_min * 6) / 4;
+		zone->pages_lots  = (zone->pages_min * 12) / 4;
 		spin_unlock_irqrestore(&zone->lru_lock, flags);
 	}
 }
Index: linux-2.6.11-rc3-ck1/mm/vmscan.c
===================================================================
--- linux-2.6.11-rc3-ck1.orig/mm/vmscan.c	2005-02-03 21:41:30.000000000 +1100
+++ linux-2.6.11-rc3-ck1/mm/vmscan.c	2005-02-03 21:45:51.404548262 +1100
@@ -115,10 +115,8 @@ struct shrinker {
 #define prefetchw_prev_lru_page(_page, _base, _field) do { } while (0)
 #endif
 
-/*
- * From 0 .. 100.  Higher means more swappy.
- */
-int vm_swappiness = 60;
+int vm_mapped = 66;
+int vm_hardmaplimit = 0;
 static long total_memory;
 
 static LIST_HEAD(shrinker_list);
@@ -698,10 +696,13 @@ refill_inactive_zone(struct zone *zone, 
 	 * doesn't necessarily mean that page reclaim isn't succeeding.
 	 *
 	 * The distress ratio is important - we don't want to start going oom.
+	 * This distress value is ignored if we apply a hardmaplimit.
 	 *
-	 * A 100% value of vm_swappiness overrides this algorithm altogether.
+	 * A 0% value of vm_mapped overrides this algorithm altogether.
 	 */
-	swap_tendency = mapped_ratio / 2 + distress + vm_swappiness;
+	swap_tendency = mapped_ratio * 100 / (vm_mapped + 1);
+	if (!vm_hardmaplimit)
+		swap_tendency += distress;
 
 	/*
 	 * Now use this metric to decide whether to start moving mapped memory
@@ -1014,8 +1015,23 @@ loop_again:
 						priority != DEF_PRIORITY)
 					continue;
 
+				/*
+				 * The pages_lots watermark is relaxed
+				 * till it drops to pages_high under anything
+				 * but very light stress (DEF_PRIORITY)
+				 */
+				if (priority != DEF_PRIORITY &&
+					zone->free_pages <= zone->pages_lots &&
+					zone->pages_lots > zone->pages_high) {
+						spin_lock(&zone->lru_lock);
+						zone->pages_lots = 
+							zone->free_pages - 1;
+						spin_unlock(&zone->lru_lock);
+				}
+					
+
 				if (!zone_watermark_ok(zone, order,
-						zone->pages_high, 0, 0, 0)) {
+						zone->pages_lots, 0, 0, 0)) {
 					end_zone = i;
 					goto scan;
 				}
