linux/arch/x86/kernel
Hugh Dickins 61165d7a03 x86: fix app crashes after SMP resume
After resume on a 2cpu laptop, kernel builds collapse with a sed hang,
sh or make segfault (often on 20295564), real-time signal to cc1 etc.

Several hurdles to jump, but a manually-assisted bisect led to -rc1's
d2bcbad5f3 x86: do not zap_low_mappings
in __smp_prepare_cpus.  Though the low mappings were removed at bootup,
they were left behind (with Global flags helping to keep them in TLB)
after resume or cpu online, causing the crashes seen.

Reinstate zap_low_mappings (with local __flush_tlb_all) for each cpu_up
on x86_32.  This used to be serialized by smp_commenced_mask: that's now
gone, but a low_mappings flag will do.  No need for native_smp_cpus_done
to repeat the zap: let mem_init zap BSP's low mappings just like on UP.

(In passing, fix error code from native_cpu_up: do_boot_cpu returns a
variety of diagnostic values, Dprintk what it says but convert to -EIO.
And save_pg_dir separately before zap_low_mappings: doesn't matter now,
but zapping twice in succession wiped out resume's swsusp_pg_dir.)

That worked well on the duo and one quad, but wouldn't boot 3rd or 4th
cpu on P4 Xeon, oopsing just after unlock_ipi_call_lock.  The TLB flush
IPI now being sent reveals a long-standing bug: the booting cpu has its
APIC readied in smp_callin at the top of start_secondary, but isn't put
into the cpu_online_map until just before that unlock_ipi_call_lock.

So native_smp_call_function_mask to online cpus would send_IPI_allbutself,
including the cpu just coming up, though it has been excluded from the
count to wait for: by the time it handles the IPI, the call data on
native_smp_call_function_mask's stack may well have been overwritten.

So fall back to send_IPI_mask while cpu_online_map does not match
cpu_callout_map: perhaps there's a better APICological fix to be
made at the start_secondary end, but I wouldn't know that.

Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-05-13 19:36:12 +02:00
..
acpi x86: wakeup.lds.S - section ordering fix 2008-05-12 21:27:51 +02:00
cpu x86: cleanup PAT cpu validation 2008-05-08 15:43:51 +02:00
.gitignore
alternative.c x86: harden kernel code patching 2008-04-25 19:54:07 +02:00
aperture_64.c
apic_32.c x86: cleanup div_sc() usage 2008-04-26 17:35:47 +02:00
apic_64.c x86: cleanup div_sc() usage 2008-04-26 17:35:47 +02:00
apm_32.c Merge branches 'release', 'acpica', 'bugzilla-10224', 'bugzilla-9772', 'bugzilla-9916', 'ec', 'eeepc', 'idle', 'misc', 'pm-legacy', 'sysfs-links-2.6.26', 'thermal', 'thinkpad' and 'video' into release 2008-04-30 13:58:00 -04:00
asm-offsets.c
asm-offsets_32.c x86: use kbuild.h 2008-04-29 08:06:29 -07:00
asm-offsets_64.c x86: use kbuild.h 2008-04-29 08:06:29 -07:00
audit_64.c
bootflag.c
bugs_64.c
cpuid.c
crash.c x86: allow machine_crash_shutdown to be replaced 2008-04-27 12:00:29 +03:00
crash_dump_32.c
crash_dump_64.c
doublefault_32.c
ds.c
e820_32.c
e820_64.c bootprotocol: cleanup 2008-04-29 13:45:24 +02:00
early-quirks.c
early_printk.c
efi.c
efi_32.c
efi_64.c
efi_stub_32.S
efi_stub_64.S
entry_32.S xen: fold xen_sysexit into xen_iret 2008-04-24 23:57:33 +02:00
entry_64.S
genapic_64.c fix: x86: support for new UV apic 2008-04-30 23:15:34 +02:00
genapic_flat_64.c
genx2apic_uv_x.c
geode_32.c x86: GEODE: cache results from geode_has_vsa2() and uninline 2008-05-08 15:43:50 +02:00
head32.c
head64.c x86, boot: add linked list of struct setup_data 2008-04-26 21:34:42 +02:00
head_32.S x86: fix early-BUG message 2008-04-30 23:15:34 +02:00
head_64.S
hpet.c hpet: fix 2008-04-30 23:15:34 +02:00
i386_ksyms_32.c
i387.c x86: fix fpu restore from sig return 2008-05-10 19:31:45 +02:00
i8237.c
i8253.c x86: cleanup div_sc() usage 2008-04-26 17:35:47 +02:00
i8259_32.c
i8259_64.c
init_task.c
io_apic_32.c x86: Fix 32-bit MSI-X allocation leakage 2008-04-28 10:49:17 -07:00
io_apic_64.c x86: section mismatch fixes, #3 2008-04-26 17:35:48 +02:00
io_delay.c
ioport.c
ipi.c
irq_32.c proper __do_softirq() prototype 2008-04-29 08:06:02 -07:00
irq_64.c
k8.c
kdebugfs.c x86, boot: export linked list of struct setup_data via debugfs 2008-04-26 21:34:42 +02:00
kgdb.c
kprobes.c
kvm.c x86: KVM guest: hypercall batching 2008-04-27 12:00:28 +03:00
kvmclock.c x86: KVM geust: make setup_secondary_clock definition dependent on local apic 2008-05-04 14:45:12 +03:00
ldt.c
machine_kexec_32.c
machine_kexec_64.c
Makefile pcspkr: fix dependancies 2008-05-07 12:42:03 +02:00
mca_32.c
mfgpt_32.c x86: geode: MSR cleanup 2008-04-28 08:58:35 -07:00
microcode.c
mmconf-fam10h_64.c x86: add pci=check_enable_amd_mmconf and dmi check 2008-04-26 23:41:04 +02:00
module_32.c
module_64.c
mpparse.c x86: es7000 build fix 2008-05-04 20:04:45 +02:00
msr.c
nmi_32.c
nmi_64.c
numaq_32.c
olpc.c x86: olpc: add One Laptop Per Child architecture support 2008-04-29 08:06:07 -07:00
paravirt.c x86: add pud_alloc for 4-level pagetables 2008-04-24 23:57:31 +02:00
paravirt_patch_32.c
paravirt_patch_64.c
pci-calgary_64.c x86: remove duplicate get_bios_ebda() from rio.h 2008-04-26 17:35:47 +02:00
pci-dma.c x86/pci: fix broken ISA DMA 2008-05-12 21:27:50 +02:00
pci-gart_64.c
pci-nommu.c
pci-swiotlb_64.c
pcspeaker.c
pmtimer_64.c
process.c fix idle (arch, acpi and apm) and lockdep 2008-04-27 00:01:45 +02:00
process_32.c fix idle (arch, acpi and apm) and lockdep 2008-04-27 00:01:45 +02:00
process_64.c fix idle (arch, acpi and apm) and lockdep 2008-04-27 00:01:45 +02:00
ptrace.c x86_64 ia32 ptrace: convert to compat_arch_ptrace 2008-04-26 17:35:47 +02:00
quirks.c
reboot.c x86: remove dell reboot dmi quirk board name match 2008-05-04 20:04:45 +02:00
reboot_fixups_32.c
relocate_kernel_32.S
relocate_kernel_64.S
rtc.c
scx200_32.c
setup.c x86: [VOYAGER] fix duplicate phys_cpu_present_map symbol 2008-05-12 21:27:51 +02:00
setup64.c
setup_32.c x86: restrict keyboard io ports reservation to make ipmi driver work 2008-05-10 19:31:45 +02:00
setup_64.c x86: restrict keyboard io ports reservation to make ipmi driver work 2008-05-10 19:31:45 +02:00
sigframe.h
signal_32.c signals: x86 TS_RESTORE_SIGMASK 2008-04-30 08:29:37 -07:00
signal_64.c signals: x86 TS_RESTORE_SIGMASK 2008-04-30 08:29:37 -07:00
smp.c x86: fix app crashes after SMP resume 2008-05-13 19:36:12 +02:00
smpboot.c x86: fix app crashes after SMP resume 2008-05-13 19:36:12 +02:00
smpcommon.c
smpcommon_32.c
srat_32.c
stacktrace.c
step.c
summit_32.c x86: use get_bios_ebda() 2008-04-26 17:35:47 +02:00
sys_i386_32.c unified (weak) sys_pipe implementation 2008-05-03 13:50:33 -07:00
sys_x86_64.c unified (weak) sys_pipe implementation 2008-05-03 13:50:33 -07:00
syscall_64.c
syscall_table_32.S
tce_64.c
test_nx.c
test_rodata.c
time_32.c proper extern for late_time_init 2008-04-29 08:06:03 -07:00
time_64.c
tlb_32.c
tlb_64.c x86: use cpumask function for present, possible, and online cpus 2008-04-26 17:35:47 +02:00
tls.c
tls.h
topology.c
trampoline.c
trampoline_32.S x86: trampoline_32.S - switch to .cpuinit.data 2008-04-26 17:35:47 +02:00
trampoline_64.S
traps_32.c i386: fix signal type for iret exception 2008-04-26 17:35:46 +02:00
traps_64.c
tsc_32.c
tsc_64.c
tsc_sync.c
verify_cpu_64.S
vm86_32.c
vmi_32.c x86: unify KERNEL_PGD_PTRS 2008-04-24 23:57:31 +02:00
vmiclock_32.c
vmlinux.lds.S
vmlinux_32.lds.S
vmlinux_64.lds.S x86_64 vDSO: use initdata 2008-04-28 13:49:35 -07:00
vsmp_64.c x86: fix warning in "x86: clean up vSMP detection" 2008-04-29 13:45:24 +02:00
vsyscall_64.c
x8664_ksyms_64.c