thp: pte alloc trans splitting
pte alloc routines must wait for split_huge_page if the pmd is not present and not null (i.e. pmd_trans_splitting). The additional branches are optimized away at compile time by pmd_trans_splitting if the config option is off. However we must pass the vma down in order to know the anon_vma lock to wait for. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: Mel Gorman <mel@csn.ul.ie> 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
64cc6ae001
commit
8ac1f8320a
@ -47,7 +47,8 @@ static pmd_t *get_old_pmd(struct mm_struct *mm, unsigned long addr)
|
||||
return pmd;
|
||||
}
|
||||
|
||||
static pmd_t *alloc_new_pmd(struct mm_struct *mm, unsigned long addr)
|
||||
static pmd_t *alloc_new_pmd(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
unsigned long addr)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
@ -62,7 +63,8 @@ static pmd_t *alloc_new_pmd(struct mm_struct *mm, unsigned long addr)
|
||||
if (!pmd)
|
||||
return NULL;
|
||||
|
||||
if (!pmd_present(*pmd) && __pte_alloc(mm, pmd, addr))
|
||||
VM_BUG_ON(pmd_trans_huge(*pmd));
|
||||
if (pmd_none(*pmd) && __pte_alloc(mm, vma, pmd, addr))
|
||||
return NULL;
|
||||
|
||||
return pmd;
|
||||
@ -147,7 +149,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
|
||||
old_pmd = get_old_pmd(vma->vm_mm, old_addr);
|
||||
if (!old_pmd)
|
||||
continue;
|
||||
new_pmd = alloc_new_pmd(vma->vm_mm, new_addr);
|
||||
new_pmd = alloc_new_pmd(vma->vm_mm, vma, new_addr);
|
||||
if (!new_pmd)
|
||||
break;
|
||||
next = (new_addr + PMD_SIZE) & PMD_MASK;
|
||||
|
Reference in New Issue
Block a user