|
@@ -1296,7 +1296,9 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr,
|
|
|
unsigned nid;
|
|
|
|
|
|
nid = interleave_nid(pol, vma, addr, HPAGE_SHIFT);
|
|
|
- __mpol_free(pol); /* finished with pol */
|
|
|
+ if (unlikely(pol != &default_policy &&
|
|
|
+ pol != current->mempolicy))
|
|
|
+ __mpol_free(pol); /* finished with pol */
|
|
|
return NODE_DATA(nid)->node_zonelists + gfp_zone(gfp_flags);
|
|
|
}
|
|
|
|
|
@@ -1360,6 +1362,9 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)
|
|
|
unsigned nid;
|
|
|
|
|
|
nid = interleave_nid(pol, vma, addr, PAGE_SHIFT);
|
|
|
+ if (unlikely(pol != &default_policy &&
|
|
|
+ pol != current->mempolicy))
|
|
|
+ __mpol_free(pol); /* finished with pol */
|
|
|
return alloc_page_interleave(gfp, 0, nid);
|
|
|
}
|
|
|
zl = zonelist_policy(gfp, pol);
|