[PATCH 2 of 4] x86: revert "defer cr3 reload when doing pud_clear()"
Revert "defer cr3 reload when doing pud_clear()" since I'm going to replace it. Signed-off-by: Jeremy Fitzhardinge <[EMAIL PROTECTED]> --- arch/x86/mm/pgtable_32.c |7 --- include/asm-x86/pgtable-3level.h | 21 ++--- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c @@ -373,13 +373,6 @@ 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/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h --- a/include/asm-x86/pgtable-3level.h +++ b/include/asm-x86/pgtable-3level.h @@ -96,23 +96,14 @@ set_pud(pudp, __pud(0)); /* -* 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. +* Pentium-II erratum A13: in PAE mode we explicitly have to flush +* the TLB via cr3 if the top-level pgd is changed... * -* 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. +* 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 */ + write_cr3(read_cr3()); } #define pud_page(pud) \ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2 of 4] x86: revert defer cr3 reload when doing pud_clear()
Revert defer cr3 reload when doing pud_clear() since I'm going to replace it. Signed-off-by: Jeremy Fitzhardinge [EMAIL PROTECTED] --- arch/x86/mm/pgtable_32.c |7 --- include/asm-x86/pgtable-3level.h | 21 ++--- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c @@ -373,13 +373,6 @@ 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/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h --- a/include/asm-x86/pgtable-3level.h +++ b/include/asm-x86/pgtable-3level.h @@ -96,23 +96,14 @@ set_pud(pudp, __pud(0)); /* -* 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. +* Pentium-II erratum A13: in PAE mode we explicitly have to flush +* the TLB via cr3 if the top-level pgd is changed... * -* 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. +* 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 */ + write_cr3(read_cr3()); } #define pud_page(pud) \ -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2 of 4] x86: revert "defer cr3 reload when doing pud_clear()"
Revert "defer cr3 reload when doing pud_clear()" since I'm going to replace it. Signed-off-by: Jeremy Fitzhardinge <[EMAIL PROTECTED]> --- include/asm-x86/pgalloc_32.h |7 --- include/asm-x86/pgtable-3level.h | 21 ++--- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/include/asm-x86/pgalloc_32.h b/include/asm-x86/pgalloc_32.h --- a/include/asm-x86/pgalloc_32.h +++ b/include/asm-x86/pgalloc_32.h @@ -74,13 +74,6 @@ 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/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h --- a/include/asm-x86/pgtable-3level.h +++ b/include/asm-x86/pgtable-3level.h @@ -96,23 +96,14 @@ static inline void pud_clear(pud_t *pudp set_pud(pudp, __pud(0)); /* -* 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. +* Pentium-II erratum A13: in PAE mode we explicitly have to flush +* the TLB via cr3 if the top-level pgd is changed... * -* 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. +* 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 */ + write_cr3(read_cr3()); } #define pud_page(pud) \ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2 of 4] x86: revert defer cr3 reload when doing pud_clear()
Revert defer cr3 reload when doing pud_clear() since I'm going to replace it. Signed-off-by: Jeremy Fitzhardinge [EMAIL PROTECTED] --- include/asm-x86/pgalloc_32.h |7 --- include/asm-x86/pgtable-3level.h | 21 ++--- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/include/asm-x86/pgalloc_32.h b/include/asm-x86/pgalloc_32.h --- a/include/asm-x86/pgalloc_32.h +++ b/include/asm-x86/pgalloc_32.h @@ -74,13 +74,6 @@ 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/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h --- a/include/asm-x86/pgtable-3level.h +++ b/include/asm-x86/pgtable-3level.h @@ -96,23 +96,14 @@ static inline void pud_clear(pud_t *pudp set_pud(pudp, __pud(0)); /* -* 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. +* Pentium-II erratum A13: in PAE mode we explicitly have to flush +* the TLB via cr3 if the top-level pgd is changed... * -* 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. +* 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 */ + write_cr3(read_cr3()); } #define pud_page(pud) \ -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/