kernel_samsung_a53x/arch/powerpc/kernel
Mahesh Salgaonkar f53d6656c2 powerpc: Avoid nmi_enter/nmi_exit in real mode interrupt.
commit 0db880fc865ffb522141ced4bfa66c12ab1fbb70 upstream.

nmi_enter()/nmi_exit() touches per cpu variables which can lead to kernel
crash when invoked during real mode interrupt handling (e.g. early HMI/MCE
interrupt handler) if percpu allocation comes from vmalloc area.

Early HMI/MCE handlers are called through DEFINE_INTERRUPT_HANDLER_NMI()
wrapper which invokes nmi_enter/nmi_exit calls. We don't see any issue when
percpu allocation is from the embedded first chunk. However with
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK enabled there are chances where percpu
allocation can come from the vmalloc area.

With kernel command line "percpu_alloc=page" we can force percpu allocation
to come from vmalloc area and can see kernel crash in machine_check_early:

[    1.215714] NIP [c000000000e49eb4] rcu_nmi_enter+0x24/0x110
[    1.215717] LR [c0000000000461a0] machine_check_early+0xf0/0x2c0
[    1.215719] --- interrupt: 200
[    1.215720] [c000000fffd73180] [0000000000000000] 0x0 (unreliable)
[    1.215722] [c000000fffd731b0] [0000000000000000] 0x0
[    1.215724] [c000000fffd73210] [c000000000008364] machine_check_early_common+0x134/0x1f8

Fix this by avoiding use of nmi_enter()/nmi_exit() in real mode if percpu
first chunk is not embedded.

Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Tested-by: Shirisha Ganta <shirisha@linux.ibm.com>
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240410043006.81577-1-mahesh@linux.ibm.com
[ Conflicts in arch/powerpc/include/asm/interrupt.h
  because machine_check_early() and machine_check_exception()
  has been refactored. ]
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-11-23 23:20:31 +01:00
..
ptrace Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
syscalls syscalls: fix compat_sys_io_pgetevents_time64 usage 2024-11-19 14:19:34 +01:00
trace powerpc/ftrace: Fix stack teardown in ftrace_no_trace 2024-11-18 12:11:58 +01:00
vdso32 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vdso64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
align.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
asm-offsets.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
audit.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
btext.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cacheinfo.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cacheinfo.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
compat_audit.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_6xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_44x.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_fsl_booke.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_pa6t.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_power.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_ppc970.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cputable.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
crash_dump.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dawr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dbell.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dma-iommu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dma-mask.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dma-swiotlb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dt_cpu_ftrs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
early_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_cache.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_driver.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_event.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_pe.c powerpc/eeh: avoid possible crash when edev->pdev changes 2024-11-19 14:19:50 +01:00
eeh_sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
entry_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
entry_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
epapr_hcalls.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
epapr_paravirt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
exceptions-64e.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
exceptions-64s.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fadump.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
firmware.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fpu.S powerpc: Don't clobber f0/vs0 during fp|altivec register save 2024-11-18 12:11:09 +01:00
fsl_booke_entry_mapping.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_8xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_32.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_40x.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_44x.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_book3s_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_booke.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_fsl_booke.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
hw_breakpoint.c powerpc/watchpoints: Annotate atomic context in more places 2024-11-18 22:25:35 +01:00
hw_breakpoint_constraints.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_6xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_book3e.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_book3s.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_e500.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ima_arch.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
io-workarounds.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
io.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iomap.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iommu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
irq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
isa-bridge.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jump_label.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kgdb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kprobes-ftrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kprobes.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kvm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kvm_emul.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
l2cr_6xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
legacy_serial.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mce.c powerpc: Avoid nmi_enter/nmi_exit in real mode interrupt. 2024-11-23 23:20:31 +01:00
mce_power.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
misc.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
misc_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
misc_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
module.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
module_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
module_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
msi.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
note.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
nvram_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
of_platform.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
optprobes.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
optprobes_head.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
paca.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci-common.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci-hotplug.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_dn.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_of_scan.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pmc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ppc32.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ppc_save_regs.S powerpc: update ppc_save_regs to save current r1 in pt_regs 2024-11-18 12:12:08 +01:00
proc_powerpc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
process.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom_init.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom_init_check.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom_parse.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
reloc_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
reloc_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas-proc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas-rtc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas_flash.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas_pci.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtasd.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
secure_boot.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
security.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
secvar-ops.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
secvar-sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup-common.c powerpc/mm: Fix boot crash with FLATMEM 2024-11-18 10:58:47 +01:00
setup.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup_64.c powerpc: Avoid nmi_enter/nmi_exit in real mode interrupt. 2024-11-23 23:20:31 +01:00
signal.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp-tbsync.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
stacktrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
suspend.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_asm64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_booke.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sys_ppc32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
syscall_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
syscalls.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
systbl.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
systbl_chk.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tau_6xx.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
time.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tm.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
traps.c powerpc: Avoid nmi_enter/nmi_exit in real mode interrupt. 2024-11-23 23:20:31 +01:00
ucall.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
udbg.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
udbg_16550.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
uprobes.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vdso.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vecemu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vector.S powerpc: Don't clobber f0/vs0 during fp|altivec register save 2024-11-18 12:11:09 +01:00
vmlinux.lds.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
watchdog.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00