Index: linux-2.6.8-rc1/mm/vmscan.c
===================================================================
--- linux-2.6.8-rc1.orig/mm/vmscan.c	2004-07-15 09:59:34.820962044 +1000
+++ linux-2.6.8-rc1/mm/vmscan.c	2004-07-15 10:03:06.243433612 +1000
@@ -119,6 +119,7 @@
  * From 0 .. 100.  Higher means more swappy.
  */
 int vm_swappiness = 60;
+static int mapped_bias;
 static long total_memory;
 
 static LIST_HEAD(shrinker_list);
@@ -646,6 +647,7 @@
 	struct page *page;
 	struct pagevec pvec;
 	int reclaim_mapped = 0;
+	int swappiness_bias;
 	long mapped_ratio;
 	long distress;
 	long swap_tendency;
@@ -690,6 +692,7 @@
 	 * is mapped.
 	 */
 	mapped_ratio = (sc->nr_mapped * 100) / total_memory;
+	mapped_bias = mapped_ratio * mapped_ratio;
 
 	/*
 	 * Now decide how much we really want to unmap some pages.  The mapped
@@ -700,7 +703,9 @@
 	 *
 	 * A 100% value of vm_swappiness overrides this algorithm altogether.
 	 */
-	swap_tendency = mapped_ratio / 2 + distress + vm_swappiness;
+	swappiness_bias = vm_swappiness * vm_swappiness / 100;
+	swappiness_bias = 101 - swappiness_bias;
+	swap_tendency = distress + mapped_bias / swappiness_bias;
 
 	/*
 	 * Now use this metric to decide whether to start moving mapped memory
