On Mon, Sep 16, 2024 at 5:57 AM Hari Bathini <hbathini@xxxxxxxxxxxxx> wrote: > > This is v5 of the series posted here: > https://lore.kernel.org/all/cover.1720942106.git.naveen@xxxxxxxxxx/ > > This series reworks core ftrace support on powerpc to have the function > profiling sequence moved out of line. This enables us to have a single > nop at kernel function entry virtually eliminating effect of the > function tracer when it is not enabled. The function profile sequence is > moved out of line and is allocated at two separate places depending on a > new config option. > > For 64-bit powerpc, the function profiling sequence is also updated to > include an additional instruction 'mtlr r0' after the usual > two-instruction sequence to fix link stack imbalance (return address > predictor) when ftrace is enabled. This showed an improvement of ~10% > in null_syscall benchmark (NR_LOOPS=10000000) on a Power 10 system > with ftrace enabled. > > Finally, support for ftrace direct calls is added based on support for > DYNAMIC_FTRACE_WITH_CALL_OPS. BPF Trampoline support is added atop this. > > Support for ftrace direct calls is added for 32-bit powerpc. There is > some code to enable bpf trampolines for 32-bit powerpc, but it is not > complete and will need to be pursued separately. > > Patches 1 to 10 are independent of this series and can go in separately > though. Rest of the patches depend on the series from Benjamin Gray > adding support for patch_uint() and patch_ulong(): > https://lore.kernel.org/all/172474280311.31690.1489687786264785049.b4-ty@xxxxxxxxxxxxxx/ It is getting better. I attached a diff for improvements. Also, please run 'shellcheck' and eliminate as many warnings as you can. $ shellcheck arch/powerpc/tools/ftrace-gen-ool-stubs.sh In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 19: num_ool_stubs_text=$(${OBJDUMP} -r -j __patchable_function_entries ${vmlinux_o} | ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: num_ool_stubs_text=$(${OBJDUMP} -r -j __patchable_function_entries "${vmlinux_o}" | In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 20: grep -v ".init.text" | grep "${RELOCATION}" | wc -l) ^------------------^ SC2126 (style): Consider using 'grep -c' instead of 'grep|wc -l'. In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 21: num_ool_stubs_inittext=$(${OBJDUMP} -r -j __patchable_function_entries ${vmlinux_o} | ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: num_ool_stubs_inittext=$(${OBJDUMP} -r -j __patchable_function_entries "${vmlinux_o}" | In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 22: grep ".init.text" | grep "${RELOCATION}" | wc -l) ^------------------^ SC2126 (style): Consider using 'grep -c' instead of 'grep|wc -l'. In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 25: if [ ${num_ool_stubs_text} -gt ${num_ool_stubs_text_builtin} ]; then ^-------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^---------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: if [ "${num_ool_stubs_text}" -gt "${num_ool_stubs_text_builtin}" ]; then In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 26: num_ool_stubs_text_end=$(expr ${num_ool_stubs_text} - ${num_ool_stubs_text_builtin}) ^--^ SC2003 (style): expr is antiquated. Consider rewriting this using $((..)), ${} or [[ ]]. ^-------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^---------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: num_ool_stubs_text_end=$(expr "${num_ool_stubs_text}" - "${num_ool_stubs_text_builtin}") In arch/powerpc/tools/ftrace-gen-ool-stubs.sh line 31: cat > ${arch_vmlinux_S} <<EOF ^---------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cat > "${arch_vmlinux_S}" <<EOF For more information: https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ... https://www.shellcheck.net/wiki/SC2003 -- expr is antiquated. Consider rewr... https://www.shellcheck.net/wiki/SC2126 -- Consider using 'grep -c' instead ... > Changelog v5: > * Intermediate files named .vmlinux.arch.* instead of .arch.vmlinux.* > * Fixed ftrace stack tracer failure due to inadvertent use of > 'add r7, r3, MCOUNT_INSN_SIZE' instruction instead of > 'addi r7, r3, MCOUNT_INSN_SIZE' > * Fixed build error for !CONFIG_MODULES case. > * .vmlinux.arch.* files compiled under arch/powerpc/tools > * Made sure .vmlinux.arch.* files are cleaned with `make clean` > * num_ool_stubs_text_end used for setting up ftrace_ool_stub_text_end > set to zero instead of computing to some random negative value when > not required. > * Resolved checkpatch.pl warnings. > * Dropped RFC tag. > > Changelog v4: > - Patches 1, 10 and 13 are new. > - Address review comments from Nick. Numerous changes throughout the > patch series. > - Extend support for ftrace ool to vmlinux text up to 64MB (patch 13). > - Address remaining TODOs in support for BPF Trampolines. > - Update synchronization when patching instructions during trampoline > attach/detach. > > > Naveen N Rao (17): > powerpc/trace: Account for -fpatchable-function-entry support by > toolchain > powerpc/kprobes: Use ftrace to determine if a probe is at function > entry > powerpc64/ftrace: Nop out additional 'std' instruction emitted by gcc > v5.x > powerpc32/ftrace: Unify 32-bit and 64-bit ftrace entry code > powerpc/module_64: Convert #ifdef to IS_ENABLED() > powerpc/ftrace: Remove pointer to struct module from dyn_arch_ftrace > powerpc/ftrace: Skip instruction patching if the instructions are the > same > powerpc/ftrace: Move ftrace stub used for init text before _einittext > powerpc64/bpf: Fold bpf_jit_emit_func_call_hlp() into > bpf_jit_emit_func_call_rel() > powerpc/ftrace: Add a postlink script to validate function tracer > kbuild: Add generic hook for architectures to use before the final > vmlinux link > powerpc64/ftrace: Move ftrace sequence out of line > powerpc64/ftrace: Support .text larger than 32MB with out-of-line > stubs > powerpc/ftrace: Add support for DYNAMIC_FTRACE_WITH_CALL_OPS > powerpc/ftrace: Add support for DYNAMIC_FTRACE_WITH_DIRECT_CALLS > samples/ftrace: Add support for ftrace direct samples on powerpc > powerpc64/bpf: Add support for bpf trampolines > > arch/Kconfig | 6 + > arch/powerpc/Kbuild | 2 +- > arch/powerpc/Kconfig | 23 +- > arch/powerpc/Makefile | 8 + > arch/powerpc/Makefile.postlink | 8 + > arch/powerpc/include/asm/ftrace.h | 33 +- > arch/powerpc/include/asm/module.h | 5 + > arch/powerpc/include/asm/ppc-opcode.h | 14 + > arch/powerpc/kernel/asm-offsets.c | 11 + > arch/powerpc/kernel/kprobes.c | 18 +- > arch/powerpc/kernel/module_64.c | 66 +- > arch/powerpc/kernel/trace/Makefile | 11 +- > arch/powerpc/kernel/trace/ftrace.c | 298 ++++++- > arch/powerpc/kernel/trace/ftrace_64_pg.c | 69 +- > arch/powerpc/kernel/trace/ftrace_entry.S | 244 ++++-- > arch/powerpc/kernel/vmlinux.lds.S | 3 +- > arch/powerpc/net/bpf_jit.h | 12 + > arch/powerpc/net/bpf_jit_comp.c | 847 +++++++++++++++++++- > arch/powerpc/net/bpf_jit_comp32.c | 7 +- > arch/powerpc/net/bpf_jit_comp64.c | 68 +- > arch/powerpc/tools/Makefile | 12 + > arch/powerpc/tools/ftrace-gen-ool-stubs.sh | 52 ++ > arch/powerpc/tools/ftrace_check.sh | 50 ++ > samples/ftrace/ftrace-direct-modify.c | 85 +- > samples/ftrace/ftrace-direct-multi-modify.c | 101 ++- > samples/ftrace/ftrace-direct-multi.c | 79 +- > samples/ftrace/ftrace-direct-too.c | 83 +- > samples/ftrace/ftrace-direct.c | 69 +- > scripts/Makefile.vmlinux | 7 + > scripts/link-vmlinux.sh | 7 +- > 30 files changed, 2098 insertions(+), 200 deletions(-) > create mode 100644 arch/powerpc/tools/Makefile > create mode 100755 arch/powerpc/tools/ftrace-gen-ool-stubs.sh > create mode 100755 arch/powerpc/tools/ftrace_check.sh > > -- > 2.46.0 > -- Best Regards Masahiro Yamada
From 0e96689efc977542a47e815a78892833e0305d79 Mon Sep 17 00:00:00 2001 From: Masahiro Yamada <masahiroy@xxxxxxxxxx> Date: Wed, 9 Oct 2024 23:37:47 +0900 Subject: [PATCH] fixup Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> --- arch/Kconfig | 2 +- arch/powerpc/Kconfig | 5 ++--- arch/powerpc/tools/.gitignore | 2 ++ arch/powerpc/tools/Makefile | 7 ++----- arch/powerpc/tools/ftrace-gen-ool-stubs.sh | 5 ++--- scripts/Makefile.vmlinux | 4 ++-- scripts/link-vmlinux.sh | 2 +- 7 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 arch/powerpc/tools/.gitignore diff --git a/arch/Kconfig b/arch/Kconfig index 87806750cf4e..a1538927c8c1 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -1685,7 +1685,7 @@ config ARCH_NEED_CMPXCHG_1_EMU bool config ARCH_WANTS_PRE_LINK_VMLINUX - def_bool n + bool help An architecture can select this if it provides arch/<arch>/tools/Makefile with .arch.vmlinux.o target to be linked into vmlinux. diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 8a31f61f1b34..c85470b24118 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -575,13 +575,12 @@ config ARCH_USING_PATCHABLE_FUNCTION_ENTRY config PPC_FTRACE_OUT_OF_LINE def_bool PPC64 && ARCH_USING_PATCHABLE_FUNCTION_ENTRY - depends on PPC64 select ARCH_WANTS_PRE_LINK_VMLINUX config PPC_FTRACE_OUT_OF_LINE_NUM_RESERVE int "Number of ftrace out-of-line stubs to reserve within .text" - default 32768 if PPC_FTRACE_OUT_OF_LINE - default 0 + depends on PPC_FTRACE_OUT_OF_LINE + default 32768 help Number of stubs to reserve for use by ftrace. This space is reserved within .text, and is distinct from any additional space diff --git a/arch/powerpc/tools/.gitignore b/arch/powerpc/tools/.gitignore new file mode 100644 index 000000000000..ec380a14a09a --- /dev/null +++ b/arch/powerpc/tools/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +/vmlinux.arch.S diff --git a/arch/powerpc/tools/Makefile b/arch/powerpc/tools/Makefile index 9eeb6edf02fe..96dbbc4f3e66 100644 --- a/arch/powerpc/tools/Makefile +++ b/arch/powerpc/tools/Makefile @@ -3,10 +3,7 @@ quiet_cmd_gen_ftrace_ool_stubs = GEN $@ cmd_gen_ftrace_ool_stubs = $< $(CONFIG_PPC_FTRACE_OUT_OF_LINE_NUM_RESERVE) vmlinux.o $@ -$(obj)/.vmlinux.arch.S: $(src)/ftrace-gen-ool-stubs.sh vmlinux.o FORCE +$(obj)/vmlinux.arch.S: $(src)/ftrace-gen-ool-stubs.sh vmlinux.o FORCE $(call if_changed,gen_ftrace_ool_stubs) -$(obj)/.vmlinux.arch.o: $(obj)/.vmlinux.arch.S FORCE - $(call if_changed_rule,as_o_S) - -clean-files += .vmlinux.arch.S .vmlinux.arch.o +targets += vmlinux.arch.S diff --git a/arch/powerpc/tools/ftrace-gen-ool-stubs.sh b/arch/powerpc/tools/ftrace-gen-ool-stubs.sh index 33f5ae4bace5..c69b375309bc 100755 --- a/arch/powerpc/tools/ftrace-gen-ool-stubs.sh +++ b/arch/powerpc/tools/ftrace-gen-ool-stubs.sh @@ -10,16 +10,15 @@ is_enabled() { vmlinux_o=${2} arch_vmlinux_S=${3} -arch_vmlinux_o=$(dirname ${arch_vmlinux_S})/$(basename ${arch_vmlinux_S} .S).o RELOCATION=R_PPC64_ADDR64 if is_enabled CONFIG_PPC32; then RELOCATION=R_PPC_ADDR32 fi -num_ool_stubs_text=$(${CROSS_COMPILE}objdump -r -j __patchable_function_entries ${vmlinux_o} | +num_ool_stubs_text=$(${OBJDUMP} -r -j __patchable_function_entries ${vmlinux_o} | grep -v ".init.text" | grep "${RELOCATION}" | wc -l) -num_ool_stubs_inittext=$(${CROSS_COMPILE}objdump -r -j __patchable_function_entries ${vmlinux_o} | +num_ool_stubs_inittext=$(${OBJDUMP} -r -j __patchable_function_entries ${vmlinux_o} | grep ".init.text" | grep "${RELOCATION}" | wc -l) num_ool_stubs_text_builtin=${1} diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux index 8f08117f4a48..dddad554e912 100644 --- a/scripts/Makefile.vmlinux +++ b/scripts/Makefile.vmlinux @@ -23,9 +23,9 @@ vmlinux: .vmlinux.export.o endif ifdef CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX -vmlinux: arch/$(SRCARCH)/tools/.vmlinux.arch.o +vmlinux: arch/$(SRCARCH)/tools/vmlinux.arch.o -arch/$(SRCARCH)/tools/.vmlinux.arch.o: vmlinux.o +arch/$(SRCARCH)/tools/vmlinux.arch.o: vmlinux.o FORCE $(Q)$(MAKE) $(build)=arch/$(SRCARCH)/tools $@ endif diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index 33c1aa8dd468..7acf4e31e51c 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -200,7 +200,7 @@ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init init/version-timestamp.o arch_vmlinux_o="" if is_enabled CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX; then - arch_vmlinux_o=arch/${SRCARCH}/tools/.vmlinux.arch.o + arch_vmlinux_o=arch/${SRCARCH}/tools/vmlinux.arch.o fi btf_vmlinux_bin_o= -- 2.43.0