Messages in this thread | | | Date | Mon, 14 Feb 2022 20:55:33 +0530 | From | "Naveen N. Rao" <> | Subject | Re: [PATCH v2 09/13] powerpc/ftrace: Implement CONFIG_DYNAMIC_FTRACE_WITH_ARGS |
| |
Christophe Leroy wrote: > Implement CONFIG_DYNAMIC_FTRACE_WITH_ARGS. It accelerates the call > of livepatching. > > Also note that powerpc being the last one to convert to > CONFIG_DYNAMIC_FTRACE_WITH_ARGS, it will now be possible to remove > klp_arch_set_pc() on all architectures. > > Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> > --- > arch/powerpc/Kconfig | 1 + > arch/powerpc/include/asm/ftrace.h | 17 +++++++++++++++++ > arch/powerpc/include/asm/livepatch.h | 4 +--- > 3 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index cdac2115eb00..e2b1792b2aae 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -210,6 +210,7 @@ config PPC > select HAVE_DEBUG_KMEMLEAK > select HAVE_DEBUG_STACKOVERFLOW > select HAVE_DYNAMIC_FTRACE > + select HAVE_DYNAMIC_FTRACE_WITH_ARGS if MPROFILE_KERNEL || PPC32 > select HAVE_DYNAMIC_FTRACE_WITH_REGS if MPROFILE_KERNEL || PPC32 > select HAVE_EBPF_JIT > select HAVE_EFFICIENT_UNALIGNED_ACCESS if !(CPU_LITTLE_ENDIAN && POWER7_CPU) > diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h > index b3f6184f77ea..45c3d6f11daa 100644 > --- a/arch/powerpc/include/asm/ftrace.h > +++ b/arch/powerpc/include/asm/ftrace.h > @@ -22,6 +22,23 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) > struct dyn_arch_ftrace { > struct module *mod; > }; > + > +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_ARGS > +struct ftrace_regs { > + struct pt_regs regs; > +}; > + > +static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs) > +{ > + return &fregs->regs; > +}
I think this is wrong. We need to differentiate between ftrace_caller() and ftrace_regs_caller() here, and only return pt_regs if coming in through ftrace_regs_caller() (i.e., FL_SAVE_REGS is set).
> + > +static __always_inline void ftrace_instruction_pointer_set(struct ftrace_regs *fregs, > + unsigned long ip) > +{ > + regs_set_return_ip(&fregs->regs, ip);
Should we use that helper here? regs_set_return_ip() also updates some other state related to taking interrupts and I don't think it makes sense for use with ftrace.
- Naveen
| |