1
0
Fork 0
mirror of https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-01-22 16:06:04 -05:00

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>
This commit is contained in:
Masami Hiramatsu (Google) 2024-12-26 14:12:31 +09:00 committed by Steven Rostedt (Google)
parent 46bc082388
commit 762abbc0d0
11 changed files with 33 additions and 8 deletions

View file

@ -128,6 +128,7 @@ config LOONGARCH
select HAVE_DMA_CONTIGUOUS select HAVE_DMA_CONTIGUOUS
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_DYNAMIC_FTRACE_WITH_ARGS select HAVE_DYNAMIC_FTRACE_WITH_ARGS
select HAVE_FTRACE_REGS_HAVING_PT_REGS
select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_DYNAMIC_FTRACE_WITH_REGS select HAVE_DYNAMIC_FTRACE_WITH_REGS
select HAVE_EBPF_JIT select HAVE_EBPF_JIT

View file

@ -183,6 +183,7 @@ config S390
select HAVE_DMA_CONTIGUOUS select HAVE_DMA_CONTIGUOUS
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_DYNAMIC_FTRACE_WITH_ARGS select HAVE_DYNAMIC_FTRACE_WITH_ARGS
select HAVE_FTRACE_REGS_HAVING_PT_REGS
select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_DYNAMIC_FTRACE_WITH_REGS select HAVE_DYNAMIC_FTRACE_WITH_REGS
select HAVE_EBPF_JIT if HAVE_MARCH_Z196_FEATURES select HAVE_EBPF_JIT if HAVE_MARCH_Z196_FEATURES

View file

@ -225,6 +225,7 @@ config X86
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_DYNAMIC_FTRACE_WITH_REGS select HAVE_DYNAMIC_FTRACE_WITH_REGS
select HAVE_DYNAMIC_FTRACE_WITH_ARGS if X86_64 select HAVE_DYNAMIC_FTRACE_WITH_ARGS if X86_64
select HAVE_FTRACE_REGS_HAVING_PT_REGS if X86_64
select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_SAMPLE_FTRACE_DIRECT if X86_64 select HAVE_SAMPLE_FTRACE_DIRECT if X86_64
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI if X86_64 select HAVE_SAMPLE_FTRACE_DIRECT_MULTI if X86_64

View file

