On 7/15/25 14:17, Alexandre Ghiti wrote:
On 7/6/25 17:18, ChenMiao wrote:
From: chenmiao <chenmiao...@gmail.com>

V1: The first version mainly involves modifications to the
configuration of the dynamic ftracer.

Link https://lore.kernel.org/all/f7e12c6d-892e-4ca3-9ef0-fbb524d04...@ghiti.fr/

V2: After a series of discussions, Steven concluded that only
supporting the dynamic ftracer would suffice. Alex also pointed
out that if only the dynamic ftracer needs to be supported, the
code related to the static ftracer would become obsolete and
turn into dead code. He had already done some preliminary work on this.

Based on this, the modifications to the configuration were made,
and the dead code generated by the ftracer
(originally related to the static ftracer) was also removed.

Link https://lore.kernel.org/all/20250703115222.2d7c8...@batman.local.home/ Link https://github.com/linux-riscv/linux/pull/556/commits/0481092a5bec3818658981c11f629e06e66382b3

Signed-off-by: chenmiao <chenmiao...@gmail.com>
---
  arch/riscv/Kconfig              |  3 +-
  arch/riscv/include/asm/ftrace.h |  3 --
  arch/riscv/kernel/ftrace.c      | 11 +-----
  arch/riscv/kernel/mcount.S      | 64 ---------------------------------
  kernel/trace/Kconfig            |  2 +-
  5 files changed, 4 insertions(+), 79 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 36061f4732b7..95d24b19c466 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -97,8 +97,9 @@ config RISCV
      select CLONE_BACKWARDS
      select COMMON_CLK
      select CPU_PM if CPU_IDLE || HIBERNATION || SUSPEND
+    select DYNAMIC_FTRACE if FUNCTION_TRACER
      select EDAC_SUPPORT
-    select FRAME_POINTER if PERF_EVENTS || (FUNCTION_TRACER && !DYNAMIC_FTRACE)
+    select FRAME_POINTER if PERF_EVENTS
      select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY if DYNAMIC_FTRACE
      select FUNCTION_ALIGNMENT_8B if DYNAMIC_FTRACE_WITH_CALL_OPS
      select GENERIC_ARCH_TOPOLOGY
diff --git a/arch/riscv/include/asm/ftrace.h b/arch/riscv/include/asm/ftrace.h
index 22ebea3c2b26..77ddb6dce0a8 100644
--- a/arch/riscv/include/asm/ftrace.h
+++ b/arch/riscv/include/asm/ftrace.h
@@ -49,7 +49,6 @@ struct dyn_arch_ftrace {
  };
  #endif
  -#ifdef CONFIG_DYNAMIC_FTRACE
  /*
   * A general call in RISC-V is a pair of insts:
   * 1) auipc: setting high-20 pc-related bits to ra register
@@ -237,6 +236,4 @@ static inline void arch_ftrace_set_direct_caller(struct ftrace_regs *fregs, unsi
    #endif /* __ASSEMBLY__ */
  -#endif /* CONFIG_DYNAMIC_FTRACE */
-
  #endif /* _ASM_RISCV_FTRACE_H */
diff --git a/arch/riscv/kernel/ftrace.c b/arch/riscv/kernel/ftrace.c
index 4c6c24380cfd..93bad646d233 100644
--- a/arch/riscv/kernel/ftrace.c
+++ b/arch/riscv/kernel/ftrace.c
@@ -13,7 +13,6 @@
  #include <asm/cacheflush.h>
  #include <asm/text-patching.h>
  -#ifdef CONFIG_DYNAMIC_FTRACE
  unsigned long ftrace_call_adjust(unsigned long addr)
  {
      if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS))
@@ -191,13 +190,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
      return 0;
  }
  -#else /* CONFIG_DYNAMIC_FTRACE */
-unsigned long ftrace_call_adjust(unsigned long addr)
-{
-    return addr;
-}
-#endif /* CONFIG_DYNAMIC_FTRACE */
-
  #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
  int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
                 unsigned long addr)
