diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-11-23 04:57:59 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-11-23 05:48:27 -0500 |
commit | a4234bfcf4d72a10a99176cdef007345e9c3b4aa (patch) | |
tree | 240da1dbbdd6d2f88e9491774e623dc82caaa911 /kernel/perf_event.c | |
parent | 6e3d8330ae2c4b2c11a9577a0130d2ecda1c610d (diff) |
perf_events: Optimize the swcounter hotpath
The structure init creates a bit memcpy, which shows
up big time in perf annotate output:
: ffffffff810a859d <__perf_sw_event>:
1.68 : ffffffff810a859d: 55 push %rbp
1.69 : ffffffff810a859e: 41 89 fa mov %edi,%r10d
0.01 : ffffffff810a85a1: 49 89 c9 mov %rcx,%r9
0.00 : ffffffff810a85a4: 31 c0 xor %eax,%eax
1.71 : ffffffff810a85a6: b9 16 00 00 00 mov $0x16,%ecx
0.00 : ffffffff810a85ab: 48 89 e5 mov %rsp,%rbp
0.00 : ffffffff810a85ae: 48 83 ec 60 sub $0x60,%rsp
1.52 : ffffffff810a85b2: 48 8d 7d a0 lea -0x60(%rbp),%rdi
85.20 : ffffffff810a85b6: f3 ab rep stos %eax,%es:(%rdi)
None of the callees depends on the structure being pre-initialized,
so only initialize ->addr. This gets rid of the memcpy overhead.
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/perf_event.c')
-rw-r--r-- | kernel/perf_event.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index abe1ef47496..20df8aba8da 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -3954,12 +3954,12 @@ out: | |||
3954 | void __perf_sw_event(u32 event_id, u64 nr, int nmi, | 3954 | void __perf_sw_event(u32 event_id, u64 nr, int nmi, |
3955 | struct pt_regs *regs, u64 addr) | 3955 | struct pt_regs *regs, u64 addr) |
3956 | { | 3956 | { |
3957 | struct perf_sample_data data = { | 3957 | struct perf_sample_data data; |
3958 | .addr = addr, | ||
3959 | }; | ||
3960 | 3958 | ||
3961 | do_perf_sw_event(PERF_TYPE_SOFTWARE, event_id, nr, nmi, | 3959 | data.addr = addr; |
3962 | &data, regs); | 3960 | data.raw = NULL; |
3961 | |||
3962 | do_perf_sw_event(PERF_TYPE_SOFTWARE, event_id, nr, nmi, &data, regs); | ||
3963 | } | 3963 | } |
3964 | 3964 | ||
3965 | static void perf_swevent_read(struct perf_event *event) | 3965 | static void perf_swevent_read(struct perf_event *event) |