• Jeremy Fitzhardinge's avatar
    x86: preallocate pmds at pgd creation time · 8fe3deef
    Jeremy Fitzhardinge authored
    In PAE mode, an update to the pgd requires a cr3 reload to make sure
    the processor notices the changes.  Since this also has the
    side-effect of flushing the tlb, its an expensive operation which we
    want to avoid where possible.
    
    This patch mitigates the cost of installing the initial set of pmds on
    process creation by preallocating them when the pgd is allocated.
    This avoids up to three tlb flushes during exec, as it creates the new
    process address space while the pagetable is in active use.
    
    The pmds will be freed as part of the normal pagetable teardown in
    free_pgtables, which is called in munmap and process exit.  However,
    free_pgtables will only free parts of the pagetable which actually
    contain mappings, so stray pmds may still be attached to the pgd at
    pgd_free time.  We must mop them up to prevent a memory leak.
    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>
    8fe3deef
pgtable_32.c 10.9 KB