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