4bb1188e2b
[ Upstream commit ca829e05d3d4f728810cc5e4b468d9ebc7745eb3 ] On 64-bit, calling jump_label_init() in setup_feature_keys() is too late because static keys may be used in subroutines of parse_early_param() which is again subroutine of early_init_devtree(). For example booting with "threadirqs": static_key_enable_cpuslocked(): static key '0xc000000002953260' used before call to jump_label_init() WARNING: CPU: 0 PID: 0 at kernel/jump_label.c:166 static_key_enable_cpuslocked+0xfc/0x120 ... NIP static_key_enable_cpuslocked+0xfc/0x120 LR static_key_enable_cpuslocked+0xf8/0x120 Call Trace: static_key_enable_cpuslocked+0xf8/0x120 (unreliable) static_key_enable+0x30/0x50 setup_forced_irqthreads+0x28/0x40 do_early_param+0xa0/0x108 parse_args+0x290/0x4e0 parse_early_options+0x48/0x5c parse_early_param+0x58/0x84 early_init_devtree+0xd4/0x518 early_setup+0xb4/0x214 So call jump_label_init() just before parse_early_param() in early_init_devtree(). Suggested-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Zhouyi Zhou <zhouzhouyi@gmail.com> [mpe: Add call trace to change log and minor wording edits.] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220726015747.11754-1-zhouzhouyi@gmail.com Signed-off-by: Sasha Levin <sashal@kernel.org> |
||
---|---|---|
.. | ||
trace | ||
vdso32 | ||
vdso64 | ||
.gitignore | ||
align.c | ||
asm-offsets.c | ||
audit.c | ||
btext.c | ||
cacheinfo.c | ||
cacheinfo.h | ||
compat_audit.c | ||
cpu_setup_6xx.S | ||
cpu_setup_44x.S | ||
cpu_setup_fsl_booke.S | ||
cpu_setup_pa6t.S | ||
cpu_setup_power.S | ||
cpu_setup_ppc970.S | ||
cputable.c | ||
crash_dump.c | ||
crash.c | ||
dbell.c | ||
dma-iommu.c | ||
dma-swiotlb.c | ||
dma.c | ||
dt_cpu_ftrs.c | ||
eeh_cache.c | ||
eeh_dev.c | ||
eeh_driver.c | ||
eeh_event.c | ||
eeh_pe.c | ||
eeh_sysfs.c | ||
eeh.c | ||
entry_32.S | ||
entry_64.S | ||
epapr_hcalls.S | ||
epapr_paravirt.c | ||
exceptions-64e.S | ||
exceptions-64s.S | ||
fadump.c | ||
firmware.c | ||
fpu.S | ||
fsl_booke_entry_mapping.S | ||
head_8xx.S | ||
head_32.S | ||
head_40x.S | ||
head_44x.S | ||
head_64.S | ||
head_booke.h | ||
head_fsl_booke.S | ||
hw_breakpoint.c | ||
idle_6xx.S | ||
idle_book3e.S | ||
idle_book3s.S | ||
idle_e500.S | ||
idle_power4.S | ||
idle.c | ||
ima_kexec.c | ||
io-workarounds.c | ||
io.c | ||
iomap.c | ||
iommu.c | ||
irq.c | ||
isa-bridge.c | ||
jump_label.c | ||
kexec_elf_64.c | ||
kgdb.c | ||
kprobes-ftrace.c | ||
kprobes.c | ||
kvm_emul.S | ||
kvm.c | ||
l2cr_6xx.S | ||
legacy_serial.c | ||
machine_kexec_32.c | ||
machine_kexec_64.c | ||
machine_kexec_file_64.c | ||
machine_kexec.c | ||
Makefile | ||
mce_power.c | ||
mce.c | ||
misc_32.S | ||
misc_64.S | ||
misc.S | ||
module_32.c | ||
module_64.c | ||
module.c | ||
module.lds | ||
msi.c | ||
nvram_64.c | ||
of_platform.c | ||
optprobes_head.S | ||
optprobes.c | ||
paca.c | ||
pci_32.c | ||
pci_64.c | ||
pci_dn.c | ||
pci_of_scan.c | ||
pci-common.c | ||
pci-hotplug.c | ||
pmc.c | ||
ppc32.h | ||
ppc_save_regs.S | ||
proc_powerpc.c | ||
process.c | ||
prom_init_check.sh | ||
prom_init.c | ||
prom_parse.c | ||
prom.c | ||
ptrace32.c | ||
ptrace.c | ||
reloc_32.S | ||
reloc_64.S | ||
rtas_flash.c | ||
rtas_pci.c | ||
rtas-proc.c | ||
rtas-rtc.c | ||
rtas.c | ||
rtasd.c | ||
security.c | ||
setup_32.c | ||
setup_64.c | ||
setup-common.c | ||
setup.h | ||
signal_32.c | ||
signal_64.c | ||
signal.c | ||
signal.h | ||
smp-tbsync.c | ||
smp.c | ||
stacktrace.c | ||
suspend.c | ||
swsusp_32.S | ||
swsusp_64.c | ||
swsusp_asm64.S | ||
swsusp_booke.S | ||
swsusp.c | ||
sys_ppc32.c | ||
syscalls.c | ||
sysfs.c | ||
systbl_chk.c | ||
systbl_chk.sh | ||
systbl.S | ||
tau_6xx.c | ||
time.c | ||
tm.S | ||
traps.c | ||
udbg_16550.c | ||
udbg.c | ||
uprobes.c | ||
vdso.c | ||
vecemu.c | ||
vector.S | ||
vmlinux.lds.S | ||
watchdog.c |