powerpc/smp: Fix OOPS in topology_init()
Running an SMP kernel on an UP platform not prepared for it,
I encountered the following OOPS:
BUG: Kernel NULL pointer dereference on read at 0x00000034
Faulting instruction address: 0xc0a04110
Oops: Kernel access of bad area, sig: 11 [#1]
BE PAGE_SIZE=4K SMP NR_CPUS=2 CMPCPRO
Modules linked in:
CPU: 0 PID: 1 Comm: swapper/0 Not tainted
5.13.0-pmac-00001-g230fedfaad21 #5234
NIP:
c0a04110 LR:
c0a040d8 CTR:
c0a04084
REGS:
e100dda0 TRAP: 0300 Not tainted (
5.13.0-pmac-00001-g230fedfaad21)
MSR:
00009032 <EE,ME,IR,DR,RI> CR:
84000284 XER:
00000000
DAR:
00000034 DSISR:
20000000
GPR00:
c0006bd4 e100de60 c1033320 00000000 00000000 c0942274 00000000 00000000
GPR08:
00000000 00000000 00000001 00000063 00000007 00000000 c0006f30 00000000
GPR16:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000005
GPR24:
c0c67d74 c0c67f1c c0c60000 c0c67d70 c0c0c558 1efdf000 c0c00020 00000000
NIP [
c0a04110] topology_init+0x8c/0x138
LR [
c0a040d8] topology_init+0x54/0x138
Call Trace:
[
e100de60] [
80808080] 0x80808080 (unreliable)
[
e100de90] [
c0006bd4] do_one_initcall+0x48/0x1bc
[
e100def0] [
c0a0150c] kernel_init_freeable+0x1c8/0x278
[
e100df20] [
c0006f44] kernel_init+0x14/0x10c
[
e100df30] [
c00190fc] ret_from_kernel_thread+0x14/0x1c
Instruction dump:
7c692e70 7d290194 7c035040 7c7f1b78 5529103a 546706fe 5468103a 39400001
7c641b78 40800054 80c690b4 7fb9402e <
81060034>
7fbeea14 2c080000 7fa3eb78
---[ end trace
b246ffbc6bbbb6fb ]---
Fix it by checking smp_ops before using it, as already done in
several other places in the arch/powerpc/kernel/smp.c
Fixes:
39f87561454d ("powerpc/smp: Move ppc_md.cpu_die() to smp_ops.cpu_offline_self()")
Cc: stable@vger.kernel.org
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/75287841cbb8740edd44880fe60be66d489160d9.1628097995.git.christophe.leroy@csgroup.eu