@@ -236,7 +228,6 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
          *parent = return_hooker;
  }
  -#ifdef CONFIG_DYNAMIC_FTRACE
  void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
                 struct ftrace_ops *op, struct ftrace_regs *fregs)
  {
@@ -257,5 +248,5 @@ void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,       if (!function_graph_enter_regs(old, ip, frame_pointer, parent, fregs))
          *parent = return_hooker;
  }
-#endif /* CONFIG_DYNAMIC_FTRACE */
+
  #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
diff --git a/arch/riscv/kernel/mcount.S b/arch/riscv/kernel/mcount.S
index da4a4000e57e..bb550c15f1c9 100644
--- a/arch/riscv/kernel/mcount.S
+++ b/arch/riscv/kernel/mcount.S
@@ -14,13 +14,6 @@
        .text
  -    .macro SAVE_ABI_STATE
-    addi    sp, sp, -16
-    REG_S    s0, 0*SZREG(sp)
-    REG_S    ra, 1*SZREG(sp)
-    addi    s0, sp, 16
-    .endm
-
      /*
       * The call to ftrace_return_to_handler would overwrite the return
       * register if a0 was not saved.
@@ -34,12 +27,6 @@
      addi    s0, sp, FREGS_SIZE_ON_STACK
      .endm
  -    .macro RESTORE_ABI_STATE
-    REG_L    ra, 1*SZREG(sp)
-    REG_L    s0, 0*SZREG(sp)
-    addi    sp, sp, 16
-    .endm
-
      .macro RESTORE_RET_ABI_STATE
      REG_L    ra, FREGS_RA(sp)
      REG_L    s0, FREGS_S0(sp)
@@ -49,10 +36,8 @@
      .endm
    SYM_TYPED_FUNC_START(ftrace_stub)
-#ifdef CONFIG_DYNAMIC_FTRACE
         .global _mcount
         .set    _mcount, ftrace_stub
-#endif
      ret
  SYM_FUNC_END(ftrace_stub)
  @@ -79,53 +64,4 @@ SYM_FUNC_START(return_to_handler)
  SYM_FUNC_END(return_to_handler)
  #endif
  -#ifndef CONFIG_DYNAMIC_FTRACE
-SYM_FUNC_START(_mcount)
-    la    t4, ftrace_stub
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
-    la    t0, ftrace_graph_return
-    REG_L    t1, 0(t0)
-    bne    t1, t4, .Ldo_ftrace_graph_caller
-
-    la    t3, ftrace_graph_entry
-    REG_L    t2, 0(t3)
-    la    t6, ftrace_graph_entry_stub
-    bne    t2, t6, .Ldo_ftrace_graph_caller
-#endif
-    la    t3, ftrace_trace_function
-    REG_L    t5, 0(t3)
-    bne    t5, t4, .Ldo_trace
-    ret
-
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
-/*
- * A pseudo representation for the function graph tracer:
- * prepare_to_return(&ra_to_caller_of_caller, ra_to_caller)
- */
-.Ldo_ftrace_graph_caller:
-    addi    a0, s0, -SZREG
-    mv    a1, ra
-#ifdef HAVE_FUNCTION_GRAPH_FP_TEST
-    REG_L    a2, -2*SZREG(s0)
-#endif
-    SAVE_ABI_STATE
-    call    prepare_ftrace_return
-    RESTORE_ABI_STATE
-    ret
-#endif
-
-/*
- * A pseudo representation for the function tracer:
- * (*ftrace_trace_function)(ra_to_caller, ra_to_caller_of_caller)
- */
-.Ldo_trace:
-    REG_L    a1, -SZREG(s0)
-    mv    a0, ra
-
-    SAVE_ABI_STATE
-    jalr    t5
-    RESTORE_ABI_STATE
-    ret
-SYM_FUNC_END(_mcount)
-#endif
  EXPORT_SYMBOL(_mcount)
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index a3f35c7d83b6..28afc6941e7a 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -275,7 +275,7 @@ config FUNCTION_TRACE_ARGS
        funcgraph-args (for the function graph tracer)
    config DYNAMIC_FTRACE
