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-12-02 14:56:43.000000000 -0800 +++ 290-gfp_node_strict/include/linux/gfp.h 2003-12-02 14:57:36.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-12-02 14:54:36.000000000 -0800 +++ 290-gfp_node_strict/mm/page_alloc.c 2003-12-02 14:57:36.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.