aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/perf_event.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-11-23 04:57:59 -0500
committerIngo Molnar <mingo@elte.hu>2009-11-23 05:48:27 -0500
commita4234bfcf4d72a10a99176cdef007345e9c3b4aa (patch)
tree240da1dbbdd6d2f88e9491774e623dc82caaa911 /kernel/perf_event.c
parent6e3d8330ae2c4b2c11a9577a0130d2ecda1c610d (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.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index abe1ef47496c..20df8aba8da5 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -3954,12 +3954,12 @@ out:
3954void __perf_sw_event(u32 event_id, u64 nr, int nmi, 3954void __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
3965static void perf_swevent_read(struct perf_event *event) 3965static void perf_swevent_read(struct perf_event *event)