linux/arch/arm/include/asm
Linus Torvalds 8e220cfd1a Fix TLB gather virtual address range invalidation corner cases
commit 2b047252d0 upstream.

Ben Tebulin reported:

 "Since v3.7.2 on two independent machines a very specific Git
  repository fails in 9/10 cases on git-fsck due to an SHA1/memory
  failures.  This only occurs on a very specific repository and can be
  reproduced stably on two independent laptops.  Git mailing list ran
  out of ideas and for me this looks like some very exotic kernel issue"

and bisected the failure to the backport of commit 53a59fc67f ("mm:
limit mmu_gather batching to fix soft lockups on !CONFIG_PREEMPT").

That commit itself is not actually buggy, but what it does is to make it
much more likely to hit the partial TLB invalidation case, since it
introduces a new case in tlb_next_batch() that previously only ever
happened when running out of memory.

The real bug is that the TLB gather virtual memory range setup is subtly
buggered.  It was introduced in commit 597e1c3580 ("mm/mmu_gather:
enable tlb flush range in generic mmu_gather"), and the range handling
was already fixed at least once in commit e6c495a96c ("mm: fix the TLB
range flushed when __tlb_remove_page() runs out of slots"), but that fix
was not complete.

The problem with the TLB gather virtual address range is that it isn't
set up by the initial tlb_gather_mmu() initialization (which didn't get
the TLB range information), but it is set up ad-hoc later by the
functions that actually flush the TLB.  And so any such case that forgot
to update the TLB range entries would potentially miss TLB invalidates.

Rather than try to figure out exactly which particular ad-hoc range
setup was missing (I personally suspect it's the hugetlb case in
zap_huge_pmd(), which didn't have the same logic as zap_pte_range()
did), this patch just gets rid of the problem at the source: make the
TLB range information available to tlb_gather_mmu(), and initialize it
when initializing all the other tlb gather fields.

This makes the patch larger, but conceptually much simpler.  And the end
result is much more understandable; even if you want to play games with
partial ranges when invalidating the TLB contents in chunks, now the
range information is always there, and anybody who doesn't want to
bother with it won't introduce subtle bugs.

Ben verified that this fixes his problem.

Reported-bisected-and-tested-by: Ben Tebulin <tebulin@googlemail.com>
Build-testing-by: Stephen Rothwell <sfr@canb.auug.org.au>
Build-testing-by: Richard Weinberger <richard.weinberger@gmail.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-08-20 08:43:05 -07:00
..
hardware ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
mach Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2013-05-03 09:13:19 -07:00
xen xen/arm: implement HYPERVISOR_vcpu_op 2013-04-25 16:46:07 +00:00
arch_timer.h ARM: convert arm/arm64 arch timer to use CLKSRC_OF init 2013-04-11 15:11:15 -05:00
asm-offsets.h kbuild: move asm-offsets.h to include/generated 2009-12-12 13:08:14 +01:00
assembler.h ARM: virt: avoid clobbering lr when forcing svc mode 2013-01-10 21:09:31 +00:00
atomic.h ARM: 7687/1: atomics: don't use exclusives for atomic64 read/set with LPAE 2013-04-03 17:00:00 +01:00
barrier.h ARM: kill off arch_is_coherent 2012-10-02 08:58:07 +02:00
bitops.h Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
bug.h Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
bugs.h
cache.h ARM: implement support for read-mostly sections 2010-12-05 08:39:36 +00:00
cacheflush.h ARM: 7755/1: handle user space mapped pages in flush_kernel_dcache_page 2013-06-17 10:30:52 +01:00
cachetype.h ARM: 7062/1: cache: detect PIPT I-cache using CTR 2011-10-17 09:13:41 +01:00
checksum.h
clkdev.h ARM: Consolidate the clkdev header files 2011-07-19 18:09:45 +02:00
cmpxchg.h ARM: 7720/1: ARM v6/v7 cmpxchg64 shouldn't clear upper 32 bits of the old/new value 2013-05-13 23:42:24 +01:00
compiler.h Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
cp15.h ARM: make cr_alignment read-only #ifndef CONFIG_CPU_CP15 2013-01-31 21:44:45 +01:00
cpu.h ARM: kernel: add MIDR to per-CPU information data 2012-11-19 14:51:11 +00:00
cpuidle.h cpuidle: Add common time keeping and irq enabling 2012-03-21 01:59:40 -04:00
cputype.h ARM: 7763/1: kernel: fix __cpu_logical_map default initialization 2013-06-24 14:28:43 +01:00
cti.h ARM: coresight: common definition for (OS) Lock Access Register key value 2013-01-10 21:13:05 +00:00
delay.h ARM: 7685/1: delay: use private ticks_per_jiffy field for timer-based delay ops 2013-04-03 16:45:50 +01:00
device.h ARM: dma-mapping: Add macro to_dma_iommu_mapping() 2013-02-25 15:30:41 +01:00
div64.h Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
dma-contiguous.h ARM: integrate CMA with DMA-mapping subsystem 2012-05-21 15:09:38 +02:00
dma-iommu.h ARM: dma-mapping: Add arm_iommu_detach_device() 2013-02-25 15:30:41 +01:00
dma-mapping.h IOMMU Updates for Linux v3.8 2012-12-20 10:07:25 -08:00
dma.h ARM: disable virt_to_bus/virt_to_bus almost everywhere 2013-02-14 15:04:33 +01:00
domain.h ARM: fix set_domain() macro 2012-07-05 09:50:55 +01:00
ecard.h ARM: io: ecard: move ioaddr() inside __ecard_address 2011-08-17 08:44:16 +01:00
edac.h ARM: 7201/1: add EDAC atomic_scrub function 2011-12-11 08:35:50 +00:00
elf.h ARM: fix nommu builds with 48be69a02 (ARM: move signal handlers into a vdso-like page) 2013-08-11 18:35:20 -07:00
entry-macro-multi.S ARM: gic: consolidate PPI handling 2011-10-23 13:32:29 +01:00
exception.h ARM: 7115/4: move __exception and friends to asm/exception.h 2011-10-17 09:02:44 +01:00
fb.h
fiq.h ARM: 6940/1: fiq: Briefly document driver responsibilities for suspend/resume 2011-05-26 10:31:06 +01:00
firmware.h ARM: Add interface for registering and calling firmware-specific operations 2013-04-09 01:52:06 +09:00
fixmap.h
flat.h ARM: binfmt_flat: unused variable 'persistent' 2012-10-09 20:29:06 +02:00
floppy.h
fncpy.h ARM: 6640/1: Thumb-2: Symbol manipulation macros for function body copying 2011-01-27 11:48:58 +00:00
fpstate.h Fix common misspellings 2011-03-31 11:26:23 -03:00
ftrace.h ARM: 6319/1: ftrace: add Thumb-2 support to dynamic ftrace 2010-09-02 15:28:43 +01:00
futex.h ARM: 7425/1: extable: ensure fixup entries are 4-byte aligned 2012-06-16 16:30:25 +01:00
glue-cache.h ARM: cache: remove ARMv3 support code 2013-03-26 09:55:23 +00:00
glue-df.h ARM: sync comments about available data abort models with the code 2013-01-31 21:44:46 +01:00
glue-pf.h ARM: move cache/processor/fault glue to separate include files 2011-02-12 11:52:21 +00:00
glue-proc.h ARM: 7773/1: PJ4B: Add support for errata 4742 2013-06-24 14:28:46 +01:00
glue.h Fix common misspellings 2011-03-31 11:26:23 -03:00
gpio.h ARM: make mach/gpio.h headers optional 2012-09-14 09:21:59 -05:00
hardirq.h ARM: 7536/1: smp: Formalize an IPI for wakeup 2012-09-19 21:52:08 +01:00
highmem.h ARM: 7684/1: errata: Workaround for Cortex-A15 erratum 798181 (TLBI/DSB operations) 2013-04-03 16:45:49 +01:00
hw_breakpoint.h ARM: hw_breakpoint: Check function for OS Save and Restore mechanism 2013-01-10 21:13:06 +00:00
hw_irq.h arm: dove: Use proper irq accessor functions 2011-03-29 14:47:57 +02:00
hwcap.h UAPI: (Scripted) Disintegrate arch/arm/include/asm 2012-10-12 13:05:52 +01:00
hypervisor.h arm: initial Xen support 2012-09-14 13:53:39 +00:00
ide.h
idmap.h ARM: KVM: move to a KVM provided HYP idmap 2013-04-28 22:23:08 -07:00
io.h Merge 3.7-rc6 into char-misc-next 2012-11-16 18:21:36 -08:00
irq.h arm: Move the set_handle_irq and handle_arch_irq declarations to asm/irq.h 2013-03-26 16:11:20 +00:00
irqflags.h Fix IRQ flag handling naming 2010-10-07 14:08:55 +01:00
jump_label.h ARM: 7386/1: jump_label: fixup for rename to static_key 2012-04-15 22:00:31 +01:00
Kbuild Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2012-12-12 11:30:02 -08:00
kexec.h [ARM] add machine-specific hook to machine_kexec 2011-03-03 16:26:55 -05:00
kgdb.h kgdb,arm: fix register dump 2010-10-29 13:14:40 -05:00
kmap_types.h arm: remove km_type definitions 2012-07-24 15:27:28 +08:00
kprobes.h Kernel: Audit Support For The ARM Platform 2012-01-17 16:17:01 -05:00
kvm_arch_timer.h ARM: KVM: arch_timers: Add guest timer core support 2013-02-11 19:05:11 +00:00
kvm_arm.h ARM: KVM: abstract S1TW abort detection away 2013-03-06 15:48:42 -08:00
kvm_asm.h ARM: KVM: perform save/restore of PAR 2013-08-20 08:43:03 -07:00
kvm_coproc.h KVM: ARM: User space API for getting/setting co-proc registers 2013-01-23 13:29:14 -05:00
kvm_emulate.h ARM: KVM: move kvm_handle_wfi to handle_exit.c 2013-03-06 15:48:45 -08:00
kvm_host.h ARM: KVM: promote vfp_host pointer to generic host cpu context 2013-04-28 22:23:13 -07:00
kvm_mmio.h KVM: ARM: Handle I/O aborts 2013-01-23 13:29:17 -05:00
kvm_mmu.h ARM: KVM: perform HYP initilization for hotplugged CPUs 2013-04-28 22:23:11 -07:00
kvm_psci.h KVM: ARM: Power State Coordination Interface implementation 2013-01-23 13:29:18 -05:00
kvm_vgic.h ARM: KVM: remove superfluous include from kvm_vgic.h 2013-03-06 15:48:44 -08:00
limits.h
linkage.h
localtimer.h ARM: local timers: make the runtime registration interface mandatory 2012-03-13 13:45:55 +00:00
mach-types.h arm: move mach-types to include/generated 2009-12-12 13:08:14 +01:00
mc146818rtc.h ARM: mc146818rtc: remove unnecessary include of mach/irqs.h 2012-01-25 20:37:45 -06:00
mcpm.h ARM: mcpm: provide an interface to set the SMP ops at run time 2013-04-24 10:37:03 -04:00
memblock.h ARM: Add arm_memblock_steal() to allocate memory away from the kernel 2012-01-13 15:02:35 +00:00
memory.h arm-soc: non-critical bug fixes 2013-02-21 14:54:55 -08:00
mmu_context.h ARM: 7790/1: Fix deferred mm switch on VIVT processors 2013-08-11 18:35:20 -07:00
mmu.h ARM: 7790/1: Fix deferred mm switch on VIVT processors 2013-08-11 18:35:20 -07:00
module.h Make most arch asm/module.h files use asm-generic/module.h 2012-09-28 14:31:03 +09:30
mtd-xip.h
mutex.h ARM: 7495/1: mutex: use generic atomic_dec-based implementation for ARMv6+ 2012-08-25 09:22:31 +01:00
nwflash.h
opcodes-sec.h ARM: opcodes: add opcodes definitions for ARM security extensions 2013-01-10 21:10:20 +00:00
opcodes-virt.h ARM: opcodes: add __ERET/__MSR_ELR_HYP instruction encoding 2012-09-19 08:32:49 +01:00
opcodes.h ARM: opcodes: add missing include of linux/linkage.h 2013-01-10 21:10:20 +00:00
outercache.h ARM: 7639/1: cache-l2x0: add missed dummy outer_resume entry 2013-02-06 09:33:07 +00:00
page-nommu.h nommu: Remove the memory_start/end variables from ARM page-nommu.h 2009-07-24 12:35:01 +01:00
page.h ARM: make vectors page inaccessible from userspace 2013-08-11 18:35:20 -07:00
pci.h PCI: collapse pcibios_resource_to_bus 2012-02-23 20:19:04 -07:00
percpu.h ARM: 7747/1: pcpu: ensure __my_cpu_offset cannot be re-ordered across barrier() 2013-06-05 23:35:56 +01:00
perf_event.h ARM: 7584/1: perf: fix link error when CONFIG_HW_PERF_EVENTS is not selected 2012-11-23 13:01:30 +00:00
pgalloc.h ARM: LPAE: Page table maintenance for the 3-level format 2011-12-08 10:30:39 +00:00
pgtable-2level-hwdef.h ARM: 7077/1: LPAE: Use a mask for physical addresses in page table entries 2011-10-06 15:40:06 +01:00
pgtable-2level-types.h ARM: 7076/1: LPAE: Add (pte|pmd)val_t type definitions as u32 2011-10-06 15:40:05 +01:00
pgtable-2level.h ARM: mm: introduce present, faulting entries for PAGE_NONE 2012-11-09 14:13:20 +00:00
pgtable-3level-hwdef.h KVM: ARM: Hypervisor initialization 2013-01-23 13:29:10 -05:00
pgtable-3level-types.h ARM: LPAE: Introduce the 3-level page table format definitions 2011-12-08 10:30:39 +00:00
pgtable-3level.h ARM: KVM: fix L_PTE_S2_RDWR to actually be Read/Write 2013-04-16 16:21:25 -07:00
pgtable-hwdef.h ARM: LPAE: Introduce the 3-level page table format definitions 2011-12-08 10:30:39 +00:00
pgtable-nommu.h Remove remaining bits of io_remap_page_range() 2012-03-23 16:58:31 -07:00
pgtable.h arm: set the page table freeing ceiling to TASK_SIZE 2013-04-29 15:54:34 -07:00
pmu.h ARM: perf: consistently use arm_pmu->name for PMU name 2012-11-09 11:37:26 +00:00
proc-fns.h ARM: LPAE: Page table maintenance for the 3-level format 2011-12-08 10:30:39 +00:00
processor.h ARM: 7791/1: a.out: remove partial a.out support 2013-08-11 18:35:20 -07:00
procinfo.h
prom.h Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2012-12-12 11:30:02 -08:00
psci.h ARM: psci: add support for PSCI invocations from the kernel 2013-01-10 21:10:20 +00:00
ptrace.h UAPI: (Scripted) Disintegrate arch/arm/include/asm 2012-10-12 13:05:52 +01:00
scatterlist.h ARM: Allow SoCs to enable scatterlist chaining 2011-06-02 11:16:22 +01:00
sched_clock.h ARM: make sched_clock just call a function pointer 2013-04-10 18:27:12 -05:00
seccomp.h ARM: SECCOMP support 2010-10-01 22:32:18 -04:00
setup.h UAPI: (Scripted) Disintegrate arch/arm/include/asm 2012-10-12 13:05:52 +01:00
shmparam.h
signal.h arm: switch to generic old sigaction() 2013-02-03 18:15:47 -05:00
smp_plat.h ARM: 7763/1: kernel: fix __cpu_logical_map default initialization 2013-06-24 14:28:43 +01:00
smp_scu.h arm-soc: soc-specific updates 2013-02-21 15:27:22 -08:00
smp_twd.h ARM: smp_twd: convert to use CLKSRC_OF init 2013-03-11 08:42:08 -05:00
smp.h ARM: 7571/1: SMP: add function arch_send_wakeup_ipi_mask() 2012-11-13 11:47:40 +00:00
sparsemem.h
spinlock_types.h ARM: 7446/1: spinlock: use ticket algorithm for ARMv6+ locking implementation 2012-07-09 17:41:10 +01:00
spinlock.h ARM: 7632/1: spinlock: avoid exclusive accesses on unlock() path 2013-01-28 14:13:05 +00:00
stackprotector.h ARM: initial stack protector (-fstack-protector) support 2010-06-14 21:31:00 -04:00
stacktrace.h
string.h
suspend.h ARM: pm: preallocate a page table for suspend/resume 2011-09-20 23:33:36 +01:00
swab.h UAPI: (Scripted) Disintegrate arch/arm/include/asm 2012-10-12 13:05:52 +01:00
switch_to.h Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
sync_bitops.h xen/arm: sync_bitops 2012-08-08 16:34:01 +00:00
syscall.h ARM: 7577/1: arch/add syscall_get_arch 2012-11-19 14:14:17 +00:00
system_info.h Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
system_misc.h arm: Use generic idle loop 2013-04-08 17:39:24 +02:00
system.h the only place that needs to include asm/exec.h is linux/binfmts.h 2012-09-20 09:51:13 -04:00
tcm.h ARM: 6985/1: export functions to determine the presence of I/DTCM 2011-07-06 20:49:45 +01:00
therm.h
thread_info.h ARM: 7790/1: Fix deferred mm switch on VIVT processors 2013-08-11 18:35:20 -07:00
thread_notify.h ARM: 6867/1: Introduce THREAD_NOTIFY_COPY for copy_thread() hooks 2011-04-10 21:13:36 +01:00
timex.h Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2012-10-07 21:20:57 +09:00
tlb.h Fix TLB gather virtual address range invalidation corner cases 2013-08-20 08:43:05 -07:00
tlbflush.h Merge branches 'devel-stable', 'entry', 'fixes', 'mach-types', 'misc' and 'smp-hotplug' into for-linus 2013-05-02 21:30:36 +01:00
tls.h ARM: 7403/1: tls: remove covert channel via TPIDRURW 2012-04-28 11:01:30 +01:00
topology.h ARM: 7182/1: ARM cpu topology: fix warning 2011-11-30 23:55:21 +00:00
traps.h ARM: earlier initialization of vectors page 2012-01-23 10:24:11 +00:00
uaccess.h ARM: warnings in arch/arm/include/asm/uaccess.h 2012-10-09 20:29:07 +02:00
ucontext.h Fix common misspellings 2011-03-31 11:26:23 -03:00
unified.h ARM: make BSYM macro assembly only 2012-01-16 08:56:25 -06:00
unistd.h consolidate cond_syscall and SYSCALL_ALIAS declarations 2013-03-03 22:55:19 -05:00
unwind.h ARM: 7187/1: fix unwinding for XIP kernels 2011-12-06 11:16:13 +00:00
user.h ARM: 6798/1: aout-core: zero thread debug registers in a.out core dump 2011-03-10 15:16:29 +00:00
vfp.h
vfpmacros.h ARM: 7566/1: vfp: fix save and restore when running on pre-VFPv3 and CONFIG_VFPv3 set 2012-10-29 10:04:05 +00:00
vga.h ARM: set vga memory base at run-time 2011-07-12 11:19:29 -05:00
virt.h ARM: virt: use PSR_N_BIT for detecting boot CPU mode mismatch 2013-01-10 21:09:32 +00:00
word-at-a-time.h ARM: 7450/1: dcache: select DCACHE_WORD_ACCESS for little-endian ARMv6+ CPUs 2012-07-09 17:41:11 +01:00
xor.h