]> err.no Git - linux-2.6/blobdiff - arch/powerpc/mm/hash_native_64.c
Merge branch 'master' into upstream
[linux-2.6] / arch / powerpc / mm / hash_native_64.c
index d96bcfe4c6f6c2ed38f6c55afeb7e7809c6bd37c..994856e55b7c49f79f008936c249b2ac897ce9f5 100644 (file)
@@ -52,7 +52,7 @@ static inline void __tlbie(unsigned long va, unsigned int psize)
        default:
                penc = mmu_psize_defs[psize].penc;
                va &= ~((1ul << mmu_psize_defs[psize].shift) - 1);
-               va |= (0x7f >> (8 - penc)) << 12;
+               va |= penc << 12;
                asm volatile("tlbie %0,1" : : "r" (va) : "memory");
                break;
        }
@@ -74,7 +74,7 @@ static inline void __tlbiel(unsigned long va, unsigned int psize)
        default:
                penc = mmu_psize_defs[psize].penc;
                va &= ~((1ul << mmu_psize_defs[psize].shift) - 1);
-               va |= (0x7f >> (8 - penc)) << 12;
+               va |= penc << 12;
                asm volatile(".long 0x7c000224 | (%0 << 11) | (1 << 21)"
                             : : "r"(va) : "memory");
                break;
@@ -403,12 +403,17 @@ static void native_hpte_clear(void)
                 */
                hpte_v = hptep->v;
 
+               /*
+                * Call __tlbie() here rather than tlbie() since we
+                * already hold the native_tlbie_lock.
+                */
                if (hpte_v & HPTE_V_VALID) {
                        hptep->v = 0;
-                       tlbie(slot2va(hpte_v, slot), MMU_PAGE_4K, 0);
+                       __tlbie(slot2va(hpte_v, slot), MMU_PAGE_4K);
                }
        }
 
+       asm volatile("eieio; tlbsync; ptesync":::"memory");
        spin_unlock(&native_tlbie_lock);
        local_irq_restore(flags);
 }