diff options
Diffstat (limited to 'arch/powerpc/mm/hugetlbpage.c')
-rw-r--r-- | arch/powerpc/mm/hugetlbpage.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index 4835f73af304..08f0d9ff7712 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
@@ -22,11 +22,8 @@ | |||
22 | #include <asm/mmu_context.h> | 22 | #include <asm/mmu_context.h> |
23 | #include <asm/machdep.h> | 23 | #include <asm/machdep.h> |
24 | #include <asm/cputable.h> | 24 | #include <asm/cputable.h> |
25 | #include <asm/tlb.h> | ||
26 | #include <asm/spu.h> | 25 | #include <asm/spu.h> |
27 | 26 | ||
28 | #include <linux/sysctl.h> | ||
29 | |||
30 | #define NUM_LOW_AREAS (0x100000000UL >> SID_SHIFT) | 27 | #define NUM_LOW_AREAS (0x100000000UL >> SID_SHIFT) |
31 | #define NUM_HIGH_AREAS (PGTABLE_RANGE >> HTLB_AREA_SHIFT) | 28 | #define NUM_HIGH_AREAS (PGTABLE_RANGE >> HTLB_AREA_SHIFT) |
32 | 29 | ||
@@ -406,11 +403,12 @@ int hash_huge_page(struct mm_struct *mm, unsigned long access, | |||
406 | unsigned long va, rflags, pa; | 403 | unsigned long va, rflags, pa; |
407 | long slot; | 404 | long slot; |
408 | int err = 1; | 405 | int err = 1; |
406 | int ssize = user_segment_size(ea); | ||
409 | 407 | ||
410 | ptep = huge_pte_offset(mm, ea); | 408 | ptep = huge_pte_offset(mm, ea); |
411 | 409 | ||
412 | /* Search the Linux page table for a match with va */ | 410 | /* Search the Linux page table for a match with va */ |
413 | va = (vsid << 28) | (ea & 0x0fffffff); | 411 | va = hpt_va(ea, vsid, ssize); |
414 | 412 | ||
415 | /* | 413 | /* |
416 | * If no pte found or not present, send the problem up to | 414 | * If no pte found or not present, send the problem up to |
@@ -461,19 +459,19 @@ int hash_huge_page(struct mm_struct *mm, unsigned long access, | |||
461 | /* There MIGHT be an HPTE for this pte */ | 459 | /* There MIGHT be an HPTE for this pte */ |
462 | unsigned long hash, slot; | 460 | unsigned long hash, slot; |
463 | 461 | ||
464 | hash = hpt_hash(va, HPAGE_SHIFT); | 462 | hash = hpt_hash(va, HPAGE_SHIFT, ssize); |
465 | if (old_pte & _PAGE_F_SECOND) | 463 | if (old_pte & _PAGE_F_SECOND) |
466 | hash = ~hash; | 464 | hash = ~hash; |
467 | slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; | 465 | slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; |
468 | slot += (old_pte & _PAGE_F_GIX) >> 12; | 466 | slot += (old_pte & _PAGE_F_GIX) >> 12; |
469 | 467 | ||
470 | if (ppc_md.hpte_updatepp(slot, rflags, va, mmu_huge_psize, | 468 | if (ppc_md.hpte_updatepp(slot, rflags, va, mmu_huge_psize, |
471 | local) == -1) | 469 | ssize, local) == -1) |
472 | old_pte &= ~_PAGE_HPTEFLAGS; | 470 | old_pte &= ~_PAGE_HPTEFLAGS; |
473 | } | 471 | } |
474 | 472 | ||
475 | if (likely(!(old_pte & _PAGE_HASHPTE))) { | 473 | if (likely(!(old_pte & _PAGE_HASHPTE))) { |
476 | unsigned long hash = hpt_hash(va, HPAGE_SHIFT); | 474 | unsigned long hash = hpt_hash(va, HPAGE_SHIFT, ssize); |
477 | unsigned long hpte_group; | 475 | unsigned long hpte_group; |
478 | 476 | ||
479 | pa = pte_pfn(__pte(old_pte)) << PAGE_SHIFT; | 477 | pa = pte_pfn(__pte(old_pte)) << PAGE_SHIFT; |
@@ -492,7 +490,7 @@ repeat: | |||
492 | 490 | ||
493 | /* Insert into the hash table, primary slot */ | 491 | /* Insert into the hash table, primary slot */ |
494 | slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, 0, | 492 | slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, 0, |
495 | mmu_huge_psize); | 493 | mmu_huge_psize, ssize); |
496 | 494 | ||
497 | /* Primary is full, try the secondary */ | 495 | /* Primary is full, try the secondary */ |
498 | if (unlikely(slot == -1)) { | 496 | if (unlikely(slot == -1)) { |
@@ -500,7 +498,7 @@ repeat: | |||
500 | HPTES_PER_GROUP) & ~0x7UL; | 498 | HPTES_PER_GROUP) & ~0x7UL; |
501 | slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, | 499 | slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, |
502 | HPTE_V_SECONDARY, | 500 | HPTE_V_SECONDARY, |
503 | mmu_huge_psize); | 501 | mmu_huge_psize, ssize); |
504 | if (slot == -1) { | 502 | if (slot == -1) { |
505 | if (mftb() & 0x1) | 503 | if (mftb() & 0x1) |
506 | hpte_group = ((hash & htab_hash_mask) * | 504 | hpte_group = ((hash & htab_hash_mask) * |