Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fprobe: Use ftrace_regs in fprobe exit handler

Change the fprobe exit handler to use ftrace_regs structure instead of
pt_regs. This also introduce HAVE_FTRACE_REGS_HAVING_PT_REGS which
means the ftrace_regs is including the pt_regs so that ftrace_regs
can provide pt_regs without memory allocation.
Fprobe introduces a new dependency with that.

Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Acked-by: Heiko Carstens <hca@linux.ibm.com> # s390
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Florent Revest <revest@chromium.org>
Cc: bpf <bpf@vger.kernel.org>
Cc: Alan Maguire <alan.maguire@oracle.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: WANG Xuerui <kernel@xen0n.name>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: x86@kernel.org
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Song Liu <song@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: KP Singh <kpsingh@kernel.org>
Cc: Matt Bobrowski <mattbobrowski@google.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: Eduard Zingerman <eddyz87@gmail.com>
Cc: Yonghong Song <yonghong.song@linux.dev>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: Stanislav Fomichev <sdf@fomichev.me>
Cc: Hao Luo <haoluo@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: https://lore.kernel.org/173518995092.391279.6765116450352977627.stgit@devnote2
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

authored by

Masami Hiramatsu (Google) and committed by
Steven Rostedt (Google)
762abbc0 46bc0823

+33 -8
+1
arch/loongarch/Kconfig
··· 128 128 select HAVE_DMA_CONTIGUOUS 129 129 select HAVE_DYNAMIC_FTRACE 130 130 select HAVE_DYNAMIC_FTRACE_WITH_ARGS 131 + select HAVE_FTRACE_REGS_HAVING_PT_REGS 131 132 select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 132 133 select HAVE_DYNAMIC_FTRACE_WITH_REGS 133 134 select HAVE_EBPF_JIT
+1
arch/s390/Kconfig
··· 183 183 select HAVE_DMA_CONTIGUOUS 184 184 select HAVE_DYNAMIC_FTRACE 185 185 select HAVE_DYNAMIC_FTRACE_WITH_ARGS 186 + select HAVE_FTRACE_REGS_HAVING_PT_REGS 186 187 select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 187 188 select HAVE_DYNAMIC_FTRACE_WITH_REGS 188 189 select HAVE_EBPF_JIT if HAVE_MARCH_Z196_FEATURES
+1
arch/x86/Kconfig
··· 225 225 select HAVE_DYNAMIC_FTRACE 226 226 select HAVE_DYNAMIC_FTRACE_WITH_REGS 227 227 select HAVE_DYNAMIC_FTRACE_WITH_ARGS if X86_64 228 + select HAVE_FTRACE_REGS_HAVING_PT_REGS if X86_64 228 229 select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 229 230 select HAVE_SAMPLE_FTRACE_DIRECT if X86_64 230 231 select HAVE_SAMPLE_FTRACE_DIRECT_MULTI if X86_64
+1 -1
include/linux/fprobe.h
··· 14 14 void *entry_data); 15 15 16 16 typedef void (*fprobe_exit_cb)(struct fprobe *fp, unsigned long entry_ip, 17 - unsigned long ret_ip, struct pt_regs *regs, 17 + unsigned long ret_ip, struct ftrace_regs *regs, 18 18 void *entry_data); 19 19 20 20 /**
+6
include/linux/ftrace.h
··· 176 176 #define ftrace_regs_set_instruction_pointer(fregs, ip) do { } while (0) 177 177 #endif /* CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS */ 178 178 179 + #ifdef CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS 180 + 181 + static_assert(sizeof(struct pt_regs) == ftrace_regs_size()); 182 + 183 + #endif /* CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS */ 184 + 179 185 static __always_inline struct pt_regs *ftrace_get_regs(struct ftrace_regs *fregs) 180 186 { 181 187 if (!fregs)
+7
kernel/trace/Kconfig
··· 57 57 This allows for use of ftrace_regs_get_argument() and 58 58 ftrace_regs_get_stack_pointer(). 59 59 60 + config HAVE_FTRACE_REGS_HAVING_PT_REGS 61 + bool 62 + help 63 + If this is set, ftrace_regs has pt_regs, thus it can convert to 64 + pt_regs without allocating memory. 65 + 60 66 config HAVE_DYNAMIC_FTRACE_NO_PATCHABLE 61 67 bool 62 68 help ··· 304 298 bool "Kernel Function Probe (fprobe)" 305 299 depends on FUNCTION_TRACER 306 300 depends on DYNAMIC_FTRACE_WITH_REGS || DYNAMIC_FTRACE_WITH_ARGS 301 + depends on HAVE_FTRACE_REGS_HAVING_PT_REGS || !HAVE_DYNAMIC_FTRACE_WITH_ARGS 307 302 depends on HAVE_RETHOOK 308 303 select RETHOOK 309 304 default n
+5 -1
kernel/trace/bpf_trace.c
··· 2830 2830 2831 2831 static void 2832 2832 kprobe_multi_link_exit_handler(struct fprobe *fp, unsigned long fentry_ip, 2833 - unsigned long ret_ip, struct pt_regs *regs, 2833 + unsigned long ret_ip, struct ftrace_regs *fregs, 2834 2834 void *data) 2835 2835 { 2836 2836 struct bpf_kprobe_multi_link *link; 2837 + struct pt_regs *regs = ftrace_get_regs(fregs); 2838 + 2839 + if (!regs) 2840 + return; 2837 2841 2838 2842 link = container_of(fp, struct bpf_kprobe_multi_link, fp); 2839 2843 kprobe_multi_link_prog_run(link, get_entry_ip(fentry_ip), regs, true, data);
+2 -1
kernel/trace/fprobe.c
··· 124 124 { 125 125 struct fprobe *fp = (struct fprobe *)data; 126 126 struct fprobe_rethook_node *fpr; 127 + struct ftrace_regs *fregs = (struct ftrace_regs *)regs; 127 128 int bit; 128 129 129 130 if (!fp || fprobe_disabled(fp)) ··· 142 141 return; 143 142 } 144 143 145 - fp->exit_handler(fp, fpr->entry_ip, ret_ip, regs, 144 + fp->exit_handler(fp, fpr->entry_ip, ret_ip, fregs, 146 145 fp->entry_data_size ? (void *)fpr->data : NULL); 147 146 ftrace_test_recursion_unlock(bit); 148 147 }
+5 -1
kernel/trace/trace_fprobe.c
··· 361 361 NOKPROBE_SYMBOL(fentry_dispatcher); 362 362 363 363 static void fexit_dispatcher(struct fprobe *fp, unsigned long entry_ip, 364 - unsigned long ret_ip, struct pt_regs *regs, 364 + unsigned long ret_ip, struct ftrace_regs *fregs, 365 365 void *entry_data) 366 366 { 367 367 struct trace_fprobe *tf = container_of(fp, struct trace_fprobe, fp); 368 + struct pt_regs *regs = ftrace_get_regs(fregs); 369 + 370 + if (!regs) 371 + return; 368 372 369 373 if (trace_probe_test_flag(&tf->tp, TP_FLAG_TRACE)) 370 374 fexit_trace_func(tf, entry_ip, ret_ip, regs, entry_data);
+3 -3
lib/test_fprobe.c
··· 59 59 60 60 static notrace void fp_exit_handler(struct fprobe *fp, unsigned long ip, 61 61 unsigned long ret_ip, 62 - struct pt_regs *regs, void *data) 62 + struct ftrace_regs *fregs, void *data) 63 63 { 64 - unsigned long ret = regs_return_value(regs); 64 + unsigned long ret = ftrace_regs_get_return_value(fregs); 65 65 66 66 KUNIT_EXPECT_FALSE(current_test, preemptible()); 67 67 if (ip != target_ip) { ··· 89 89 90 90 static notrace void nest_exit_handler(struct fprobe *fp, unsigned long ip, 91 91 unsigned long ret_ip, 92 - struct pt_regs *regs, void *data) 92 + struct ftrace_regs *fregs, void *data) 93 93 { 94 94 KUNIT_EXPECT_FALSE(current_test, preemptible()); 95 95 KUNIT_EXPECT_EQ(current_test, ip, target_nest_ip);
+1 -1
samples/fprobe/fprobe_example.c
··· 67 67 } 68 68 69 69 static void sample_exit_handler(struct fprobe *fp, unsigned long ip, 70 - unsigned long ret_ip, struct pt_regs *regs, 70 + unsigned long ret_ip, struct ftrace_regs *regs, 71 71 void *data) 72 72 { 73 73 unsigned long rip = ret_ip;