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