Message ID | 20221115061525.112757-2-suagrfillet@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | riscv/ftrace: make function graph use ftrace directly | expand |
Context | Check | Description |
---|---|---|
conchuod/patch_count | success | Link |
conchuod/cover_letter | success | Series has a cover letter |
conchuod/tree_selection | success | Guessed tree name to be for-next |
conchuod/fixes_present | success | Fixes tag not required for -next series |
conchuod/verify_signedoff | success | Signed-off-by tag matches author and committer |
conchuod/kdoc | success | Errors and warnings before: 0 this patch: 0 |
conchuod/module_param | success | Was 0 now: 0 |
conchuod/build_rv32_defconfig | success | Build OK |
conchuod/build_warn_rv64 | success | Errors and warnings before: 0 this patch: 0 |
conchuod/dtb_warn_rv64 | success | Errors and warnings before: 0 this patch: 0 |
conchuod/header_inline | success | No static functions without inline keyword in header files |
conchuod/checkpatch | warning | CHECK: Alignment should match open parenthesis CHECK: Unnecessary parentheses around regs->ra |
conchuod/source_inline | success | Was 0 now: 0 |
conchuod/build_rv64_nommu_k210_defconfig | success | Build OK |
conchuod/verify_fixes | success | No Fixes tag |
conchuod/build_rv64_nommu_virt_defconfig | success | Build OK |
On Tue, Nov 15, 2022 at 02:15:23PM +0800, Song Shuai wrote: > Here implements ftrace_graph_func as the function graph tracing function > with FTRACE_WITH_REGS defined. > > function_graph_func gets the point of the parent IP and the frame pointer > from fregs and call prepare_ftrace_return for function graph tracing. > > If FTRACE_WITH_REGS isn't defined, the enable/disable helpers of > ftrace_graph_[regs]_call remain for serving the !FTRACE_WITH_REGS > version ftrace_caller. > > Signed-off-by: Song Shuai <suagrfillet@gmail.com> Hey Song, Last time I saw your email I'd swear it was "sugarfillet", just making sure that it is not a typo. Anyways, checkpatch is whinging about some parenthesis stuff: https://patchwork.kernel.org/project/linux-riscv/patch/20221115061525.112757-2-suagrfillet@gmail.com/ Would be nice to fix that when you resping. Thanks, Conor. > --- > arch/riscv/include/asm/ftrace.h | 13 +++++++++++-- > arch/riscv/kernel/ftrace.c | 16 ++++++++++++++++ > 2 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/arch/riscv/include/asm/ftrace.h b/arch/riscv/include/asm/ftrace.h > index 04dad3380041..b33c98070972 100644 > --- a/arch/riscv/include/asm/ftrace.h > +++ b/arch/riscv/include/asm/ftrace.h > @@ -81,8 +81,17 @@ do { \ > struct dyn_ftrace; > int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec); > #define ftrace_init_nop ftrace_init_nop > -#endif > > -#endif > +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS > +struct ftrace_ops; > +struct ftrace_regs; > +void ftrace_graph_func(unsigned long ip, unsigned long parent_ip, > + struct ftrace_ops *op, struct ftrace_regs *fregs); > +#define ftrace_graph_func ftrace_graph_func > +#endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ > + > +#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 2086f6585773..2d7ce77d4f33 100644 > --- a/arch/riscv/kernel/ftrace.c > +++ b/arch/riscv/kernel/ftrace.c > @@ -196,6 +196,20 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, > } > > #ifdef CONFIG_DYNAMIC_FTRACE > + > +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS > + > +void ftrace_graph_func(unsigned long ip, unsigned long parent_ip, > + struct ftrace_ops *op, struct ftrace_regs *fregs) > +{ > + struct pt_regs *regs = arch_ftrace_get_regs(fregs); > + unsigned long *parent = (unsigned long *)&(regs->ra); > + > + prepare_ftrace_return(parent, ip, frame_pointer(regs)); > +} > + > +#else /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ > + > extern void ftrace_graph_call(void); > extern void ftrace_graph_regs_call(void); > int ftrace_enable_ftrace_graph_caller(void) > @@ -223,5 +237,7 @@ int ftrace_disable_ftrace_graph_caller(void) > return __ftrace_modify_call((unsigned long)&ftrace_graph_regs_call, > (unsigned long)&prepare_ftrace_return, false); > } > +#endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ > + > #endif /* CONFIG_DYNAMIC_FTRACE */ > #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ > -- > 2.20.1 >
diff --git a/arch/riscv/include/asm/ftrace.h b/arch/riscv/include/asm/ftrace.h index 04dad3380041..b33c98070972 100644 --- a/arch/riscv/include/asm/ftrace.h +++ b/arch/riscv/include/asm/ftrace.h @@ -81,8 +81,17 @@ do { \ struct dyn_ftrace; int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec); #define ftrace_init_nop ftrace_init_nop -#endif -#endif +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS +struct ftrace_ops; +struct ftrace_regs; +void ftrace_graph_func(unsigned long ip, unsigned long parent_ip, + struct ftrace_ops *op, struct ftrace_regs *fregs); +#define ftrace_graph_func ftrace_graph_func +#endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ + +#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 2086f6585773..2d7ce77d4f33 100644 --- a/arch/riscv/kernel/ftrace.c +++ b/arch/riscv/kernel/ftrace.c @@ -196,6 +196,20 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, } #ifdef CONFIG_DYNAMIC_FTRACE + +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS + +void ftrace_graph_func(unsigned long ip, unsigned long parent_ip, + struct ftrace_ops *op, struct ftrace_regs *fregs) +{ + struct pt_regs *regs = arch_ftrace_get_regs(fregs); + unsigned long *parent = (unsigned long *)&(regs->ra); + + prepare_ftrace_return(parent, ip, frame_pointer(regs)); +} + +#else /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ + extern void ftrace_graph_call(void); extern void ftrace_graph_regs_call(void); int ftrace_enable_ftrace_graph_caller(void) @@ -223,5 +237,7 @@ int ftrace_disable_ftrace_graph_caller(void) return __ftrace_modify_call((unsigned long)&ftrace_graph_regs_call, (unsigned long)&prepare_ftrace_return, false); } +#endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ + #endif /* CONFIG_DYNAMIC_FTRACE */ #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
Here implements ftrace_graph_func as the function graph tracing function with FTRACE_WITH_REGS defined. function_graph_func gets the point of the parent IP and the frame pointer from fregs and call prepare_ftrace_return for function graph tracing. If FTRACE_WITH_REGS isn't defined, the enable/disable helpers of ftrace_graph_[regs]_call remain for serving the !FTRACE_WITH_REGS version ftrace_caller. Signed-off-by: Song Shuai <suagrfillet@gmail.com> --- arch/riscv/include/asm/ftrace.h | 13 +++++++++++-- arch/riscv/kernel/ftrace.c | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-)