diff options
Diffstat (limited to 'mm/mempolicy.c')
| -rw-r--r-- | mm/mempolicy.c | 16 | 
1 files changed, 8 insertions, 8 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 368fc9d23610..b53ec99f1428 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1524,10 +1524,9 @@ static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)  }  /* Return a zonelist indicated by gfp for node representing a mempolicy */ -static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy) +static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy, +	int nd)  { -	int nd = numa_node_id(); -  	switch (policy->mode) {  	case MPOL_PREFERRED:  		if (!(policy->flags & MPOL_F_LOCAL)) @@ -1679,7 +1678,7 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr,  		zl = node_zonelist(interleave_nid(*mpol, vma, addr,  				huge_page_shift(hstate_vma(vma))), gfp_flags);  	} else { -		zl = policy_zonelist(gfp_flags, *mpol); +		zl = policy_zonelist(gfp_flags, *mpol, numa_node_id());  		if ((*mpol)->mode == MPOL_BIND)  			*nodemask = &(*mpol)->v.nodes;  	} @@ -1820,7 +1819,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,   */  struct page *  alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, -		unsigned long addr) +		unsigned long addr, int node)  {  	struct mempolicy *pol = get_vma_policy(current, vma, addr);  	struct zonelist *zl; @@ -1830,13 +1829,13 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,  	if (unlikely(pol->mode == MPOL_INTERLEAVE)) {  		unsigned nid; -		nid = interleave_nid(pol, vma, addr, PAGE_SHIFT); +		nid = interleave_nid(pol, vma, addr, PAGE_SHIFT + order);  		mpol_cond_put(pol);  		page = alloc_page_interleave(gfp, order, nid);  		put_mems_allowed();  		return page;  	} -	zl = policy_zonelist(gfp, pol); +	zl = policy_zonelist(gfp, pol, node);  	if (unlikely(mpol_needs_cond_ref(pol))) {  		/*  		 * slow path: ref counted shared policy @@ -1892,7 +1891,8 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order)  		page = alloc_page_interleave(gfp, order, interleave_nodes(pol));  	else  		page = __alloc_pages_nodemask(gfp, order, -			policy_zonelist(gfp, pol), policy_nodemask(gfp, pol)); +				policy_zonelist(gfp, pol, numa_node_id()), +				policy_nodemask(gfp, pol));  	put_mems_allowed();  	return page;  }  | 
