kernel-ark/arch/x86/include/asm
Peter Zijlstra 42ef73fe13 x86, mm: fix pte_free()
On -rt we were seeing spurious bad page states like:

Bad page state in process 'firefox'
page:c1bc2380 flags:0x40000000 mapping:c1bc2390 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:
Pid: 503, comm: firefox Not tainted 2.6.26.8-rt13 #3
[<c043d0f3>] ? printk+0x14/0x19
[<c0272d4e>] bad_page+0x4e/0x79
[<c0273831>] free_hot_cold_page+0x5b/0x1d3
[<c02739f6>] free_hot_page+0xf/0x11
[<c0273a18>] __free_pages+0x20/0x2b
[<c027d170>] __pte_alloc+0x87/0x91
[<c027d25e>] handle_mm_fault+0xe4/0x733
[<c043f680>] ? rt_mutex_down_read_trylock+0x57/0x63
[<c043f680>] ? rt_mutex_down_read_trylock+0x57/0x63
[<c0218875>] do_page_fault+0x36f/0x88a

This is the case where a concurrent fault already installed the PTE and
we get to free the newly allocated one.

This is due to pgtable_page_ctor() doing the spin_lock_init(&page->ptl)
which is overlaid with the {private, mapping} struct.

union {
    struct {
        unsigned long private;
        struct address_space *mapping;
    };
    spinlock_t ptl;
    struct kmem_cache *slab;
    struct page *first_page;
};

Normally the spinlock is small enough to not stomp on page->mapping, but
PREEMPT_RT=y has huge 'spin'locks.

But lockdep kernels should also be able to trigger this splat, as the
lock tracking code grows the spinlock to cover page->mapping.

The obvious fix is calling pgtable_page_dtor() like the regular pte free
path __pte_free_tlb() does.

It seems all architectures except x86 and nm10300 already do this, and
nm10300 doesn't seem to use pgtable_page_ctor(), which suggests it
doesn't do SMP or simply doesnt do MMU at all or something.

