01ff5fc7f7
commit 41a506ef71eb38d94fe133f565c87c3e06ccc072 upstream. With ppc64 -mprofile-kernel and ppc32 -pg, profiling instructions to call into ftrace are emitted right at function entry. The instruction sequence used is minimal to reduce overhead. Crucially, a stackframe is not created for the function being traced. This breaks stack unwinding since the function being traced does not have a stackframe for itself. As such, it never shows up in the backtrace: /sys/kernel/debug/tracing # echo 1 > /proc/sys/kernel/stack_tracer_enabled /sys/kernel/debug/tracing # cat stack_trace Depth Size Location (17 entries) ----- ---- -------- 0) 4144 32 ftrace_call+0x4/0x44 1) 4112 432 get_page_from_freelist+0x26c/0x1ad0 2) 3680 496 __alloc_pages+0x290/0x1280 3) 3184 336 __folio_alloc+0x34/0x90 4) 2848 176 vma_alloc_folio+0xd8/0x540 5) 2672 272 __handle_mm_fault+0x700/0x1cc0 6) 2400 208 handle_mm_fault+0xf0/0x3f0 7) 2192 80 ___do_page_fault+0x3e4/0xbe0 8) 2112 160 do_page_fault+0x30/0xc0 9) 1952 256 data_access_common_virt+0x210/0x220 10) 1696 400 0xc00000000f16b100 11) 1296 384 load_elf_binary+0x804/0x1b80 12) 912 208 bprm_execve+0x2d8/0x7e0 13) 704 64 do_execveat_common+0x1d0/0x2f0 14) 640 160 sys_execve+0x54/0x70 15) 480 64 system_call_exception+0x138/0x350 16) 416 416 system_call_common+0x160/0x2c4 Fix this by having ftrace create a dummy stackframe for the function being traced. With this, backtraces now capture the function being traced: /sys/kernel/debug/tracing # cat stack_trace Depth Size Location (17 entries) ----- ---- -------- 0) 3888 32 _raw_spin_trylock+0x8/0x70 1) 3856 576 get_page_from_freelist+0x26c/0x1ad0 2) 3280 64 __alloc_pages+0x290/0x1280 3) 3216 336 __folio_alloc+0x34/0x90 4) 2880 176 vma_alloc_folio+0xd8/0x540 5) 2704 416 __handle_mm_fault+0x700/0x1cc0 6) 2288 96 handle_mm_fault+0xf0/0x3f0 7) 2192 48 ___do_page_fault+0x3e4/0xbe0 8) 2144 192 do_page_fault+0x30/0xc0 9) 1952 608 data_access_common_virt+0x210/0x220 10) 1344 16 0xc0000000334bbb50 11) 1328 416 load_elf_binary+0x804/0x1b80 12) 912 64 bprm_execve+0x2d8/0x7e0 13) 848 176 do_execveat_common+0x1d0/0x2f0 14) 672 192 sys_execve+0x54/0x70 15) 480 64 system_call_exception+0x138/0x350 16) 416 416 system_call_common+0x160/0x2c4 This results in two additional stores in the ftrace entry code, but produces reliable backtraces. Fixes: 153086644fd1 ("powerpc/ftrace: Add support for -mprofile-kernel ftrace ABI") Cc: stable@vger.kernel.org Signed-off-by: Naveen N Rao <naveen@kernel.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20230621051349.759567-1-naveen@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
||
---|---|---|
.. | ||
ptrace | ||
syscalls | ||
trace | ||
vdso32 | ||
vdso64 | ||
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.c | ||
cpu_setup_ppc970.S | ||
cputable.c | ||
crash_dump.c | ||
dawr.c | ||
dbell.c | ||
dma-iommu.c | ||
dma-mask.c | ||
dma-swiotlb.c | ||
dt_cpu_ftrs.c | ||
early_32.c | ||
eeh.c | ||
eeh_cache.c | ||
eeh_driver.c | ||
eeh_event.c | ||
eeh_pe.c | ||
eeh_sysfs.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.h | ||
head_40x.S | ||
head_44x.S | ||
head_64.S | ||
head_book3s_32.S | ||
head_booke.h | ||
head_fsl_booke.S | ||
hw_breakpoint.c | ||
hw_breakpoint_constraints.c | ||
idle.c | ||
idle_6xx.S | ||
idle_book3e.S | ||
idle_book3s.S | ||
idle_e500.S | ||
ima_arch.c | ||
io-workarounds.c | ||
io.c | ||
iomap.c | ||
iommu.c | ||
irq.c | ||
isa-bridge.c | ||
jump_label.c | ||
kgdb.c | ||
kprobes-ftrace.c | ||
kprobes.c | ||
kvm.c | ||
kvm_emul.S | ||
l2cr_6xx.S | ||
legacy_serial.c | ||
Makefile | ||
mce.c | ||
mce_power.c | ||
misc.S | ||
misc_32.S | ||
misc_64.S | ||
module.c | ||
module_32.c | ||
module_64.c | ||
msi.c | ||
note.S | ||
nvram_64.c | ||
of_platform.c | ||
optprobes.c | ||
optprobes_head.S | ||
paca.c | ||
pci-common.c | ||
pci-hotplug.c | ||
pci_32.c | ||
pci_64.c | ||
pci_dn.c | ||
pci_of_scan.c | ||
pmc.c | ||
ppc32.h | ||
ppc_save_regs.S | ||
proc_powerpc.c | ||
process.c | ||
prom.c | ||
prom_init.c | ||
prom_init_check.sh | ||
prom_parse.c | ||
reloc_32.S | ||
reloc_64.S | ||
rtas-proc.c | ||
rtas-rtc.c | ||
rtas.c | ||
rtas_flash.c | ||
rtas_pci.c | ||
rtasd.c | ||
secure_boot.c | ||
security.c | ||
secvar-ops.c | ||
secvar-sysfs.c | ||
setup-common.c | ||
setup.h | ||
setup_32.c | ||
setup_64.c | ||
signal.c | ||
signal.h | ||
signal_32.c | ||
signal_64.c | ||
smp-tbsync.c | ||
smp.c | ||
stacktrace.c | ||
suspend.c | ||
swsusp.c | ||
swsusp_32.S | ||
swsusp_64.c | ||
swsusp_asm64.S | ||
swsusp_booke.S | ||
sys_ppc32.c | ||
syscall_64.c | ||
syscalls.c | ||
sysfs.c | ||
systbl.S | ||
systbl_chk.sh | ||
tau_6xx.c | ||
time.c | ||
tm.S | ||
traps.c | ||
ucall.S | ||
udbg.c | ||
udbg_16550.c | ||
uprobes.c | ||
vdso.c | ||
vecemu.c | ||
vector.S | ||
vmlinux.lds.S | ||
watchdog.c |