linux/arch/x86/mm
Jeremy Fitzhardinge 8fe3deef01 x86: preallocate pmds at pgd creation time
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: Jeremy 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: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2008-01-30 13:33:40 +01:00
..
boot_ioremap_32.c x86: cleanup tlbflush.h variants 2008-01-30 13:30:35 +01:00
discontig_32.c x86: make NUMA work on 32-bit 2008-01-30 13:33:25 +01:00
extable.c x86: unify extable_{32|64}.c 2008-01-30 13:31:41 +01:00
fault_32.c x86: use v8086_mode helper, trivial unification 2008-01-30 13:33:23 +01:00
fault_64.c x86: update reliability argument to printk_address 2008-01-30 13:33:24 +01:00
highmem_32.c x86: kmap_atomic() debugging 2008-01-30 13:30:47 +01:00
hugetlbpage.c x86: demacro asm-x86/pgalloc_32.h 2008-01-30 13:33:39 +01:00
init_32.c x86: demacro asm-x86/pgalloc_32.h 2008-01-30 13:33:39 +01:00
init_64.c x86: replace hard coded reservations in 64-bit early boot code with dynamic table 2008-01-30 13:33:17 +01:00
ioremap_32.c i386: move mm 2007-10-11 11:16:47 +02:00
ioremap_64.c x86: pat: e820 cleanup 2008-01-30 13:33:08 +01:00
k8topology_64.c x86: clean up k8topology.c 2008-01-30 13:32:36 +01:00
Makefile x86_64: move mm 2007-10-11 11:17:18 +02:00
Makefile_32 x86: unify extable_{32|64}.c 2008-01-30 13:31:41 +01:00
Makefile_64 x86: unify extable_{32|64}.c 2008-01-30 13:31:41 +01:00
mmap.c x86: unify mmap_{32|64}.c 2008-01-30 13:31:10 +01:00
numa_64.c x86: early cpu_to_node fix in numa_64.c 2008-01-30 13:33:33 +01:00
pageattr_32.c x86: Create clflush() inline, remove hardcoded wbinvd 2007-10-17 20:16:12 +02:00
pageattr_64.c Intel IOMMU: clflush_cache_range now takes size param 2007-10-22 08:13:18 -07:00
pgtable_32.c x86: preallocate pmds at pgd creation time 2008-01-30 13:33:40 +01:00
srat_64.c x86: fix section mismatch warning in srat_64.c 2008-01-30 13:33:37 +01:00