From 1a5188b91fee54ff981bd8ced0b7f3b08d0303b3 Mon Sep 17 00:00:00 2001 From: Jeremy Fitzhardinge Date: Wed, 30 Jan 2008 13:34:11 +0100 Subject: [PATCH] --- yaml --- r: 80570 b: refs/heads/master c: fa28ba21cec24d3fa1279bcae7e5d5ff6224635a h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/asm-x86/pgalloc_32.h | 7 +++++++ trunk/include/asm-x86/pgtable-3level.h | 21 +++++++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index ff5047ce58ac..54e39f775c04 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f212ec4b7b4d84290f12c9c0416cdea283bf5f40 +refs/heads/master: fa28ba21cec24d3fa1279bcae7e5d5ff6224635a diff --git a/trunk/include/asm-x86/pgalloc_32.h b/trunk/include/asm-x86/pgalloc_32.h index 0caa37a9a25f..10c2b452e64c 100644 --- a/trunk/include/asm-x86/pgalloc_32.h +++ b/trunk/include/asm-x86/pgalloc_32.h @@ -74,6 +74,13 @@ static inline void pmd_free(pmd_t *pmd) static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) { + /* This is called just after the pmd has been detached from + the pgd, which requires a full tlb flush to be recognized + by the CPU. Rather than incurring multiple tlb flushes + while the address space is being pulled down, make the tlb + gathering machinery do a full flush when we're done. */ + tlb->fullmm = 1; + paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT); tlb_remove_page(tlb, virt_to_page(pmd)); } diff --git a/trunk/include/asm-x86/pgtable-3level.h b/trunk/include/asm-x86/pgtable-3level.h index ed4c6f0e57ec..a195c3e757b9 100644 --- a/trunk/include/asm-x86/pgtable-3level.h +++ b/trunk/include/asm-x86/pgtable-3level.h @@ -96,14 +96,23 @@ static inline void pud_clear(pud_t *pudp) set_pud(pudp, __pud(0)); /* - * Pentium-II erratum A13: in PAE mode we explicitly have to flush - * the TLB via cr3 if the top-level pgd is changed... + * In principle we need to do a cr3 reload here to make sure + * the processor recognizes the changed pgd. In practice, all + * the places where pud_clear() gets called are followed by + * full tlb flushes anyway, so we can defer the cost here. * - * XXX I don't think we need to worry about this here, since - * when clearing the pud, the calling code needs to flush the - * tlb anyway. But do it now for safety's sake. - jsgf + * Specifically: + * + * mm/memory.c:free_pmd_range() - immediately after the + * pud_clear() it does a pmd_free_tlb(). We change the + * mmu_gather structure to do a full tlb flush (which has the + * effect of reloading cr3) when the pagetable free is + * complete. + * + * arch/x86/mm/hugetlbpage.c:huge_pmd_unshare() - the call to + * this is followed by a flush_tlb_range, which on x86 does a + * full tlb flush. */ - write_cr3(read_cr3()); } #define pud_page(pud) \