diff options
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index a7aa811b7d14..3d0aab9ee80d 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -4555,7 +4555,8 @@ out: | |||
4555 | int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep) | 4555 | int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep) |
4556 | { | 4556 | { |
4557 | pgd_t *pgd = pgd_offset(mm, *addr); | 4557 | pgd_t *pgd = pgd_offset(mm, *addr); |
4558 | pud_t *pud = pud_offset(pgd, *addr); | 4558 | p4d_t *p4d = p4d_offset(pgd, *addr); |
4559 | pud_t *pud = pud_offset(p4d, *addr); | ||
4559 | 4560 | ||
4560 | BUG_ON(page_count(virt_to_page(ptep)) == 0); | 4561 | BUG_ON(page_count(virt_to_page(ptep)) == 0); |
4561 | if (page_count(virt_to_page(ptep)) == 1) | 4562 | if (page_count(virt_to_page(ptep)) == 1) |
@@ -4586,11 +4587,13 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, | |||
4586 | unsigned long addr, unsigned long sz) | 4587 | unsigned long addr, unsigned long sz) |
4587 | { | 4588 | { |
4588 | pgd_t *pgd; | 4589 | pgd_t *pgd; |
4590 | p4d_t *p4d; | ||
4589 | pud_t *pud; | 4591 | pud_t *pud; |
4590 | pte_t *pte = NULL; | 4592 | pte_t *pte = NULL; |
4591 | 4593 | ||
4592 | pgd = pgd_offset(mm, addr); | 4594 | pgd = pgd_offset(mm, addr); |
4593 | pud = pud_alloc(mm, pgd, addr); | 4595 | p4d = p4d_offset(pgd, addr); |
4596 | pud = pud_alloc(mm, p4d, addr); | ||
4594 | if (pud) { | 4597 | if (pud) { |
4595 | if (sz == PUD_SIZE) { | 4598 | if (sz == PUD_SIZE) { |
4596 | pte = (pte_t *)pud; | 4599 | pte = (pte_t *)pud; |
@@ -4610,18 +4613,22 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, | |||
4610 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) | 4613 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) |
4611 | { | 4614 | { |
4612 | pgd_t *pgd; | 4615 | pgd_t *pgd; |
4616 | p4d_t *p4d; | ||
4613 | pud_t *pud; | 4617 | pud_t *pud; |
4614 | pmd_t *pmd = NULL; | 4618 | pmd_t *pmd; |
4615 | 4619 | ||
4616 | pgd = pgd_offset(mm, addr); | 4620 | pgd = pgd_offset(mm, addr); |
4617 | if (pgd_present(*pgd)) { | 4621 | if (!pgd_present(*pgd)) |
4618 | pud = pud_offset(pgd, addr); | 4622 | return NULL; |
4619 | if (pud_present(*pud)) { | 4623 | p4d = p4d_offset(pgd, addr); |
4620 | if (pud_huge(*pud)) | 4624 | if (!p4d_present(*p4d)) |
4621 | return (pte_t *)pud; | 4625 | return NULL; |
4622 | pmd = pmd_offset(pud, addr); | 4626 | pud = pud_offset(p4d, addr); |
4623 | } | 4627 | if (!pud_present(*pud)) |
4624 | } | 4628 | return NULL; |
4629 | if (pud_huge(*pud)) | ||
4630 | return (pte_t *)pud; | ||
4631 | pmd = pmd_offset(pud, addr); | ||
4625 | return (pte_t *) pmd; | 4632 | return (pte_t *) pmd; |
4626 | } | 4633 | } |
4627 | 4634 | ||