@ -14,7 +14,7 @@ typedef int (*fprobe_entry_cb)(struct fprobe *fp, unsigned long entry_ip,
void *entry_data); void *entry_data);
typedef void (*fprobe_exit_cb)(struct fprobe *fp, unsigned long entry_ip, typedef void (*fprobe_exit_cb)(struct fprobe *fp, unsigned long entry_ip,
unsigned long ret_ip, struct pt_regs *regs, unsigned long ret_ip, struct ftrace_regs *regs,
void *entry_data); void *entry_data);
/** /**

View file

@ -176,6 +176,12 @@ static inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
#define ftrace_regs_set_instruction_pointer(fregs, ip) do { } while (0) #define ftrace_regs_set_instruction_pointer(fregs, ip) do { } while (0)
#endif /* CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS */ #endif /* CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS */
#ifdef CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS
static_assert(sizeof(struct pt_regs) == ftrace_regs_size());
#endif /* CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS */
static __always_inline struct pt_regs *ftrace_get_regs(struct ftrace_regs *fregs) static __always_inline struct pt_regs *ftrace_get_regs(struct ftrace_regs *fregs)
{ {
if (!fregs) if (!fregs)

View file

@ -57,6 +57,12 @@ config HAVE_DYNAMIC_FTRACE_WITH_ARGS
This allows for use of ftrace_regs_get_argument() and This allows for use of ftrace_regs_get_argument() and
ftrace_regs_get_stack_pointer(). ftrace_regs_get_stack_pointer().
config HAVE_FTRACE_REGS_HAVING_PT_REGS
bool
help
If this is set, ftrace_regs has pt_regs, thus it can convert to
pt_regs without allocating memory.
config HAVE_DYNAMIC_FTRACE_NO_PATCHABLE config HAVE_DYNAMIC_FTRACE_NO_PATCHABLE
bool bool
help help
@ -298,6 +304,7 @@ config FPROBE
bool "Kernel Function Probe (fprobe)" bool "Kernel Function Probe (fprobe)"
depends on FUNCTION_TRACER depends on FUNCTION_TRACER
depends on DYNAMIC_FTRACE_WITH_REGS || DYNAMIC_FTRACE_WITH_ARGS depends on DYNAMIC_FTRACE_WITH_REGS || DYNAMIC_FTRACE_WITH_ARGS
depends on HAVE_FTRACE_REGS_HAVING_PT_REGS || !HAVE_DYNAMIC_FTRACE_WITH_ARGS
depends on HAVE_RETHOOK depends on HAVE_RETHOOK
select RETHOOK select RETHOOK
default n default n

View file

@ -2830,10 +2830,14 @@ kprobe_multi_link_handler(struct fprobe *fp, unsigned long fentry_ip,
static void static void
kprobe_multi_link_exit_handler(struct fprobe *fp, unsigned long fentry_ip, kprobe_multi_link_exit_handler(struct fprobe *fp, unsigned long fentry_ip,
unsigned long ret_ip, struct pt_regs *regs, unsigned long ret_ip, struct ftrace_regs *fregs,
void *data) void *data)
{ {
struct bpf_kprobe_multi_link *link; struct bpf_kprobe_multi_link *link;
struct pt_regs *regs = ftrace_get_regs(fregs);
if (!regs)
return;
link = container_of(fp, struct bpf_kprobe_multi_link, fp); link = container_of(fp, struct bpf_kprobe_multi_link, fp);
kprobe_multi_link_prog_run(link, get_entry_ip(fentry_ip), regs, true, data); kprobe_multi_link_prog_run(link, get_entry_ip(fentry_ip), regs, true, data);

View file

@ -124,6 +124,7 @@ static void fprobe_exit_handler(struct rethook_node *rh, void *data,
{ {
struct fprobe *fp = (struct fprobe *)data; struct fprobe *fp = (struct fprobe *)data;
struct fprobe_rethook_node *fpr; struct fprobe_rethook_node *fpr;
struct ftrace_regs *fregs = (struct ftrace_regs *)regs;
int bit; int bit;
if (!fp || fprobe_disabled(fp)) if (!fp || fprobe_disabled(fp))
@ -141,7 +142,7 @@ static void fprobe_exit_handler(struct rethook_node *rh, void *data,
return; return;
} }
fp->exit_handler(fp, fpr->entry_ip, ret_ip, regs, fp->exit_handler(fp, fpr->entry_ip, ret_ip, fregs,
fp->entry_data_size ? (void *)fpr->data : NULL); fp->entry_data_size ? (void *)fpr->data : NULL);
ftrace_test_recursion_unlock(bit); ftrace_test_recursion_unlock(bit);
} }

View file

@ -361,10 +361,14 @@ static int fentry_dispatcher(struct fprobe *fp, unsigned long entry_ip,
NOKPROBE_SYMBOL(fentry_dispatcher); NOKPROBE_SYMBOL(fentry_dispatcher);
static void fexit_dispatcher(struct fprobe *fp, unsigned long entry_ip, static void fexit_dispatcher(struct fprobe *fp, unsigned long entry_ip,
unsigned long ret_ip, struct pt_regs *regs, unsigned long ret_ip, struct ftrace_regs *fregs,
void *entry_data) void *entry_data)
{ {
struct trace_fprobe *tf = container_of(fp, struct trace_fprobe, fp); struct trace_fprobe *tf = container_of(fp, struct trace_fprobe, fp);
struct pt_regs *regs = ftrace_get_regs(fregs);
if (!regs)
return;
if (trace_probe_test_flag(&tf->tp, TP_FLAG_TRACE)) if (trace_probe_test_flag(&tf->tp, TP_FLAG_TRACE))
fexit_trace_func(tf, entry_ip, ret_ip, regs, entry_data); fexit_trace_func(tf, entry_ip, ret_ip, regs, entry_data);

View file

@ -59,9 +59,9 @@ static notrace int fp_entry_handler(struct fprobe *fp, unsigned long ip,
static notrace void fp_exit_handler(struct fprobe *fp, unsigned long ip, static notrace void fp_exit_handler(struct fprobe *fp, unsigned long ip,
unsigned long ret_ip, unsigned long ret_ip,
struct pt_regs *regs, void *data) struct ftrace_regs *fregs, void *data)
{ {
unsigned long ret = regs_return_value(regs); unsigned long ret = ftrace_regs_get_return_value(fregs);
KUNIT_EXPECT_FALSE(current_test, preemptible()); KUNIT_EXPECT_FALSE(current_test, preemptible());
if (ip != target_ip) { if (ip != target_ip) {
@ -89,7 +89,7 @@ static notrace int nest_entry_handler(struct fprobe *fp, unsigned long ip,
static notrace void nest_exit_handler(struct fprobe *fp, unsigned long ip, static notrace void nest_exit_handler(struct fprobe *fp, unsigned long ip,
unsigned long ret_ip, unsigned long ret_ip,
struct pt_regs *regs, void *data) struct ftrace_regs *fregs, void *data)
{ {
KUNIT_EXPECT_FALSE(current_test, preemptible()); KUNIT_EXPECT_FALSE(current_test, preemptible());
KUNIT_EXPECT_EQ(current_test, ip, target_nest_ip); KUNIT_EXPECT_EQ(current_test, ip, target_nest_ip);

View file

@ -67,7 +67,7 @@ static int sample_entry_handler(struct fprobe *fp, unsigned long ip,
} }
static void sample_exit_handler(struct fprobe *fp, unsigned long ip, static void sample_exit_handler(struct fprobe *fp, unsigned long ip,
unsigned long ret_ip, struct pt_regs *regs, unsigned long ret_ip, struct ftrace_regs *regs,
void *data) void *data)
{ {
unsigned long rip = ret_ip; unsigned long rip = ret_ip;