• Jeremy Fitzhardinge's avatar
    x86: defer cr3 reload when doing pud_clear() · fa28ba21
    Jeremy Fitzhardinge authored
    PAE mode requires that we reload cr3 in order to guarantee that
    changes to the pgd will be noticed by the processor.  This means that
    in principle pud_clear needs to reload cr3 every time.  However,
    because reloading cr3 implies a tlb flush, we want to avoid it where
    possible.
    
    pud_clear() is only used in a couple of places:
     - in free_pmd_range(), when pulling down a range of process address space, and
     - huge_pmd_unshare()
    
    In both cases, the calling code will do a a tlb flush anyway, so
    there's no need to do it within pud_clear().
    
    In free_pmd_range(), the pud_clear is immediately followed by
    pmd_free_tlb(); we can hook that to make the mmu_gather do an
    unconditional full flush to make sure cr3 gets reloaded.
    
    In huge_pmd_unshare, it is followed by flush_tlb_range, which always
    results in a full cr3-reload tlb flush.
    Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
    Cc: Andi Kleen <ak@suse.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: William Irwin <wli@holomorphy.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    fa28ba21
pgtable-3level.h 4.85 KB