aboutsummaryrefslogtreecommitdiffstats
path: root/mm/hugetlb.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r--mm/hugetlb.c29
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:
4555int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep) 4555int 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,
4610pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) 4613pte_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