diff options
| -rw-r--r-- | include/linux/mempolicy.h | 2 | ||||
| -rw-r--r-- | mm/mempolicy.c | 8 | ||||
| -rw-r--r-- | mm/slab.c | 4 | ||||
| -rw-r--r-- | mm/slub.c | 2 | 
4 files changed, 11 insertions, 5 deletions
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 4aa42732e47..95b738c7abf 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h @@ -215,7 +215,7 @@ extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,  extern bool init_nodemask_of_mempolicy(nodemask_t *mask);  extern bool mempolicy_nodemask_intersects(struct task_struct *tsk,  				const nodemask_t *mask); -extern unsigned slab_node(struct mempolicy *policy); +extern unsigned slab_node(void);  extern enum zone_type policy_zone; diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f15c1b24ca1..cb0b230aa3f 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1602,8 +1602,14 @@ static unsigned interleave_nodes(struct mempolicy *policy)   * task can change it's policy.  The system default policy requires no   * such protection.   */ -unsigned slab_node(struct mempolicy *policy) +unsigned slab_node(void)  { +	struct mempolicy *policy; + +	if (in_interrupt()) +		return numa_node_id(); + +	policy = current->mempolicy;  	if (!policy || policy->flags & MPOL_F_LOCAL)  		return numa_node_id(); diff --git a/mm/slab.c b/mm/slab.c index fc4a7744670..dd607a8e670 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -3310,7 +3310,7 @@ static void *alternate_node_alloc(struct kmem_cache *cachep, gfp_t flags)  	if (cpuset_do_slab_mem_spread() && (cachep->flags & SLAB_MEM_SPREAD))  		nid_alloc = cpuset_slab_spread_node();  	else if (current->mempolicy) -		nid_alloc = slab_node(current->mempolicy); +		nid_alloc = slab_node();  	if (nid_alloc != nid_here)  		return ____cache_alloc_node(cachep, flags, nid_alloc);  	return NULL; @@ -3342,7 +3342,7 @@ static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)  retry_cpuset:  	cpuset_mems_cookie = get_mems_allowed(); -	zonelist = node_zonelist(slab_node(current->mempolicy), flags); +	zonelist = node_zonelist(slab_node(), flags);  retry:  	/* diff --git a/mm/slub.c b/mm/slub.c index 797271f5afb..348fed1643f 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1617,7 +1617,7 @@ static void *get_any_partial(struct kmem_cache *s, gfp_t flags,  	do {  		cpuset_mems_cookie = get_mems_allowed(); -		zonelist = node_zonelist(slab_node(current->mempolicy), flags); +		zonelist = node_zonelist(slab_node(), flags);  		for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) {  			struct kmem_cache_node *n;  |