On Fri 2020-11-13 12:18:14, Steven Rostedt wrote: > From: "Steven Rostedt (VMware)" <rostedt@xxxxxxxxxxx> > > When CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS is available, the ftrace call > will be able to set the ip of the calling function. This will improve the > performance of live kernel patching where it does not need all the regs to > be stored just to change the instruction pointer. > > If all archs that support live kernel patching also support > HAVE_DYNAMIC_FTRACE_WITH_ARGS, then the architecture specific function > klp_arch_set_pc() could be made generic. > > It is possible that an arch can support HAVE_DYNAMIC_FTRACE_WITH_ARGS but > not HAVE_DYNAMIC_FTRACE_WITH_REGS and then have access to live patching. > > Cc: Josh Poimboeuf <jpoimboe@xxxxxxxxxx> > Cc: Jiri Kosina <jikos@xxxxxxxxxx> > Cc: live-patching@xxxxxxxxxxxxxxx > Acked-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> > Acked-by: Miroslav Benes <mbenes@xxxxxxx> > Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> > --- > Changes since v6: > - Updated to use ftrace_instruction_pointer_set() macro > > arch/powerpc/include/asm/livepatch.h | 4 +++- > arch/s390/include/asm/livepatch.h | 5 ++++- > arch/x86/include/asm/ftrace.h | 3 +++ > arch/x86/include/asm/livepatch.h | 4 ++-- > arch/x86/kernel/ftrace_64.S | 4 ++++ > include/linux/ftrace.h | 7 +++++++ > kernel/livepatch/Kconfig | 2 +- > kernel/livepatch/patch.c | 9 +++++---- > 8 files changed, 29 insertions(+), 9 deletions(-) > > diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h > index 4a3d5d25fed5..ae25e6e72997 100644 > --- a/arch/powerpc/include/asm/livepatch.h > +++ b/arch/powerpc/include/asm/livepatch.h > @@ -12,8 +12,10 @@ > #include <linux/sched/task_stack.h> > > #ifdef CONFIG_LIVEPATCH > -static inline void klp_arch_set_pc(struct pt_regs *regs, unsigned long ip) > +static inline void klp_arch_set_pc(struct ftrace_regs *fregs, unsigned long ip) > { > + struct pt_regs *regs = ftrace_get_regs(fregs); Should we check for NULL pointer here? > + > regs->nip = ip; > } > > diff --git a/arch/s390/include/asm/livepatch.h b/arch/s390/include/asm/livepatch.h > index 818612b784cd..d578a8c76676 100644 > --- a/arch/s390/include/asm/livepatch.h > +++ b/arch/s390/include/asm/livepatch.h > @@ -11,10 +11,13 @@ > #ifndef ASM_LIVEPATCH_H > #define ASM_LIVEPATCH_H > > +#include <linux/ftrace.h> > #include <asm/ptrace.h> > > -static inline void klp_arch_set_pc(struct pt_regs *regs, unsigned long ip) > +static inline void klp_arch_set_pc(struct ftrace_regs *fregs, unsigned long ip) > { > + struct pt_regs *regs = ftrace_get_regs(fregs); And here? > + > regs->psw.addr = ip; > } > Otherwise, it looks for me. Best Regards, Petr