diff -purN -X /home/mbligh/.diff.exclude 280-gcov/include/linux/gfp.h 290-gfp_node_strict/include/linux/gfp.h
--- 280-gcov/include/linux/gfp.h	2003-11-18 12:02:46.000000000 -0800
+++ 290-gfp_node_strict/include/linux/gfp.h	2003-11-18 12:03:09.000000000 -0800
@@ -32,6 +32,7 @@
 #define __GFP_NOFAIL	0x800	/* Retry for ever.  Cannot fail */
 #define __GFP_NORETRY	0x1000	/* Do not retry.  Might fail */
 #define __GFP_NO_GROW	0x2000	/* Slab internal usage */
+#define __GFP_NODE_STRICT 0x4000 /* Do not fall back to other nodes */
 
 #define __GFP_BITS_SHIFT 16	/* Room for 16 __GFP_FOO bits */
 #define __GFP_BITS_MASK ((1 << __GFP_BITS_SHIFT) - 1)
diff -purN -X /home/mbligh/.diff.exclude 280-gcov/mm/page_alloc.c 290-gfp_node_strict/mm/page_alloc.c
--- 280-gcov/mm/page_alloc.c	2003-11-18 12:02:03.000000000 -0800
+++ 290-gfp_node_strict/mm/page_alloc.c	2003-11-18 12:03:09.000000000 -0800
@@ -564,6 +564,10 @@ __alloc_pages(unsigned int gfp_mask, uns
 		struct zone *z = zones[i];
 		unsigned long local_low;
 
+		if ((__GFP_NODE_STRICT & gfp_mask) &&
+		    (pfn_to_nid(z->zone_start_pfn) != numa_node_id()))
+			continue;
+
 		/*
 		 * This is the fabled 'incremental min'. We let real-time tasks
 		 * dip their real-time paws a little deeper into reserves.