From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
To: Alexei Starovoitov <alexei.starovoitov@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Florent Revest <revest@chromium.org>
Cc: linux-trace-kernel@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
bpf <bpf@vger.kernel.org>, Sven Schnelle <svens@linux.ibm.com>,
Alexei Starovoitov <ast@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Alan Maguire <alan.maguire@oracle.com>,
Mark Rutland <mark.rutland@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>, Guo Ren <guoren@kernel.org>,
linux-arch@vger.kernel.org
Subject: [PATCH v14 19/19] fgraph: Skip recording calltime/rettime if it is not nneeded
Date: Fri, 13 Sep 2024 00:11:38 +0900 [thread overview]
Message-ID: <172615389864.133222.14452329708227900626.stgit@devnote2> (raw)
In-Reply-To: <172615368656.133222.2336770908714920670.stgit@devnote2>
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Skip recording calltime and rettime if the fgraph_ops does not need it.
This is a kind of performance optimization for fprobe. Since the fprobe
user does not use these entries, recording timestamp in fgraph is just
a overhead (e.g. eBPF, ftrace). So introduce the skip_timestamp flag,
and all fgraph_ops sets this flag, skip recording calltime and rettime.
Here is the performance results measured by
tools/testing/selftests/bpf/benchs/run_bench_trigger.sh
Without this:
kprobe-multi : 5.700 ± 0.065M/s
kretprobe-multi: 4.239 ± 0.006M/s
With skip-timestamp:
kprobe-multi : 6.265 ± 0.033M/s +9.91%
kretprobe-multi: 4.758 ± 0.009M/s +12.24%
Suggested-by: Jiri Olsa <olsajiri@gmail.com>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
Changes in v11:
- Simplify it to be symmetric on push and pop. (Thus the timestamp
getting place is a bit shifted.)
Changes in v10:
- Add likely() to skipping timestamp.
Changes in v9:
- Newly added.
---
include/linux/ftrace.h | 2 ++
kernel/trace/fgraph.c | 36 +++++++++++++++++++++++++++++++++---
kernel/trace/fprobe.c | 1 +
3 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 63fb91088a23..bab6fabb3fa1 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -1160,6 +1160,8 @@ struct fgraph_ops {
void *private;
trace_func_graph_ent_t saved_func;
int idx;
+ /* If skip_timestamp is true, this does not record timestamps. */
+ bool skip_timestamp;
};
void *fgraph_reserve_data(int idx, int size_bytes);
diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c
index 6a3e2db16aa4..c116a92839ae 100644
--- a/kernel/trace/fgraph.c
+++ b/kernel/trace/fgraph.c
@@ -174,6 +174,7 @@ int ftrace_graph_active;
static struct fgraph_ops *fgraph_array[FGRAPH_ARRAY_SIZE];
static unsigned long fgraph_array_bitmask;
+static bool fgraph_skip_timestamp;
/* LRU index table for fgraph_array */
static int fgraph_lru_table[FGRAPH_ARRAY_SIZE];
@@ -557,7 +558,11 @@ ftrace_push_return_trace(unsigned long ret, unsigned long func,
return -EBUSY;
}
- calltime = trace_clock_local();
+ /* This is not really 'likely' but for keeping the least path to be faster. */
+ if (likely(fgraph_skip_timestamp))
+ calltime = 0LL;
+ else
+ calltime = trace_clock_local();
offset = READ_ONCE(current->curr_ret_stack);
ret_stack = RET_STACK(current, offset);
@@ -728,6 +733,12 @@ ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret,
*ret = ret_stack->ret;
trace->func = ret_stack->func;
trace->calltime = ret_stack->calltime;
+ /* This is not really 'likely' but for keeping the least path to be faster. */
+ if (likely(!trace->calltime))
+ trace->rettime = 0LL;
+ else
+ trace->rettime = trace_clock_local();
+
trace->overrun = atomic_read(¤t->trace_overrun);
trace->depth = current->curr_ret_depth;
/*
@@ -788,7 +799,6 @@ __ftrace_return_to_handler(struct ftrace_regs *fregs, unsigned long frame_pointe
return (unsigned long)panic;
}
- trace.rettime = trace_clock_local();
if (fregs)
ftrace_regs_set_instruction_pointer(fregs, ret);
@@ -1248,6 +1258,24 @@ static void ftrace_graph_disable_direct(bool disable_branch)
fgraph_direct_gops = &fgraph_stub;
}
+static void update_fgraph_skip_timestamp(void)
+{
+ int i;
+
+ for (i = 0; i < FGRAPH_ARRAY_SIZE; i++) {
+ struct fgraph_ops *gops = fgraph_array[i];
+
+ if (gops == &fgraph_stub)
+ continue;
+
+ if (!gops->skip_timestamp) {
+ fgraph_skip_timestamp = false;
+ return;
+ }
+ }
+ fgraph_skip_timestamp = true;
+}
+
int register_ftrace_graph(struct fgraph_ops *gops)
{
int command = 0;
@@ -1271,6 +1299,7 @@ int register_ftrace_graph(struct fgraph_ops *gops)
gops->idx = i;
ftrace_graph_active++;
+ update_fgraph_skip_timestamp();
if (ftrace_graph_active == 2)
ftrace_graph_disable_direct(true);
@@ -1303,6 +1332,7 @@ int register_ftrace_graph(struct fgraph_ops *gops)
ftrace_graph_active--;
gops->saved_func = NULL;
fgraph_lru_release_index(i);
+ update_fgraph_skip_timestamp();
}
out:
mutex_unlock(&ftrace_lock);
@@ -1326,8 +1356,8 @@ void unregister_ftrace_graph(struct fgraph_ops *gops)
goto out;
fgraph_array[gops->idx] = &fgraph_stub;
-
ftrace_graph_active--;
+ update_fgraph_skip_timestamp();
if (!ftrace_graph_active)
command = FTRACE_STOP_FUNC_RET;
diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c
index 5a0b4ef52fa7..b108d26d7ee5 100644
--- a/kernel/trace/fprobe.c
+++ b/kernel/trace/fprobe.c
@@ -345,6 +345,7 @@ NOKPROBE_SYMBOL(fprobe_return);
static struct fgraph_ops fprobe_graph_ops = {
.entryfunc = fprobe_entry,
.retfunc = fprobe_return,
+ .skip_timestamp = true,
};
static int fprobe_graph_active;
next prev parent reply other threads:[~2024-09-12 15:11 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-12 15:08 [PATCH v14 00/19] tracing: fprobe: function_graph: Multi-function graph and fprobe on fgraph Masami Hiramatsu (Google)
2024-09-12 15:08 ` [PATCH v14 01/19] tracing: Add a comment about ftrace_regs definition Masami Hiramatsu (Google)
2024-09-12 15:08 ` [PATCH v14 02/19] tracing: Rename ftrace_regs_return_value to ftrace_regs_get_return_value Masami Hiramatsu (Google)
2024-09-12 15:08 ` [PATCH v14 03/19] function_graph: Pass ftrace_regs to entryfunc Masami Hiramatsu (Google)
2024-09-15 8:46 ` Steven Rostedt
2024-09-17 8:26 ` Will Deacon
2024-09-30 18:46 ` Steven Rostedt
2024-10-01 1:57 ` Masami Hiramatsu
2024-09-15 8:50 ` Steven Rostedt
2024-09-15 8:53 ` Steven Rostedt
2024-09-15 8:56 ` Steven Rostedt
2024-09-15 8:56 ` Steven Rostedt
2024-09-15 8:58 ` Steven Rostedt
2024-09-12 15:08 ` [PATCH v14 04/19] function_graph: Replace fgraph_ret_regs with ftrace_regs Masami Hiramatsu (Google)
2024-09-15 9:11 ` Steven Rostedt
2024-09-17 9:55 ` Will Deacon
2024-09-30 18:55 ` Steven Rostedt
2024-10-01 23:10 ` Masami Hiramatsu
2024-10-01 23:32 ` Steven Rostedt
2024-10-02 14:31 ` Masami Hiramatsu
2024-09-15 9:13 ` Steven Rostedt
2024-09-15 9:13 ` Steven Rostedt
2024-09-15 9:15 ` Steven Rostedt
2024-09-16 12:16 ` Heiko Carstens
2024-09-16 16:29 ` Steven Rostedt
2024-09-16 18:59 ` Heiko Carstens
2024-10-01 12:55 ` Masami Hiramatsu
2024-09-15 9:17 ` Steven Rostedt
2024-09-12 15:09 ` [PATCH v14 05/19] function_graph: Pass ftrace_regs to retfunc Masami Hiramatsu (Google)
2024-09-15 8:49 ` Steven Rostedt
2024-09-17 10:08 ` Will Deacon
2024-09-30 19:03 ` Steven Rostedt
2024-10-01 23:24 ` Masami Hiramatsu
2024-09-15 8:51 ` Steven Rostedt
2024-09-15 8:54 ` Steven Rostedt
2024-09-15 8:57 ` Steven Rostedt
2024-09-15 8:57 ` Steven Rostedt
2024-09-15 9:00 ` Steven Rostedt
2024-09-12 15:09 ` [PATCH v14 06/19] fprobe: Use ftrace_regs in fprobe entry handler Masami Hiramatsu (Google)
2024-09-12 15:09 ` [PATCH v14 07/19] fprobe: Use ftrace_regs in fprobe exit handler Masami Hiramatsu (Google)
2024-09-12 15:09 ` [PATCH v14 08/19] tracing: Add ftrace_partial_regs() for converting ftrace_regs to pt_regs Masami Hiramatsu (Google)
2024-09-15 9:22 ` Steven Rostedt
2024-09-17 10:14 ` Will Deacon
2024-10-01 23:26 ` Masami Hiramatsu
2024-09-12 15:09 ` [PATCH v14 09/19] tracing: Add ftrace_fill_perf_regs() for perf event Masami Hiramatsu (Google)
2024-09-12 15:09 ` [PATCH v14 10/19] tracing/fprobe: Enable fprobe events with CONFIG_DYNAMIC_FTRACE_WITH_ARGS Masami Hiramatsu (Google)
2024-09-12 15:10 ` [PATCH v14 11/19] bpf: Enable kprobe_multi feature if CONFIG_FPROBE is enabled Masami Hiramatsu (Google)
2024-09-12 15:10 ` [PATCH v14 12/19] ftrace: Add CONFIG_HAVE_FTRACE_GRAPH_FUNC Masami Hiramatsu (Google)
2024-09-12 15:10 ` [PATCH v14 13/19] fprobe: Rewrite fprobe on function-graph tracer Masami Hiramatsu (Google)
2024-09-12 15:10 ` [PATCH v14 14/19] tracing: Fix function timing profiler to initialize hashtable Masami Hiramatsu (Google)
2024-09-12 15:10 ` [PATCH v14 15/19] tracing/fprobe: Remove nr_maxactive from fprobe Masami Hiramatsu (Google)
2024-09-12 15:11 ` [PATCH v14 16/19] selftests: ftrace: Remove obsolate maxactive syntax check Masami Hiramatsu (Google)
2024-09-12 15:11 ` [PATCH v14 17/19] selftests/ftrace: Add a test case for repeating register/unregister fprobe Masami Hiramatsu (Google)
2024-09-12 15:11 ` [PATCH v14 18/19] Documentation: probes: Update fprobe on function-graph tracer Masami Hiramatsu (Google)
2024-09-12 15:11 ` Masami Hiramatsu (Google) [this message]
2024-09-14 21:53 ` [PATCH v14 19/19] fgraph: Skip recording calltime/rettime if it is not nneeded Steven Rostedt
[not found] ` <0170cd7d95df0583770c385c1e11bd27dfacf618b71b6e723f0952efc0ce9040@mail.kernel.org>
2024-09-12 18:41 ` [PATCH v14 00/19] tracing: fprobe: function_graph: Multi-function graph and fprobe on fgraph Andrii Nakryiko
2024-09-12 23:54 ` Masami Hiramatsu
2024-09-13 1:55 ` Andrii Nakryiko
2024-09-13 8:59 ` Masami Hiramatsu
2024-09-13 12:45 ` Masami Hiramatsu
2024-09-13 13:49 ` Masami Hiramatsu
2024-09-13 21:23 ` Andrii Nakryiko
2024-09-14 2:10 ` Masami Hiramatsu
2024-09-13 21:16 ` Andrii Nakryiko
2024-09-14 1:58 ` Masami Hiramatsu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=172615389864.133222.14452329708227900626.stgit@devnote2 \
--to=mhiramat@kernel.org \
--cc=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=guoren@kernel.org \
--cc=jolsa@kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=martin.lau@linux.dev \
--cc=peterz@infradead.org \
--cc=revest@chromium.org \
--cc=rostedt@goodmis.org \
--cc=svens@linux.ibm.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.