| .. | .. |
|---|
| 14 | 14 | |
|---|
| 15 | 15 | #include <asm/mman.h> |
|---|
| 16 | 16 | #include <asm/pgalloc.h> |
|---|
| 17 | | -#include <asm/pgtable.h> |
|---|
| 18 | 17 | #include <asm/tlb.h> |
|---|
| 19 | 18 | #include <asm/tlbflush.h> |
|---|
| 20 | 19 | #include <asm/cacheflush.h> |
|---|
| .. | .. |
|---|
| 273 | 272 | return size; |
|---|
| 274 | 273 | } |
|---|
| 275 | 274 | |
|---|
| 276 | | -pte_t *huge_pte_alloc(struct mm_struct *mm, |
|---|
| 275 | +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, |
|---|
| 277 | 276 | unsigned long addr, unsigned long sz) |
|---|
| 278 | 277 | { |
|---|
| 279 | 278 | pgd_t *pgd; |
|---|
| 279 | + p4d_t *p4d; |
|---|
| 280 | 280 | pud_t *pud; |
|---|
| 281 | 281 | pmd_t *pmd; |
|---|
| 282 | 282 | |
|---|
| 283 | 283 | pgd = pgd_offset(mm, addr); |
|---|
| 284 | | - pud = pud_alloc(mm, pgd, addr); |
|---|
| 284 | + p4d = p4d_offset(pgd, addr); |
|---|
| 285 | + pud = pud_alloc(mm, p4d, addr); |
|---|
| 285 | 286 | if (!pud) |
|---|
| 286 | 287 | return NULL; |
|---|
| 287 | 288 | if (sz >= PUD_SIZE) |
|---|
| .. | .. |
|---|
| 298 | 299 | unsigned long addr, unsigned long sz) |
|---|
| 299 | 300 | { |
|---|
| 300 | 301 | pgd_t *pgd; |
|---|
| 302 | + p4d_t *p4d; |
|---|
| 301 | 303 | pud_t *pud; |
|---|
| 302 | 304 | pmd_t *pmd; |
|---|
| 303 | 305 | |
|---|
| 304 | 306 | pgd = pgd_offset(mm, addr); |
|---|
| 305 | 307 | if (pgd_none(*pgd)) |
|---|
| 306 | 308 | return NULL; |
|---|
| 307 | | - pud = pud_offset(pgd, addr); |
|---|
| 309 | + p4d = p4d_offset(pgd, addr); |
|---|
| 310 | + if (p4d_none(*p4d)) |
|---|
| 311 | + return NULL; |
|---|
| 312 | + pud = pud_offset(p4d, addr); |
|---|
| 308 | 313 | if (pud_none(*pud)) |
|---|
| 309 | 314 | return NULL; |
|---|
| 310 | 315 | if (is_hugetlb_pud(*pud)) |
|---|
| .. | .. |
|---|
| 449 | 454 | mm_dec_nr_pmds(tlb->mm); |
|---|
| 450 | 455 | } |
|---|
| 451 | 456 | |
|---|
| 452 | | -static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, |
|---|
| 457 | +static void hugetlb_free_pud_range(struct mmu_gather *tlb, p4d_t *p4d, |
|---|
| 453 | 458 | unsigned long addr, unsigned long end, |
|---|
| 454 | 459 | unsigned long floor, unsigned long ceiling) |
|---|
| 455 | 460 | { |
|---|
| .. | .. |
|---|
| 458 | 463 | unsigned long start; |
|---|
| 459 | 464 | |
|---|
| 460 | 465 | start = addr; |
|---|
| 461 | | - pud = pud_offset(pgd, addr); |
|---|
| 466 | + pud = pud_offset(p4d, addr); |
|---|
| 462 | 467 | do { |
|---|
| 463 | 468 | next = pud_addr_end(addr, end); |
|---|
| 464 | 469 | if (pud_none_or_clear_bad(pud)) |
|---|
| .. | .. |
|---|
| 481 | 486 | if (end - 1 > ceiling - 1) |
|---|
| 482 | 487 | return; |
|---|
| 483 | 488 | |
|---|
| 484 | | - pud = pud_offset(pgd, start); |
|---|
| 485 | | - pgd_clear(pgd); |
|---|
| 489 | + pud = pud_offset(p4d, start); |
|---|
| 490 | + p4d_clear(p4d); |
|---|
| 486 | 491 | pud_free_tlb(tlb, pud, start); |
|---|
| 487 | 492 | mm_dec_nr_puds(tlb->mm); |
|---|
| 488 | 493 | } |
|---|
| .. | .. |
|---|
| 492 | 497 | unsigned long floor, unsigned long ceiling) |
|---|
| 493 | 498 | { |
|---|
| 494 | 499 | pgd_t *pgd; |
|---|
| 500 | + p4d_t *p4d; |
|---|
| 495 | 501 | unsigned long next; |
|---|
| 496 | 502 | |
|---|
| 497 | 503 | addr &= PMD_MASK; |
|---|
| .. | .. |
|---|
| 511 | 517 | return; |
|---|
| 512 | 518 | |
|---|
| 513 | 519 | pgd = pgd_offset(tlb->mm, addr); |
|---|
| 520 | + p4d = p4d_offset(pgd, addr); |
|---|
| 514 | 521 | do { |
|---|
| 515 | | - next = pgd_addr_end(addr, end); |
|---|
| 516 | | - if (pgd_none_or_clear_bad(pgd)) |
|---|
| 522 | + next = p4d_addr_end(addr, end); |
|---|
| 523 | + if (p4d_none_or_clear_bad(p4d)) |
|---|
| 517 | 524 | continue; |
|---|
| 518 | | - hugetlb_free_pud_range(tlb, pgd, addr, next, floor, ceiling); |
|---|
| 519 | | - } while (pgd++, addr = next, addr != end); |
|---|
| 525 | + hugetlb_free_pud_range(tlb, p4d, addr, next, floor, ceiling); |
|---|
| 526 | + } while (p4d++, addr = next, addr != end); |
|---|
| 520 | 527 | } |
|---|