Index: linux-2.6.10-rc2-ck1/mm/vmscan.c
===================================================================
--- linux-2.6.10-rc2-ck1.orig/mm/vmscan.c	2004-11-15 21:49:18.000000000 +1100
+++ linux-2.6.10-rc2-ck1/mm/vmscan.c	2004-11-15 22:14:40.982470645 +1100
@@ -906,6 +906,8 @@ int try_to_free_pages(struct zone **zone
 	}
 
 	for (priority = DEF_PRIORITY; priority >= 0; priority--) {
+		int retry = 0;
+high_prio_retry:
 		sc.nr_mapped = read_page_state(nr_mapped);
 		sc.nr_scanned = 0;
 		sc.nr_reclaimed = 0;
@@ -938,6 +940,14 @@ int try_to_free_pages(struct zone **zone
 		/* Take a nap, wait for some writeback to complete */
 		if (sc.nr_scanned && priority < DEF_PRIORITY - 2)
 			blk_congestion_wait(WRITE, HZ/10);
+
+		/*
+		 * Crap we're down to PRIO 0 and we still haven't freed
+		 * enough. Try up to 4 more times.
+		 */
+		if (!priority && ++retry < 5)
+			goto high_prio_retry;
+
 	}
 	if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY))
 		out_of_memory(gfp_mask);
