diff options
Diffstat (limited to 'arch/powerpc/mm/hugetlbpage-hash64.c')
-rw-r--r-- | arch/powerpc/mm/hugetlbpage-hash64.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/arch/powerpc/mm/hugetlbpage-hash64.c b/arch/powerpc/mm/hugetlbpage-hash64.c index cc5c273086cf..cecad348f604 100644 --- a/arch/powerpc/mm/hugetlbpage-hash64.c +++ b/arch/powerpc/mm/hugetlbpage-hash64.c | |||
@@ -18,14 +18,15 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid, | |||
18 | pte_t *ptep, unsigned long trap, int local, int ssize, | 18 | pte_t *ptep, unsigned long trap, int local, int ssize, |
19 | unsigned int shift, unsigned int mmu_psize) | 19 | unsigned int shift, unsigned int mmu_psize) |
20 | { | 20 | { |
21 | unsigned long vpn; | ||
21 | unsigned long old_pte, new_pte; | 22 | unsigned long old_pte, new_pte; |
22 | unsigned long va, rflags, pa, sz; | 23 | unsigned long rflags, pa, sz; |
23 | long slot; | 24 | long slot; |
24 | 25 | ||
25 | BUG_ON(shift != mmu_psize_defs[mmu_psize].shift); | 26 | BUG_ON(shift != mmu_psize_defs[mmu_psize].shift); |
26 | 27 | ||
27 | /* Search the Linux page table for a match with va */ | 28 | /* Search the Linux page table for a match with va */ |
28 | va = hpt_va(ea, vsid, ssize); | 29 | vpn = hpt_vpn(ea, vsid, ssize); |
29 | 30 | ||
30 | /* At this point, we have a pte (old_pte) which can be used to build | 31 | /* At this point, we have a pte (old_pte) which can be used to build |
31 | * or update an HPTE. There are 2 cases: | 32 | * or update an HPTE. There are 2 cases: |
@@ -69,19 +70,19 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid, | |||
69 | /* There MIGHT be an HPTE for this pte */ | 70 | /* There MIGHT be an HPTE for this pte */ |
70 | unsigned long hash, slot; | 71 | unsigned long hash, slot; |
71 | 72 | ||
72 | hash = hpt_hash(va, shift, ssize); | 73 | hash = hpt_hash(vpn, shift, ssize); |
73 | if (old_pte & _PAGE_F_SECOND) | 74 | if (old_pte & _PAGE_F_SECOND) |
74 | hash = ~hash; | 75 | hash = ~hash; |
75 | slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; | 76 | slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; |
76 | slot += (old_pte & _PAGE_F_GIX) >> 12; | 77 | slot += (old_pte & _PAGE_F_GIX) >> 12; |
77 | 78 | ||
78 | if (ppc_md.hpte_updatepp(slot, rflags, va, mmu_psize, | 79 | if (ppc_md.hpte_updatepp(slot, rflags, vpn, mmu_psize, |
79 | ssize, local) == -1) | 80 | ssize, local) == -1) |
80 | old_pte &= ~_PAGE_HPTEFLAGS; | 81 | old_pte &= ~_PAGE_HPTEFLAGS; |
81 | } | 82 | } |
82 | 83 | ||
83 | if (likely(!(old_pte & _PAGE_HASHPTE))) { | 84 | if (likely(!(old_pte & _PAGE_HASHPTE))) { |
84 | unsigned long hash = hpt_hash(va, shift, ssize); | 85 | unsigned long hash = hpt_hash(vpn, shift, ssize); |
85 | unsigned long hpte_group; | 86 | unsigned long hpte_group; |
86 | 87 | ||
87 | pa = pte_pfn(__pte(old_pte)) << PAGE_SHIFT; | 88 | pa = pte_pfn(__pte(old_pte)) << PAGE_SHIFT; |
@@ -101,14 +102,14 @@ repeat: | |||
101 | _PAGE_COHERENT | _PAGE_GUARDED)); | 102 | _PAGE_COHERENT | _PAGE_GUARDED)); |
102 | 103 | ||
103 | /* Insert into the hash table, primary slot */ | 104 | /* Insert into the hash table, primary slot */ |
104 | slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, 0, | 105 | slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags, 0, |
105 | mmu_psize, ssize); | 106 | mmu_psize, ssize); |
106 | 107 | ||
107 | /* Primary is full, try the secondary */ | 108 | /* Primary is full, try the secondary */ |
108 | if (unlikely(slot == -1)) { | 109 | if (unlikely(slot == -1)) { |
109 | hpte_group = ((~hash & htab_hash_mask) * | 110 | hpte_group = ((~hash & htab_hash_mask) * |
110 | HPTES_PER_GROUP) & ~0x7UL; | 111 | HPTES_PER_GROUP) & ~0x7UL; |
111 | slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, | 112 | slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags, |
112 | HPTE_V_SECONDARY, | 113 | HPTE_V_SECONDARY, |
113 | mmu_psize, ssize); | 114 | mmu_psize, ssize); |
114 | if (slot == -1) { | 115 | if (slot == -1) { |