asm volatile(PPC_INVALIDATE_ERAT "; isync" : : :"memory");
 }
 
+static inline void tlbiel_pwc(unsigned long pid)
+{
+       asm volatile("ptesync": : :"memory");
+
+       /* For PWC flush, we don't look at set number */
+       __tlbiel_pid(pid, 0, RIC_FLUSH_PWC);
+
+       asm volatile("ptesync": : :"memory");
+       asm volatile(PPC_INVALIDATE_ERAT "; isync" : : :"memory");
+}
+
 static inline void _tlbie_pid(unsigned long pid, unsigned long ric)
 {
        unsigned long rb,rs,prs,r;
 
        pid = mm->context.id;
        if (pid != MMU_NO_CONTEXT)
-               _tlbiel_pid(pid, RIC_FLUSH_PWC);
+               tlbiel_pwc(pid);
 
        preempt_enable();
 }
                if (lock_tlbie)
                        raw_spin_unlock(&native_tlbie_lock);
        } else
-               _tlbiel_pid(pid, RIC_FLUSH_PWC);
+               tlbiel_pwc(pid);
 no_context:
        preempt_enable();
 }