|
@@ -14,6 +14,10 @@
|
|
|
#include <asm/cacheflush.h>
|
|
|
#include <asm/machdep.h>
|
|
|
|
|
|
+extern long hpte_insert_repeating(unsigned long hash, unsigned long vpn,
|
|
|
+ unsigned long pa, unsigned long rlags,
|
|
|
+ unsigned long vflags, int psize, int ssize);
|
|
|
+
|
|
|
int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|
|
pte_t *ptep, unsigned long trap, int local, int ssize,
|
|
|
unsigned int shift, unsigned int mmu_psize)
|
|
@@ -83,7 +87,6 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|
|
|
|
|
if (likely(!(old_pte & _PAGE_HASHPTE))) {
|
|
|
unsigned long hash = hpt_hash(vpn, shift, ssize);
|
|
|
- unsigned long hpte_group;
|
|
|
|
|
|
pa = pte_pfn(__pte(old_pte)) << PAGE_SHIFT;
|
|
|
|
|
@@ -97,30 +100,8 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|
|
rflags |= (new_pte & (_PAGE_WRITETHRU | _PAGE_NO_CACHE |
|
|
|
_PAGE_COHERENT | _PAGE_GUARDED));
|
|
|
|
|
|
-repeat:
|
|
|
- hpte_group = ((hash & htab_hash_mask) *
|
|
|
- HPTES_PER_GROUP) & ~0x7UL;
|
|
|
-
|
|
|
- /* Insert into the hash table, primary slot */
|
|
|
- slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags, 0,
|
|
|
- mmu_psize, ssize);
|
|
|
-
|
|
|
- /* Primary is full, try the secondary */
|
|
|
- if (unlikely(slot == -1)) {
|
|
|
- hpte_group = ((~hash & htab_hash_mask) *
|
|
|
- HPTES_PER_GROUP) & ~0x7UL;
|
|
|
- slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags,
|
|
|
- HPTE_V_SECONDARY,
|
|
|
- mmu_psize, ssize);
|
|
|
- if (slot == -1) {
|
|
|
- if (mftb() & 0x1)
|
|
|
- hpte_group = ((hash & htab_hash_mask) *
|
|
|
- HPTES_PER_GROUP)&~0x7UL;
|
|
|
-
|
|
|
- ppc_md.hpte_remove(hpte_group);
|
|
|
- goto repeat;
|
|
|
- }
|
|
|
- }
|
|
|
+ slot = hpte_insert_repeating(hash, vpn, pa, rflags, 0,
|
|
|
+ mmu_psize, ssize);
|
|
|
|
|
|
/*
|
|
|
* Hypervisor failure. Restore old pte and return -1
|