From: Paul Jackson Date: Fri, 8 Dec 2006 10:35:53 +0000 (-0800) Subject: [PATCH] mm: fallback_alloc cpuset_zone_allowed irq fix X-Git-Tag: v2.6.20-rc1~34^2~407 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=b8b50b6519afa9891b753c4fffa89d89e04df66a;p=linux-2.6-omap-h63xx.git [PATCH] mm: fallback_alloc cpuset_zone_allowed irq fix fallback_alloc() could end up calling cpuset_zone_allowed() with interrupts disabled (by code in kmem_cache_alloc_node()), but without __GFP_HARDWALL set, leading to a possible call of a sleeping function with interrupts disabled. This results in the BUG report: BUG: sleeping function called from invalid context at kernel/cpuset.c:1520 in_atomic():0, irqs_disabled():1 Thanks to Paul Menage for catching this one. Signed-off-by: Paul Jackson Cc: Paul Menage Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/mm/slab.c b/mm/slab.c index 068cb4503c1..e90b6100a92 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -3182,7 +3182,7 @@ retry: for (z = zonelist->zones; *z && !obj; z++) { nid = zone_to_nid(*z); - if (cpuset_zone_allowed(*z, flags) && + if (cpuset_zone_allowed(*z, flags | __GFP_HARDWALL) && cache->nodelists[nid] && cache->nodelists[nid]->free_objects) obj = ____cache_alloc_node(cache,