Index: linux-2.6.19-rc5-mm2/mm/page-writeback.c
===================================================================
--- linux-2.6.19-rc5-mm2.orig/mm/page-writeback.c	2006-11-15 16:48:13.000000000 -0600
+++ linux-2.6.19-rc5-mm2/mm/page-writeback.c	2006-11-15 22:03:30.840066271 -0600
@@ -74,6 +74,11 @@ int dirty_background_ratio = 10;
 int vm_dirty_ratio = 40;
 
 /*
+ * The generator of dirty data starts writeback at this percentage
+ */
+int vm_per_node_dirty_ratio = 60;
+
+/*
  * The interval between `kupdate'-style writebacks, in jiffies
  */
 int dirty_writeback_interval = 5 * HZ;
@@ -119,7 +124,7 @@ static void background_writeout(unsigned
  * clamping level.
  */
 static void
-get_dirty_limits(long *pbackground, long *pdirty,
+get_dirty_limits(long *pbackground, long *pdirty, long *pndirty,
 					struct address_space *mapping)
 {
 	int background_ratio;		/* Percentages */
@@ -127,6 +132,7 @@ get_dirty_limits(long *pbackground, long
 	int unmapped_ratio;
 	long background;
 	long dirty;
+	long node_dirty;
 	unsigned long available_memory = vm_total_pages;
 	struct task_struct *tsk;
 
@@ -157,13 +163,16 @@ get_dirty_limits(long *pbackground, long
 
 	background = (background_ratio * available_memory) / 100;
 	dirty = (dirty_ratio * available_memory) / 100;
+	node_dirty = vm_node_dirty_ratio * LOCAL_DATA(node_pages() / 100;
 	tsk = current;
 	if (tsk->flags & PF_LESS_THROTTLE || rt_task(tsk)) {
 		background += background / 4;
 		dirty += dirty / 4;
+		node_dirty += node_dirty / 4;
 	}
 	*pbackground = background;
 	*pdirty = dirty;
+	*pndirty = node_dirty;
 }
 
 /*