diff options
Diffstat (limited to 'mm/slab.c')
-rw-r--r-- | mm/slab.c | 4 |
1 files changed, 4 insertions, 0 deletions
@@ -3217,10 +3217,12 @@ static void *alternate_node_alloc(struct kmem_cache *cachep, gfp_t flags) | |||
3217 | if (in_interrupt() || (flags & __GFP_THISNODE)) | 3217 | if (in_interrupt() || (flags & __GFP_THISNODE)) |
3218 | return NULL; | 3218 | return NULL; |
3219 | nid_alloc = nid_here = numa_node_id(); | 3219 | nid_alloc = nid_here = numa_node_id(); |
3220 | get_mems_allowed(); | ||
3220 | if (cpuset_do_slab_mem_spread() && (cachep->flags & SLAB_MEM_SPREAD)) | 3221 | if (cpuset_do_slab_mem_spread() && (cachep->flags & SLAB_MEM_SPREAD)) |
3221 | nid_alloc = cpuset_mem_spread_node(); | 3222 | nid_alloc = cpuset_mem_spread_node(); |
3222 | else if (current->mempolicy) | 3223 | else if (current->mempolicy) |
3223 | nid_alloc = slab_node(current->mempolicy); | 3224 | nid_alloc = slab_node(current->mempolicy); |
3225 | put_mems_allowed(); | ||
3224 | if (nid_alloc != nid_here) | 3226 | if (nid_alloc != nid_here) |
3225 | return ____cache_alloc_node(cachep, flags, nid_alloc); | 3227 | return ____cache_alloc_node(cachep, flags, nid_alloc); |
3226 | return NULL; | 3228 | return NULL; |
@@ -3247,6 +3249,7 @@ static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags) | |||
3247 | if (flags & __GFP_THISNODE) | 3249 | if (flags & __GFP_THISNODE) |
3248 | return NULL; | 3250 | return NULL; |
3249 | 3251 | ||
3252 | get_mems_allowed(); | ||
3250 | zonelist = node_zonelist(slab_node(current->mempolicy), flags); | 3253 | zonelist = node_zonelist(slab_node(current->mempolicy), flags); |
3251 | local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK); | 3254 | local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK); |
3252 | 3255 | ||
@@ -3302,6 +3305,7 @@ retry: | |||
3302 | } | 3305 | } |
3303 | } | 3306 | } |
3304 | } | 3307 | } |
3308 | put_mems_allowed(); | ||
3305 | return obj; | 3309 | return obj; |
3306 | } | 3310 | } |
3307 | 3311 | ||