aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/asm-x86/pgalloc_32.h7
-rw-r--r--include/asm-x86/pgtable-3level.h21
2 files changed, 22 insertions, 6 deletions
diff --git a/include/asm-x86/pgalloc_32.h b/include/asm-x86/pgalloc_32.h
index 0caa37a9a25f..10c2b452e64c 100644
--- a/include/asm-x86/pgalloc_32.h
+++ b/include/asm-x86/pgalloc_32.h
@@ -74,6 +74,13 @@ static inline void pmd_free(pmd_t *pmd)
74 74
75static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) 75static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
76{ 76{
77 /* This is called just after the pmd has been detached from
78 the pgd, which requires a full tlb flush to be recognized
79 by the CPU. Rather than incurring multiple tlb flushes
80 while the address space is being pulled down, make the tlb
81 gathering machinery do a full flush when we're done. */
82 tlb->fullmm = 1;
83
77 paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT); 84 paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
78 tlb_remove_page(tlb, virt_to_page(pmd)); 85 tlb_remove_page(tlb, virt_to_page(pmd));
79} 86}
diff --git a/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h
index ed4c6f0e57ec..a195c3e757b9 100644
--- a/include/asm-x86/pgtable-3level.h
+++ b/include/asm-x86/pgtable-3level.h
@@ -96,14 +96,23 @@ static inline void pud_clear(pud_t *pudp)
96 set_pud(pudp, __pud(0)); 96 set_pud(pudp, __pud(0));
97 97
98 /* 98 /*
99 * Pentium-II erratum A13: in PAE mode we explicitly have to flush 99 * In principle we need to do a cr3 reload here to make sure
100 * the TLB via cr3 if the top-level pgd is changed... 100 * the processor recognizes the changed pgd. In practice, all
101 * the places where pud_clear() gets called are followed by
102 * full tlb flushes anyway, so we can defer the cost here.
101 * 103 *
102 * XXX I don't think we need to worry about this here, since 104 * Specifically:
103 * when clearing the pud, the calling code needs to flush the 105 *
104 * tlb anyway. But do it now for safety's sake. - jsgf 106 * mm/memory.c:free_pmd_range() - immediately after the
107 * pud_clear() it does a pmd_free_tlb(). We change the
108 * mmu_gather structure to do a full tlb flush (which has the
109 * effect of reloading cr3) when the pagetable free is
110 * complete.
111 *
112 * arch/x86/mm/hugetlbpage.c:huge_pmd_unshare() - the call to
113 * this is followed by a flush_tlb_range, which on x86 does a
114 * full tlb flush.
105 */ 115 */
106 write_cr3(read_cr3());
107} 116}
108 117
109#define pud_page(pud) \ 118#define pud_page(pud) \