From f300574f30f374787ad2dbb39d4f1968ccb9b3de Mon Sep 17 00:00:00 2001 From: Christoph Lameter Date: Mon, 25 Sep 2006 23:31:40 -0700 Subject: [PATCH] --- yaml --- r: 35615 b: refs/heads/master c: 9b819d204cf602eab1a53a9ec4b8d2ca51e02a1d h: refs/heads/master i: 35613: 1405dc8a58998a2ec2b91c9a45269f6a82df03f8 35611: 6f9c095da0c3929cd1682bfe5efe62fd7f1a158e 35607: d3f0105bd7c4adb2bd5830a19772ce7638dd2bf6 35599: 323bfcc08a07a7d0a41317e5628bb10b92038db3 35583: f5b7725a8b4d523f83c3f4939f62431c97ad7f33 v: v3 --- [refs] | 2 +- trunk/include/linux/gfp.h | 3 ++- trunk/kernel/cpuset.c | 2 +- trunk/mm/mempolicy.c | 2 +- trunk/mm/page_alloc.c | 3 +++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 9e8f9e27cbd4..7d5a90a78778 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 056c62418cc639bf2fe962c6a6ee56054b838bc7 +refs/heads/master: 9b819d204cf602eab1a53a9ec4b8d2ca51e02a1d diff --git a/trunk/include/linux/gfp.h b/trunk/include/linux/gfp.h index 63ab88a36f39..0eda5b6dedbd 100644 --- a/trunk/include/linux/gfp.h +++ b/trunk/include/linux/gfp.h @@ -45,6 +45,7 @@ struct vm_area_struct; #define __GFP_ZERO ((__force gfp_t)0x8000u)/* Return zeroed page on success */ #define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */ #define __GFP_HARDWALL ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */ +#define __GFP_THISNODE ((__force gfp_t)0x40000u)/* No fallback, no policies */ #define __GFP_BITS_SHIFT 20 /* Room for 20 __GFP_FOO bits */ #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) @@ -53,7 +54,7 @@ struct vm_area_struct; #define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \ __GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \ __GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP| \ - __GFP_NOMEMALLOC|__GFP_HARDWALL) + __GFP_NOMEMALLOC|__GFP_HARDWALL|__GFP_THISNODE) /* This equals 0, but use constants in case they ever change */ #define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH) diff --git a/trunk/kernel/cpuset.c b/trunk/kernel/cpuset.c index 4ea6f0dc2fc5..76940361273e 100644 --- a/trunk/kernel/cpuset.c +++ b/trunk/kernel/cpuset.c @@ -2316,7 +2316,7 @@ int __cpuset_zone_allowed(struct zone *z, gfp_t gfp_mask) const struct cpuset *cs; /* current cpuset ancestors */ int allowed; /* is allocation in zone z allowed? */ - if (in_interrupt()) + if (in_interrupt() || (gfp_mask & __GFP_THISNODE)) return 1; node = z->zone_pgdat->node_id; might_sleep_if(!(gfp_mask & __GFP_HARDWALL)); diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index c3429a710ab1..8002e1faccda 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -1290,7 +1290,7 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order) if ((gfp & __GFP_WAIT) && !in_interrupt()) cpuset_update_task_memory_state(); - if (!pol || in_interrupt()) + if (!pol || in_interrupt() || (gfp & __GFP_THISNODE)) pol = &default_policy; if (pol->policy == MPOL_INTERLEAVE) return alloc_page_interleave(gfp, order, interleave_nodes(pol)); diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index 208a6b03aa78..ea498788af53 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -893,6 +893,9 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, * See also cpuset_zone_allowed() comment in kernel/cpuset.c. */ do { + if (unlikely((gfp_mask & __GFP_THISNODE) && + (*z)->zone_pgdat != zonelist->zones[0]->zone_pgdat)) + break; if ((alloc_flags & ALLOC_CPUSET) && !cpuset_zone_allowed(*z, gfp_mask)) continue;