diff options
author | Alexei Starovoitov <ast@fb.com> | 2016-04-06 21:43:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-07 21:04:26 -0400 |
commit | ec5e099d6e941668d121ea9ca7057f4fa00830b0 (patch) | |
tree | 4ec273d88501a68ce23eb53649530161a7fa8440 | |
parent | b33b0a1bf69faff89693df49519fa7b459f5d807 (diff) |
perf: optimize perf_fetch_caller_regs
avoid memset in perf_fetch_caller_regs, since it's the critical path of all tracepoints.
It's called from perf_sw_event_sched, perf_event_task_sched_in and all of perf_trace_##call
with this_cpu_ptr(&__perf_regs[..]) which are zero initialized by perpcu init logic and
subsequent call to perf_arch_fetch_caller_regs initializes the same fields on all archs,
so we can safely drop memset from all of the above cases and move it into
perf_ftrace_function_call that calls it with stack allocated pt_regs.
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/perf_event.h | 2 | ||||
-rw-r--r-- | kernel/trace/trace_event_perf.c | 1 |
2 files changed, 1 insertions, 2 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index f291275ffd71..e89f7199c223 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -882,8 +882,6 @@ static inline void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned lo | |||
882 | */ | 882 | */ |
883 | static inline void perf_fetch_caller_regs(struct pt_regs *regs) | 883 | static inline void perf_fetch_caller_regs(struct pt_regs *regs) |
884 | { | 884 | { |
885 | memset(regs, 0, sizeof(*regs)); | ||
886 | |||
887 | perf_arch_fetch_caller_regs(regs, CALLER_ADDR0); | 885 | perf_arch_fetch_caller_regs(regs, CALLER_ADDR0); |
888 | } | 886 | } |
889 | 887 | ||
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c index 00df25fd86ef..7a68afca8249 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c | |||
@@ -316,6 +316,7 @@ perf_ftrace_function_call(unsigned long ip, unsigned long parent_ip, | |||
316 | 316 | ||
317 | BUILD_BUG_ON(ENTRY_SIZE > PERF_MAX_TRACE_SIZE); | 317 | BUILD_BUG_ON(ENTRY_SIZE > PERF_MAX_TRACE_SIZE); |
318 | 318 | ||
319 | memset(®s, 0, sizeof(regs)); | ||
319 | perf_fetch_caller_regs(®s); | 320 | perf_fetch_caller_regs(®s); |
320 | 321 | ||
321 | entry = perf_trace_buf_prepare(ENTRY_SIZE, TRACE_FN, NULL, &rctx); | 322 | entry = perf_trace_buf_prepare(ENTRY_SIZE, TRACE_FN, NULL, &rctx); |