unsigned long flags;                            \
                spin_lock_irqsave(&pa_tlb_lock, flags);         \
                old_pte = *ptep;                                \
-               set_pte(ptep, pteval);                          \
                if (pte_inserted(old_pte))                      \
                        purge_tlb_entries(mm, addr);            \
+               set_pte(ptep, pteval);                          \
                spin_unlock_irqrestore(&pa_tlb_lock, flags);    \
        } while (0)
 
                spin_unlock_irqrestore(&pa_tlb_lock, flags);
                return 0;
        }
-       set_pte(ptep, pte_mkold(pte));
        purge_tlb_entries(vma->vm_mm, addr);
+       set_pte(ptep, pte_mkold(pte));
        spin_unlock_irqrestore(&pa_tlb_lock, flags);
        return 1;
 }
 
        spin_lock_irqsave(&pa_tlb_lock, flags);
        old_pte = *ptep;
-       set_pte(ptep, __pte(0));
        if (pte_inserted(old_pte))
                purge_tlb_entries(mm, addr);
+       set_pte(ptep, __pte(0));
        spin_unlock_irqrestore(&pa_tlb_lock, flags);
 
        return old_pte;
 {
        unsigned long flags;
        spin_lock_irqsave(&pa_tlb_lock, flags);
-       set_pte(ptep, pte_wrprotect(*ptep));
        purge_tlb_entries(mm, addr);
+       set_pte(ptep, pte_wrprotect(*ptep));
        spin_unlock_irqrestore(&pa_tlb_lock, flags);
 }