diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/slab.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/mm/slab.c b/mm/slab.c index 266449d604b..84c631f3074 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -3152,12 +3152,15 @@ void *fallback_alloc(struct kmem_cache *cache, gfp_t flags) struct zone **z; void *obj = NULL; - for (z = zonelist->zones; *z && !obj; z++) + for (z = zonelist->zones; *z && !obj; z++) { + int nid = zone_to_nid(*z); + if (zone_idx(*z) <= ZONE_NORMAL && - cpuset_zone_allowed(*z, flags)) + cpuset_zone_allowed(*z, flags) && + cache->nodelists[nid]) obj = __cache_alloc_node(cache, - flags | __GFP_THISNODE, - zone_to_nid(*z)); + flags | __GFP_THISNODE, nid); + } return obj; } |