android_kernel_xiaomi_sm8350/arch/ia64/kernel
Hidetoshi Seto 4295ab3488 [IA64] kdump: Mask MCA/INIT on frozen cpus
Summary:

  INIT asserted on kdump kernel invokes INIT handler not only on a
  cpu that running on the kdump kernel, but also BSP of the panicked
  kernel, because the (badly) frozen BSP can be thawed by INIT.

Description:

  The kdump_cpu_freeze() is called on cpus except one that initiates
  panic and/or kdump, to stop/offline the cpu (on ia64, it means we
  pass control of cpus to SAL, or put them in spinloop).  Note that
  CPU0(BSP) always go to spinloop, so if panic was happened on an AP,
  there are at least 2cpus (= the AP and BSP) which not back to SAL.

  On the spinning cpus, interrupts are disabled (rsm psr.i), but INIT
  is still interruptible because psr.mc for mask them is not set unless
  kdump_cpu_freeze() is not called from MCA/INIT context.

  Therefore, assume that a panic was happened on an AP, kdump was
  invoked, new INIT handlers for kdump kernel was registered and then
  an INIT is asserted.  From the viewpoint of SAL, there are 2 online
  cpus, so INIT will be delivered to both of them.  It likely means
  that not only the AP (= a cpu executing kdump) enters INIT handler
  which is newly registered, but also BSP (= another cpu spinning in
  panicked kernel) enters the same INIT handler.  Of course setting of
  registers in BSP are still old (for panicked kernel), so what happen
  with running handler with wrong setting will be extremely unexpected.
  I believe this is not desirable behavior.

How to Reproduce:

  Start kdump on one of APs (e.g. cpu1)
    # taskset 0x2 echo c > /proc/sysrq-trigger
  Then assert INIT after kdump kernel is booted, after new INIT handler
  for kdump kernel is registered.

Expected results:

  An INIT handler is invoked only on the AP.

Actual results:

  An INIT handler is invoked on the AP and BSP.

Sample of results:

  I got following console log by asserting INIT after prompt "root:/>".
  It seems that two monarchs appeared by one INIT, and one panicked at
  last.  And it also seems that the panicked one supposed there were
  4 online cpus and no one did rendezvous:

    :
    [  0 %]dropping to initramfs shell
    exiting this shell will reboot your system
    root:/> Entered OS INIT handler. PSP=fff301a0 cpu=0 monarch=0
    ia64_init_handler: Promoting cpu 0 to monarch.
    Delaying for 5 seconds...
    All OS INIT slaves have reached rendezvous
    Processes interrupted by INIT - 0 (cpu 0 task 0xa000000100af0000)
    :
    <<snip>>
    :
    Entered OS INIT handler. PSP=fff301a0 cpu=0 monarch=1
    Delaying for 5 seconds...
    mlogbuf_finish: printing switched to urgent mode, MCA/INIT might be dodgy or fail.
    OS INIT slave did not rendezvous on cpu 1 2 3
    INIT swapper 0[0]: bugcheck! 0 [1]
    :
    <<snip>>
    :
    Kernel panic - not syncing: Attempted to kill the idle task!

