summaryrefslogtreecommitdiff
path: root/kernel/trace/fprobe.c
diff options
context:
space:
mode:
authorMasami Hiramatsu (Google) <mhiramat@kernel.org>2023-02-01 18:56:38 +0300
committerSteven Rostedt (Google) <rostedt@goodmis.org>2023-03-29 01:52:22 +0300
commit39d954200bf6ad503c722e44d0be80c7b826fa42 (patch)
tree01cc0df2f14044b41f9cedfb2c5b3fa6da26ec2c /kernel/trace/fprobe.c
parent7e7ef1bfe5522faab6f245ced7b6749e9ac410d8 (diff)
downloadlinux-39d954200bf6ad503c722e44d0be80c7b826fa42.tar.xz
fprobe: Skip exit_handler if entry_handler returns !0
Skip hooking function return and calling exit_handler if the entry_handler() returns !0. Link: https://lkml.kernel.org/r/167526699798.433354.10998365726830117303.stgit@mhiramat.roam.corp.google.com Cc: Florent Revest <revest@chromium.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Will Deacon <will@kernel.org> Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/fprobe.c')
-rw-r--r--kernel/trace/fprobe.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c
index f222848571f2..9abb3905bc8e 100644
--- a/kernel/trace/fprobe.c
+++ b/kernel/trace/fprobe.c
@@ -27,7 +27,7 @@ static void fprobe_handler(unsigned long ip, unsigned long parent_ip,
struct rethook_node *rh = NULL;
struct fprobe *fp;
void *entry_data = NULL;
- int bit;
+ int bit, ret;
fp = container_of(ops, struct fprobe, ops);
if (fprobe_disabled(fp))
@@ -52,11 +52,15 @@ static void fprobe_handler(unsigned long ip, unsigned long parent_ip,
}
if (fp->entry_handler)
- fp->entry_handler(fp, ip, ftrace_get_regs(fregs), entry_data);
-
- if (rh)
- rethook_hook(rh, ftrace_get_regs(fregs), true);
+ ret = fp->entry_handler(fp, ip, ftrace_get_regs(fregs), entry_data);
+ /* If entry_handler returns !0, nmissed is not counted. */
+ if (rh) {
+ if (ret)
+ rethook_recycle(rh);
+ else
+ rethook_hook(rh, ftrace_get_regs(fregs), true);
+ }
out:
ftrace_test_recursion_unlock(bit);
}