Signed-off-by: Peter Zijlstra <a.p.zijlsta@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: <stable@kernel.org>
2009-01-23 18:42:06 +01:00
..
bigsmp
es7000 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-10 06:13:09 -08:00
mach-default x86: fix apic.c build error on latest git 2009-01-12 19:24:23 +01:00
mach-generic x86: rename mp_config_table to mpc_table 2009-01-04 13:22:58 +01:00
mach-rdc321x
mach-voyager
numaq Merge branches 'x86/cleanups', 'x86/mpparse', 'x86/numa' and 'x86/uv' into x86/urgent 2009-01-06 17:39:52 +01:00
summit Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-10 06:13:09 -08:00
uv x86: uv_bau.h: fix dubious bitfield 2008-12-30 13:31:37 -08:00
visws
xen
a.out-core.h
a.out.h
acpi.h
agp.h
alternative-asm.h
alternative.h
amd_iommu_types.h AMD IOMMU: add init code for statistic collection 2009-01-03 14:11:58 +01:00
amd_iommu.h
apic.h x86: apic.c: xapic_icr_read and x2apic_icr_read should be static 2008-12-30 13:31:28 -08:00
apicdef.h
arch_hooks.h
asm.h
atomic_32.h atomic_t: unify all arch definitions 2009-01-06 15:59:10 -08:00
atomic_64.h atomic_t: unify all arch definitions 2009-01-06 15:59:10 -08:00
atomic.h
auxvec.h
bios_ebda.h
bitops.h x86, generic: mark complex bitops.h inlines as __always_inline 2009-01-13 18:56:30 +01:00
boot.h
bootparam.h
bug.h
bugs.h
byteorder.h x86: introduce asm/swab.h 2009-01-06 18:10:27 -08:00
cache.h
cacheflush.h
calgary.h
calling.h
checksum_32.h
checksum_64.h
checksum.h
cmpxchg_32.h
cmpxchg_64.h
cmpxchg.h
compat.h
cpu.h
cpufeature.h
cputime.h
current.h
debugreg.h
delay.h
desc_defs.h
desc.h x86: fix lguest used_vectors breakage, -v2 2008-12-23 22:37:28 +01:00
device.h
div64.h
dma-mapping.h Merge branch 'core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-30 16:10:19 -08:00
dma.h
dmi.h
ds.h
dwarf2.h
e820.h
edac.h
efi.h x86: efi.c declare add_efi_memmap before they get used 2008-12-29 18:17:32 +01:00
elf.h [S390] arch_setup_additional_pages arguments 2008-12-25 13:38:54 +01:00
emergency-restart.h
errno.h
fb.h
fcntl.h
fixmap_32.h
fixmap_64.h
fixmap.h
floppy.h
frame.h
ftrace.h
futex.h
gart.h
genapic_32.h x86: rename mpc_config_processor to mpc_cpu 2009-01-04 13:23:00 +01:00
genapic_64.h
genapic.h
geode.h
gpio.h
hardirq_32.h
hardirq_64.h
hardirq.h
highmem.h
hpet.h
hugetlb.h
hw_irq.h
hypertransport.h
hypervisor.h
i387.h
i8253.h
i8259.h
ia32_unistd.h
ia32.h
idle.h
intel_arch_perfmon.h
io_32.h
io_64.h
io_apic.h Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-30 16:20:19 -08:00
io.h x86: fix assumed to be contiguous leaf page tables for kmap_atomic region (take 2) 2009-01-16 13:47:04 +01:00
ioctl.h
ioctls.h
iomap.h
iommu.h Merge branch 'core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-30 16:10:19 -08:00
ipcbuf.h
ipi.h
irq_regs_32.h
irq_regs_64.h
irq_regs.h
irq_remapping.h
irq_vectors.h
irq.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpumask into merge-rr-cpumask 2009-01-03 18:53:31 +01:00
irqflags.h
ist.h
k8.h
Kbuild x86: introduce asm/swab.h 2009-01-06 18:10:27 -08:00
kdebug.h
kexec.h
kgdb.h
kmap_types.h
kprobes.h
kvm_host.h KVM: change KVM to use IOMMU API 2009-01-03 14:11:07 +01:00
kvm_para.h
kvm_x86_emulate.h KVM: x86 emulator: add Src2 decode set 2008-12-31 16:55:42 +02:00
kvm.h
ldt.h
lguest_hcall.h
lguest.h x86: cleanup some remaining usages of NR_CPUS where s/b nr_cpu_ids 2009-01-03 19:00:55 +01:00
linkage.h
local.h
math_emu.h
mc146818rtc.h
mca_dma.h
mca.h
mce.h
microcode.h
mman.h
mmconfig.h
mmu_context_32.h
mmu_context_64.h
mmu_context.h
mmu.h
mmx.h
mmzone_32.h
mmzone_64.h
mmzone.h
module.h
mpspec_def.h x86: rename all fields of mpc_table mpc_X to X 2009-01-05 14:08:34 +01:00
mpspec.h x86: apic.c declare pic_mode before they get used 2008-12-29 18:17:30 +01:00
msgbuf.h
msidef.h
msr-index.h x86: add MSR_IA32_MISC_ENABLE bits to <asm/msr-index.h> 2009-01-21 15:13:53 -08:00
msr.h Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-28 12:21:10 -08:00
mtrr.h x86, mtrr: fix types used in userspace exported header 2009-01-08 16:13:59 +01:00
mutex_32.h
mutex_64.h
mutex.h
nmi.h
nops.h
numa_32.h
numa_64.h
numa.h
numaq.h
olpc.h
page_32.h
page_64.h
page.h
param.h
paravirt.h
parport.h
pat.h
pci_32.h
pci_64.h
pci_x86.h x86, pci: move arch/x86/pci/pci.h to arch/x86/include/asm/pci_x86.h 2008-12-29 18:17:36 +01:00
pci-direct.h
pci.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2008-12-31 23:05:57 +10:30
pda.h
percpu.h
pgalloc.h x86, mm: fix pte_free() 2009-01-23 18:42:06 +01:00
pgtable_32.h
pgtable_64.h
pgtable-2level-defs.h
pgtable-2level.h
pgtable-3level-defs.h
pgtable-3level.h
pgtable.h
poll.h
posix_types_32.h
posix_types_64.h
posix_types.h
prctl.h
processor-cyrix.h
processor-flags.h
processor.h Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-28 12:21:10 -08:00
proto.h
ptrace-abi.h
ptrace.h
pvclock-abi.h
pvclock.h
reboot_fixups.h
reboot.h
required-features.h
resource.h
resume-trace.h
rio.h
rtc.h
rwlock.h
rwsem.h
scatterlist.h
seccomp_32.h
seccomp_64.h
seccomp.h
sections.h
segment.h
sembuf.h
serial.h
setup.h x86: rename mpc_config_oemtable to mpc_oemtable 2009-01-04 13:23:02 +01:00
shmbuf.h
shmparam.h
sigcontext32.h
sigcontext.h
sigframe.h
siginfo.h
signal.h
smp.h x86: cleanup remaining cpumask_t ops in smpboot code 2009-01-04 15:39:26 +01:00
socket.h
sockios.h
sparsemem.h
spinlock_types.h
spinlock.h
srat.h
stacktrace.h
stat.h
statfs.h
string_32.h
string_64.h
string.h
suspend_32.h
suspend_64.h
suspend.h
svm.h KVM: SVM: move svm.h to include/asm 2008-12-31 16:52:28 +02:00
swab.h x86: introduce asm/swab.h 2009-01-06 18:10:27 -08:00
swiotlb.h swiotlb: replace architecture-specific swiotlb.h with linux/swiotlb.h 2008-12-28 10:04:00 +01:00
sync_bitops.h
sys_ia32.h x86: introducing asm/sys_ia32.h 2008-12-29 13:18:40 +01:00
syscall.h
syscalls.h Revert "x86: signal: change type of paramter for sys_rt_sigreturn()" 2009-01-21 09:43:18 +01:00
system_64.h
system.h
tce.h
termbits.h
termios.h
therm_throt.h
thread_info.h Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-28 12:21:10 -08:00
time.h
timer.h
timex.h
tlb.h
tlbflush.h
topology.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpumask into merge-rr-cpumask 2009-01-03 18:53:31 +01:00
trampoline.h
traps.h
tsc.h
types.h
uaccess_32.h
uaccess_64.h
uaccess.h Merge branch 'core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-30 16:10:19 -08:00
ucontext.h
unaligned.h
unistd_32.h
unistd_64.h
unistd.h
user32.h
user_32.h
user_64.h
user.h
vdso.h
vga.h
vgtod.h
vic.h
virtext.h x86: cpu_emergency_svm_disable() function 2008-12-31 16:52:30 +02:00
vm86.h
vmi_time.h
vmi.h
vmware.h
vmx.h KVM: VMX: move ASM_VMX_* definitions from asm/kvm_host.h to asm/vmx.h 2008-12-31 16:52:28 +02:00
voyager.h
vsyscall.h
xcr.h
xor_32.h
xor_64.h
xor.h
xsave.h