-    bool "enable/disable function tracing dynamically"
+    bool
      depends on FUNCTION_TRACER
      depends on HAVE_DYNAMIC_FTRACE
      default y

base-commit: fda589c286040d9ba2d72a0eaf0a13945fc48026


I have just given it a try but I'm getting the following errors:

../arch/riscv/kernel/ftrace.c: In function 'arch_ftrace_update_code':
../arch/riscv/kernel/ftrace.c:44:9: error: implicit declaration of function 'ftrace_modify_all_code' [-Werror=implicit-function-declaration]
   44 |         ftrace_modify_all_code(command);
      |         ^~~~~~~~~~~~~~~~~~~~~~
../arch/riscv/kernel/ftrace.c: At top level:
../arch/riscv/kernel/ftrace.c:116:5: warning: no previous prototype for 'ftrace_make_call' [-Wmissing-prototypes]
  116 | int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
      |     ^~~~~~~~~~~~~~~~
../arch/riscv/kernel/ftrace.c: In function 'ftrace_make_call':
../arch/riscv/kernel/ftrace.c:118:52: error: invalid use of undefined type 'struct dyn_ftrace'   118 |         unsigned long distance, orig_addr, pc = rec->ip - MCOUNT_AUIPC_SIZE;
      |                                                    ^~
../arch/riscv/kernel/ftrace.c:125:37: error: 'ftrace_caller' undeclared (first use in this function); did you mean 'ftrace_kill'?
  125 |         orig_addr = (unsigned long)&ftrace_caller;
      |                                     ^~~~~~~~~~~~~
      |                                     ftrace_kill
../arch/riscv/kernel/ftrace.c:125:37: note: each undeclared identifier is reported only once for each function it appears in ../arch/riscv/kernel/ftrace.c:128:24: error: 'FTRACE_ADDR' undeclared (first use in this function)
  128 |                 addr = FTRACE_ADDR;
      |                        ^~~~~~~~~~~
../arch/riscv/kernel/ftrace.c: At top level:
../arch/riscv/kernel/ftrace.c:133:5: warning: no previous prototype for 'ftrace_make_nop' [-Wmissing-prototypes]   133 | int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec, unsigned long addr)
      |     ^~~~~~~~~~~~~~~
../arch/riscv/kernel/ftrace.c: In function 'ftrace_make_nop':
../arch/riscv/kernel/ftrace.c:142:41: error: invalid use of undefined type 'struct dyn_ftrace'   142 |         if (patch_insn_write((void *)rec->ip, &nop4, MCOUNT_NOP4_SIZE))
      |                                         ^~
../arch/riscv/kernel/ftrace.c: In function 'ftrace_init_nop':
../arch/riscv/kernel/ftrace.c:157:31: error: invalid use of undefined type 'struct dyn_ftrace'
  157 |         unsigned long pc = rec->ip - MCOUNT_AUIPC_SIZE;
      |                               ^~
  CC      drivers/nvme/target/io-cmd-bdev.o
../arch/riscv/kernel/ftrace.c:167:35: error: 'ftrace_caller' undeclared (first use in this function); did you mean 'ftrace_kill'?
  167 |         offset = (unsigned long) &ftrace_caller - pc;
      |                                   ^~~~~~~~~~~~~
      |                                   ftrace_kill
../arch/riscv/kernel/ftrace.c: At top level:
../arch/riscv/kernel/ftrace.c:177:5: warning: no previous prototype for 'ftrace_update_ftrace_func' [-Wmissing-prototypes]
  177 | int ftrace_update_ftrace_func(ftrace_func_t func)


I'll send a simple version this afternoon to fix the build error so that we can merge it in 6.16. That will be a simple version that does not remove the dead code.

I'll add your SoB, let me know if you want to work on removing the dead code in a follow-up patch targeting 6.17.

Thanks,

Alex




_______________________________________________
linux-riscv mailing list
linux-ri...@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

Reply via email to