aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorPaul Jackson <pj@sgi.com>2006-12-08 05:35:53 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-08 11:28:37 -0500
commitb8b50b6519afa9891b753c4fffa89d89e04df66a (patch)
tree02aff736f77241445d588817c0ea629e69a0b69a /mm
parent01a732eb22dab153732b94962467eaabb1fd3797 (diff)
[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 <pj@sgi.com> Cc: Paul Menage <menage@google.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/slab.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/slab.c b/mm/slab.c
index 068cb4503c15..e90b6100a927 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3182,7 +3182,7 @@ retry:
3182 for (z = zonelist->zones; *z && !obj; z++) { 3182 for (z = zonelist->zones; *z && !obj; z++) {
3183 nid = zone_to_nid(*z); 3183 nid = zone_to_nid(*z);
3184 3184
3185 if (cpuset_zone_allowed(*z, flags) && 3185 if (cpuset_zone_allowed(*z, flags | __GFP_HARDWALL) &&
3186 cache->nodelists[nid] && 3186 cache->nodelists[nid] &&
3187 cache->nodelists[nid]->free_objects) 3187 cache->nodelists[nid]->free_objects)
3188 obj = ____cache_alloc_node(cache, 3188 obj = ____cache_alloc_node(cache,