x86: CPA avoid repeated lazy mmu flush
authorThomas Gleixner <tglx@linutronix.de>
Thu, 12 Feb 2009 20:16:09 +0000 (21:16 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 12 Feb 2009 22:11:58 +0000 (23:11 +0100)
Impact: Flush the lazy MMU only once

Pending mmu updates only need to be flushed once to bring the
in-memory pagetable state up to date.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/mm/pageattr.c

index f664bc1c4093d0dbc39d4aefdfdd6c5e29be1f95..8ca0d8566fc826cb8f7f42b05133c4498da59e64 100644 (file)
@@ -575,14 +575,6 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
                address = cpa->vaddr[cpa->curpage];
        else
                address = *cpa->vaddr;
-
-       /*
-        * If we're called with lazy mmu updates enabled, the
-        * in-memory pte state may be stale.  Flush pending updates to
-        * bring them up to date.
-        */
-       arch_flush_lazy_mmu_mode();
-
 repeat:
        kpte = lookup_address(address, &level);
        if (!kpte)
@@ -819,6 +811,13 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
 
        vm_unmap_aliases();
 
+       /*
+        * If we're called with lazy mmu updates enabled, the
+        * in-memory pte state may be stale.  Flush pending updates to
+        * bring them up to date.
+        */
+       arch_flush_lazy_mmu_mode();
+
        cpa.vaddr = addr;
        cpa.numpages = numpages;
        cpa.mask_set = mask_set;