| .. | .. |
|---|
| 21 | 21 | #include <asm/tlb.h> |
|---|
| 22 | 22 | #include <asm/tlbflush.h> |
|---|
| 23 | 23 | |
|---|
| 24 | | -pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, |
|---|
| 25 | | - unsigned long sz) |
|---|
| 24 | +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, |
|---|
| 25 | + unsigned long addr, unsigned long sz) |
|---|
| 26 | 26 | { |
|---|
| 27 | 27 | pgd_t *pgd; |
|---|
| 28 | + p4d_t *p4d; |
|---|
| 28 | 29 | pud_t *pud; |
|---|
| 29 | 30 | pte_t *pte = NULL; |
|---|
| 30 | 31 | |
|---|
| 31 | 32 | pgd = pgd_offset(mm, addr); |
|---|
| 32 | | - pud = pud_alloc(mm, pgd, addr); |
|---|
| 33 | + p4d = p4d_alloc(mm, pgd, addr); |
|---|
| 34 | + pud = pud_alloc(mm, p4d, addr); |
|---|
| 33 | 35 | if (pud) |
|---|
| 34 | 36 | pte = (pte_t *)pmd_alloc(mm, pud, addr); |
|---|
| 35 | 37 | |
|---|
| .. | .. |
|---|
| 40 | 42 | unsigned long sz) |
|---|
| 41 | 43 | { |
|---|
| 42 | 44 | pgd_t *pgd; |
|---|
| 45 | + p4d_t *p4d; |
|---|
| 43 | 46 | pud_t *pud; |
|---|
| 44 | 47 | pmd_t *pmd = NULL; |
|---|
| 45 | 48 | |
|---|
| 46 | 49 | pgd = pgd_offset(mm, addr); |
|---|
| 47 | 50 | if (pgd_present(*pgd)) { |
|---|
| 48 | | - pud = pud_offset(pgd, addr); |
|---|
| 49 | | - if (pud_present(*pud)) |
|---|
| 50 | | - pmd = pmd_offset(pud, addr); |
|---|
| 51 | + p4d = p4d_offset(pgd, addr); |
|---|
| 52 | + if (p4d_present(*p4d)) { |
|---|
| 53 | + pud = pud_offset(p4d, addr); |
|---|
| 54 | + if (pud_present(*pud)) |
|---|
| 55 | + pmd = pmd_offset(pud, addr); |
|---|
| 56 | + } |
|---|
| 51 | 57 | } |
|---|
| 52 | 58 | return (pte_t *) pmd; |
|---|
| 53 | 59 | } |
|---|