diff mbox series

powerpc/ftrace: Fix ftrace bug with KASAN=y

Message ID 20241107111630.31068-1-mpe@ellerman.id.au (mailing list archive)
State New
Headers show
Series powerpc/ftrace: Fix ftrace bug with KASAN=y | expand

Commit Message

Michael Ellerman Nov. 7, 2024, 11:16 a.m. UTC
Booting a KASAN=y kernel with the recently added ftrace out-of-line
support causes a warning at boot:

  ------------[ cut here ]------------
  Stub index overflow (1729 > 1728)
  WARNING: CPU: 0 PID: 0 at arch/powerpc/kernel/trace/ftrace.c:209 ftrace_init_nop+0x408/0x444
  ...
  NIP ftrace_init_nop+0x408/0x444
  LR  ftrace_init_nop+0x404/0x444
  Call Trace:
    ftrace_init_nop+0x404/0x444 (unreliable)
    ftrace_process_locs+0x544/0x8a0
    ftrace_init+0xb4/0x22c
    start_kernel+0x1dc/0x4d4
    start_here_common+0x1c/0x20
  ...
  ftrace failed to modify
  [<c0000000030beddc>] _sub_I_65535_1+0x8/0x3c
   actual:   00:00:00:60
  Initializing ftrace call sites
  ftrace record flags: 0
   (0)
   expected tramp: c00000000008b418
  ------------[ cut here ]------------

The function in question, _sub_I_65535_1 is some sort of trampoline
generated for KASAN, and is in the .text.startup section. That section
is part of INIT_TEXT, meaning is_kernel_inittext() returns true for it.

But the script that determines how many out-of-line ftrace stubs are
needed isn't doesn't consider .text.startup as inittext, leading to
there not being enough space for the init stubs.

Conversely the logic to calculate how many stubs are needed for the text
section isn't filtering out the symbols in .text.startup and so ends up
over counting.

Fix both problems by calculating the total number of stubs first, then
the number that count as inittext, and then subtract the latter from the
former to get the count for the text section.

Fixes: eec37961a56a ("powerpc64/ftrace: Move ftrace sequence out of line")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
---
 arch/powerpc/tools/ftrace-gen-ool-stubs.sh | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/arch/powerpc/tools/ftrace-gen-ool-stubs.sh b/arch/powerpc/tools/ftrace-gen-ool-stubs.sh
index 950a7778324b..bac186bdf64a 100755
--- a/arch/powerpc/tools/ftrace-gen-ool-stubs.sh
+++ b/arch/powerpc/tools/ftrace-gen-ool-stubs.sh
@@ -15,10 +15,11 @@  if [ -z "$is_64bit" ]; then
 	RELOCATION=R_PPC_ADDR32
 fi
 
-num_ool_stubs_text=$($objdump -r -j __patchable_function_entries "$vmlinux_o" |
-		     grep -v ".init.text" | grep -c "$RELOCATION")
+num_ool_stubs_total=$($objdump -r -j __patchable_function_entries "$vmlinux_o" |
+		      grep -c "$RELOCATION")
 num_ool_stubs_inittext=$($objdump -r -j __patchable_function_entries "$vmlinux_o" |
-			 grep ".init.text" | grep -c "$RELOCATION")
+			 grep -e ".init.text" -e ".text.startup" | grep -c "$RELOCATION")
+num_ool_stubs_text=$((num_ool_stubs_total - num_ool_stubs_inittext))
 
 if [ "$num_ool_stubs_text" -gt "$num_ool_stubs_text_builtin" ]; then
 	num_ool_stubs_text_end=$((num_ool_stubs_text - num_ool_stubs_text_builtin))