thp: add numa awareness to hugepage allocations
It's mostly a matter of replacing alloc_pages with alloc_pages_vma after introducing alloc_pages_vma. khugepaged needs special handling as the allocation has to happen inside collapse_huge_page where the vma is known and an error has to be returned to the outer loop to sleep alloc_sleep_millisecs in case of failure. But it retains the more efficient logic of handling allocation failures in khugepaged in case of CONFIG_NUMA=n. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
d39d33c332
commit
0bbbc0b33d
@@ -1796,7 +1796,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,
|
||||
}
|
||||
|
||||
/**
|
||||
* alloc_page_vma - Allocate a page for a VMA.
|
||||
* alloc_pages_vma - Allocate a page for a VMA.
|
||||
*
|
||||
* @gfp:
|
||||
* %GFP_USER user allocation.
|
||||
@@ -1805,6 +1805,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,
|
||||
* %GFP_FS allocation should not call back into a file system.
|
||||
* %GFP_ATOMIC don't sleep.
|
||||
*
|
||||
* @order:Order of the GFP allocation.
|
||||
* @vma: Pointer to VMA or NULL if not available.
|
||||
* @addr: Virtual Address of the allocation. Must be inside the VMA.
|
||||
*
|
||||
@@ -1818,7 +1819,8 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,
|
||||
* Should be called with the mm_sem of the vma hold.
|
||||
*/
|
||||
struct page *
|
||||
alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)
|
||||
alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,
|
||||
unsigned long addr)
|
||||
{
|
||||
struct mempolicy *pol = get_vma_policy(current, vma, addr);
|
||||
struct zonelist *zl;
|
||||
@@ -1830,7 +1832,7 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)
|
||||
|
||||
nid = interleave_nid(pol, vma, addr, PAGE_SHIFT);
|
||||
mpol_cond_put(pol);
|
||||
page = alloc_page_interleave(gfp, 0, nid);
|
||||
page = alloc_page_interleave(gfp, order, nid);
|
||||
put_mems_allowed();
|
||||
return page;
|
||||
}
|
||||
@@ -1839,7 +1841,7 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)
|
||||
/*
|
||||
* slow path: ref counted shared policy
|
||||
*/
|
||||
struct page *page = __alloc_pages_nodemask(gfp, 0,
|
||||
struct page *page = __alloc_pages_nodemask(gfp, order,
|
||||
zl, policy_nodemask(gfp, pol));
|
||||
__mpol_put(pol);
|
||||
put_mems_allowed();
|
||||
@@ -1848,7 +1850,8 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)
|
||||
/*
|
||||
* fast path: default or task policy
|
||||
*/
|
||||
page = __alloc_pages_nodemask(gfp, 0, zl, policy_nodemask(gfp, pol));
|
||||
page = __alloc_pages_nodemask(gfp, order, zl,
|
||||
policy_nodemask(gfp, pol));
|
||||
put_mems_allowed();
|
||||
return page;
|
||||
}
|
||||
|
Reference in New Issue
Block a user