diff options
author | Paul Jackson <pj@sgi.com> | 2006-12-08 05:35:53 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-08 11:28:37 -0500 |
commit | b8b50b6519afa9891b753c4fffa89d89e04df66a (patch) | |
tree | 02aff736f77241445d588817c0ea629e69a0b69a /mm/slab.c | |
parent | 01a732eb22dab153732b94962467eaabb1fd3797 (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/slab.c')
-rw-r--r-- | mm/slab.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -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, |