linux/include/asm-generic
Dave Hansen 1de14c3c5c x86-32: Fix possible incomplete TLB invalidate with PAE pagetables
This patch attempts to fix:

	https://bugzilla.kernel.org/show_bug.cgi?id=56461

The symptom is a crash and messages like this:

	chrome: Corrupted page table at address 34a03000
	*pdpt = 0000000000000000 *pde = 0000000000000000
	Bad pagetable: 000f [#1] PREEMPT SMP

Ingo guesses this got introduced by commit 611ae8e3f5 ("x86/tlb:
enable tlb flush range support for x86") since that code started to free
unused pagetables.

On x86-32 PAE kernels, that new code has the potential to free an entire
PMD page and will clear one of the four page-directory-pointer-table
(aka pgd_t entries).

The hardware aggressively "caches" these top-level entries and invlpg
does not actually affect the CPU's copy.  If we clear one we *HAVE* to
do a full TLB flush, otherwise we might continue using a freed pmd page.
(note, we do this properly on the population side in pud_populate()).

This patch tracks whenever we clear one of these entries in the 'struct
mmu_gather', and ensures that we follow up with a full tlb flush.

BTW, I disassembled and checked that:

	if (tlb->fullmm == 0)
and
	if (!tlb->fullmm && !tlb->need_flush_all)

generate essentially the same code, so there should be zero impact there
to the !PAE case.

Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Artem S Tashkinov <t.artem@mailcity.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2013-04-12 16:56:47 -07:00
..
bitops
4level-fixup.h
Kbuild.asm
atomic-long.h
atomic.h asm-generic: move cmpxchg*_local defs to cmpxchg.h 2013-03-13 06:11:05 +01:00
atomic64.h
audit_change_attr.h
audit_dir_write.h
audit_read.h
audit_signal.h
audit_write.h
barrier.h
bitops.h
bitsperlong.h
bug.h
bugs.h
cache.h
cacheflush.h
checksum.h asm-generic headers: Allow yet more arch overrides in checksum.h 2013-02-11 20:00:33 +05:30
clkdev.h
cmpxchg-local.h generic: Use raw local irq variant for generic cmpxchg 2013-02-19 08:43:37 +01:00
cmpxchg.h asm-generic: move cmpxchg*_local defs to cmpxchg.h 2013-03-13 06:11:05 +01:00
cputime.h cputime: Generic on-demand virtual cputime accounting 2013-01-27 19:23:27 +01:00
cputime_jiffies.h cputime: Move default nsecs_to_cputime() to jiffies based cputime file 2013-01-27 19:23:25 +01:00
cputime_nsecs.h cputime: Constify timeval_to_cputime(timeval) argument 2013-02-24 12:57:15 +01:00
current.h
delay.h
device.h
div64.h
dma-coherent.h
dma-contiguous.h
dma-mapping-broken.h asm-generic/dma-mapping-broken.h: Provide dma_alloc_attrs()/dma_free_attrs() 2012-12-25 20:14:54 +01:00
dma-mapping-common.h
dma.h
emergency-restart.h
exec.h
fb.h
ftrace.h
futex.h
getorder.h
gpio.h gpiolib: let gpio_chip reference its descriptors 2013-02-11 22:21:28 +00:00
hardirq.h
hw_irq.h
ide_iops.h
int-l64.h
int-ll64.h
io-64-nonatomic-hi-lo.h
io-64-nonatomic-lo-hi.h
io.h ImgTec Meta architecture changes for v3.9-rc1 2013-03-03 12:06:09 -08:00
ioctl.h
iomap.h
irq.h
irq_regs.h
irqflags.h
kdebug.h
kmap_types.h
kvm_para.h
libata-portmap.h
linkage.h
local.h
local64.h
memory_model.h
mm_hooks.h
mmu.h
mmu_context.h
module.h
mutex-dec.h
mutex-null.h
mutex-xchg.h
mutex.h
page.h
param.h
parport.h include: remove __dev* attributes. 2013-01-03 15:57:16 -08:00
pci-bridge.h
pci-dma-compat.h
pci.h
pci_iomap.h
percpu.h
pgalloc.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable.h s390/mm: implement software dirty bits 2013-02-14 15:55:23 +01:00
ptrace.h
resource.h
rtc.h
rwsem.h
scatterlist.h
sections.h
segment.h
serial.h
siginfo.h
signal.h
sizes.h
spinlock.h
statfs.h
string.h
switch_to.h
syscall.h
syscalls.h burying unused conditionals 2013-02-14 09:21:15 -05:00
termios-base.h
termios.h
timex.h
tlb.h x86-32: Fix possible incomplete TLB invalidate with PAE pagetables 2013-04-12 16:56:47 -07:00
tlbflush.h
topology.h
trace_clock.h
uaccess-unaligned.h
uaccess.h asm-generic: uaccess: Allow arches to over-ride __{get,put}_user_fn() 2013-02-11 20:00:32 +05:30
unaligned.h
unistd.h ImgTec Meta architecture changes for v3.9-rc1 2013-03-03 12:06:09 -08:00
user.h
vga.h
vmlinux.lds.h arm-soc: cleanups 2013-02-21 14:58:40 -08:00
word-at-a-time.h
xor.h