|
@@ -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 */
|
|
/* 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) {
|
|
switch (policy->mode) {
|
|
case MPOL_PREFERRED:
|
|
case MPOL_PREFERRED:
|
|
if (!(policy->flags & MPOL_F_LOCAL))
|
|
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,
|
|
zl = node_zonelist(interleave_nid(*mpol, vma, addr,
|
|
huge_page_shift(hstate_vma(vma))), gfp_flags);
|
|
huge_page_shift(hstate_vma(vma))), gfp_flags);
|
|
} else {
|
|
} else {
|
|
- zl = policy_zonelist(gfp_flags, *mpol);
|
|
|
|
|
|
+ zl = policy_zonelist(gfp_flags, *mpol, numa_node_id());
|
|
if ((*mpol)->mode == MPOL_BIND)
|
|
if ((*mpol)->mode == MPOL_BIND)
|
|
*nodemask = &(*mpol)->v.nodes;
|
|
*nodemask = &(*mpol)->v.nodes;
|
|
}
|
|
}
|
|
@@ -1820,7 +1819,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,
|
|
*/
|
|
*/
|
|
struct page *
|
|
struct page *
|
|
alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,
|
|
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 mempolicy *pol = get_vma_policy(current, vma, addr);
|
|
struct zonelist *zl;
|
|
struct zonelist *zl;
|
|
@@ -1836,7 +1835,7 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,
|
|
put_mems_allowed();
|
|
put_mems_allowed();
|
|
return page;
|
|
return page;
|
|
}
|
|
}
|
|
- zl = policy_zonelist(gfp, pol);
|
|
|
|
|
|
+ zl = policy_zonelist(gfp, pol, node);
|
|
if (unlikely(mpol_needs_cond_ref(pol))) {
|
|
if (unlikely(mpol_needs_cond_ref(pol))) {
|
|
/*
|
|
/*
|
|
* slow path: ref counted shared policy
|
|
* slow path: ref counted shared policy
|