Proposed fix:

  To avoid this problem, this patch inserts ia64_set_psr_mc() to mask
  INIT on cpus going to be frozen.  This masking have no effect if the
  kdump_cpu_freeze() is called from INIT handler when kdump_on_init == 1,
  because psr.mc is already turned on to 1 before entering OS_INIT.
  I confirmed that weird log like above are disappeared after applying
  this patch.

Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Haren Myneni <hbabu@us.ibm.com>
Cc: kexec@lists.infradead.org
Acked-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
2009-09-14 16:17:05 -07:00
..
cpufreq
.gitignore
acpi-ext.c
acpi-processor.c ACPI: pdc init related memory leak with physical CPU hotplug 2009-06-20 00:50:52 -04:00
acpi.c irq: change ACPI GSI APIs to also take a device argument 2009-04-28 12:21:17 +02:00
asm-offsets.c
audit.c
brl_emu.c
crash_dump.c
crash.c [IA64] kdump: Mask MCA/INIT on frozen cpus 2009-09-14 16:17:05 -07:00
cyclone.c clocksource: pass clocksource to read() callback 2009-04-21 13:41:47 -07:00
dma-mapping.c [IA64] Fix warning in dma-mapping.c 2009-09-02 09:12:21 -07:00
efi_stub.S
efi.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
entry.h
entry.S [IA64] hook up new rt_tgsigqueueinfo syscall 2009-06-16 13:13:41 -07:00
err_inject.c
esi_stub.S
esi.c [IA64] Remove unnecessary semicolons 2009-06-30 14:18:32 -07:00
fsys.S
fsyscall_gtod_data.h
ftrace.c
gate-data.S
gate.lds.S
gate.S
head.S [IA64] kdump: Mask MCA/INIT on frozen cpus 2009-09-14 16:17:05 -07:00
ia64_ksyms.c IA64: includecheck fix: ia64, ia64_ksyms.c 2009-08-11 14:52:10 -07:00
init_task.c mm: consolidate init_mm definition 2009-06-16 19:47:28 -07:00
iosapic.c arch/ia64/kernel/iosapic: missing test after ioremap() 2009-08-11 14:52:11 -07:00
irq_ia64.c [IA64] remove obsolete irq_desc_t typedef 2009-06-15 14:34:31 -07:00
irq_lsapic.c [IA64] remove obsolete hw_interrupt_type 2009-06-15 14:35:10 -07:00
irq.c [IA64] remove obsolete irq_desc_t typedef 2009-06-15 14:34:31 -07:00
ivt.S
jprobes.S
kprobes.c
machine_kexec.c
machvec.c
Makefile
Makefile.gate
mca_asm.S [IA64] kdump: Mask MCA/INIT on frozen cpus 2009-09-14 16:17:05 -07:00
mca_drv_asm.S
mca_drv.c
mca_drv.h
mca.c Pull for-2.6.31 into release 2009-06-17 09:35:24 -07:00
minstate.h
module.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
msi_ia64.c [IA64] msi_ia64.c dmar_msi_type should be static 2009-06-15 14:35:54 -07:00
nr-irqs.c
numa.c
pal.S
palinfo.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
paravirt_inst.h
paravirt_patch.c
paravirt_patchlist.c [IA64] Fix build error in paravirt_patchlist.c 2009-06-17 09:04:40 -07:00
paravirt_patchlist.h
paravirt.c
paravirtentry.S
patch.c
pci-dma.c Bug Fix arch/ia64/kernel/pci-dma.c: fix recursive dma_supported() call in iommu_dma_supported() 2009-08-11 14:52:10 -07:00
pci-swiotlb.c Intel IOMMU Pass Through Support 2009-04-29 06:54:34 +01:00
perfmon_default_smpl.c
perfmon_generic.h
perfmon_itanium.h
perfmon_mckinley.h
perfmon_montecito.h
perfmon.c [IA64] address compiler warnings perfmon.c/salinfo.c 2009-06-30 14:26:34 -07:00
process.c
ptrace.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
relocate_kernel.S
sal.c
salinfo.c [IA64] address compiler warnings perfmon.c/salinfo.c 2009-06-30 14:26:34 -07:00
setup.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
sigframe.h
signal.c
smp.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
smpboot.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
sys_ia64.c
time.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
topology.c ia64/topology.c: exit cache_add_dev when kobject_init_and_add fails 2009-08-11 14:52:11 -07:00
traps.c
unaligned.c
uncached.c Pull for-2.6.31 into release 2009-06-17 09:35:24 -07:00
unwind_decoder.c
unwind_i.h
unwind.c
vmlinux.lds.S