.. | .. |
---|
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 | } |
---|