perf, trace: Optimize tracepoints by using per-tracepoint-per-cpu hlist to track events
Avoid the swevent hash-table by using per-tracepoint hlists. Also, avoid conditionals on the fast path by ordering with probe unregister so that we should never get on the callback path without the data being there. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Steven Rostedt <rostedt@goodmis.org> LKML-Reference: <20100521090710.473188012@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
b7e2ecef92
commit
1c024eca51
@@ -438,6 +438,7 @@ static void perf_syscall_enter(struct pt_regs *regs, long id)
|
||||
{
|
||||
struct syscall_metadata *sys_data;
|
||||
struct syscall_trace_enter *rec;
|
||||
struct hlist_head *head;
|
||||
int syscall_nr;
|
||||
int rctx;
|
||||
int size;
|
||||
@@ -467,8 +468,9 @@ static void perf_syscall_enter(struct pt_regs *regs, long id)
|
||||
rec->nr = syscall_nr;
|
||||
syscall_get_arguments(current, regs, 0, sys_data->nb_args,
|
||||
(unsigned long *)&rec->args);
|
||||
perf_trace_buf_submit(rec, size, rctx, 0, 1, regs,
|
||||
sys_data->enter_event->perf_data);
|
||||
|
||||
head = per_cpu_ptr(sys_data->enter_event->perf_events, smp_processor_id());
|
||||
perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head);
|
||||
}
|
||||
|
||||
int perf_sysenter_enable(struct ftrace_event_call *call)
|
||||
@@ -510,6 +512,7 @@ static void perf_syscall_exit(struct pt_regs *regs, long ret)
|
||||
{
|
||||
struct syscall_metadata *sys_data;
|
||||
struct syscall_trace_exit *rec;
|
||||
struct hlist_head *head;
|
||||
int syscall_nr;
|
||||
int rctx;
|
||||
int size;
|
||||
@@ -542,8 +545,8 @@ static void perf_syscall_exit(struct pt_regs *regs, long ret)
|
||||
rec->nr = syscall_nr;
|
||||
rec->ret = syscall_get_return_value(current, regs);
|
||||
|
||||
perf_trace_buf_submit(rec, size, rctx, 0, 1, regs,
|
||||
sys_data->exit_event->perf_data);
|
||||
head = per_cpu_ptr(sys_data->exit_event->perf_events, smp_processor_id());
|
||||
perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head);
|
||||
}
|
||||
|
||||
int perf_sysexit_enable(struct ftrace_event_call *call)
|
||||
|
Reference in New Issue
Block a user