perf/ftrace: Optimize perf/tracepoint interaction for single events
When we've got but a single event per tracepoint there is no reason to try and multiplex it so don't. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Tested-by: Ingo Molnar <mingo@elte.hu> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
ef4f30f54e
commit
4f41c013f5
@@ -27,13 +27,15 @@ typedef typeof(unsigned long [PERF_MAX_TRACE_SIZE / sizeof(unsigned long)])
|
||||
/* Count the events in use (per event id, not per instance) */
|
||||
static int total_ref_count;
|
||||
|
||||
static int perf_trace_event_enable(struct ftrace_event_call *event)
|
||||
static int perf_trace_event_enable(struct ftrace_event_call *event, void *data)
|
||||
{
|
||||
char *buf;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
if (event->perf_refcount++ > 0)
|
||||
if (event->perf_refcount++ > 0) {
|
||||
event->perf_data = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!total_ref_count) {
|
||||
buf = (char *)alloc_percpu(perf_trace_t);
|
||||
@@ -51,6 +53,7 @@ static int perf_trace_event_enable(struct ftrace_event_call *event)
|
||||
|
||||
ret = event->perf_event_enable(event);
|
||||
if (!ret) {
|
||||
event->perf_data = data;
|
||||
total_ref_count++;
|
||||
return 0;
|
||||
}
|
||||
@@ -68,7 +71,7 @@ fail_buf:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int perf_trace_enable(int event_id)
|
||||
int perf_trace_enable(int event_id, void *data)
|
||||
{
|
||||
struct ftrace_event_call *event;
|
||||
int ret = -EINVAL;
|
||||
@@ -77,7 +80,7 @@ int perf_trace_enable(int event_id)
|
||||
list_for_each_entry(event, &ftrace_events, list) {
|
||||
if (event->id == event_id && event->perf_event_enable &&
|
||||
try_module_get(event->mod)) {
|
||||
ret = perf_trace_event_enable(event);
|
||||
ret = perf_trace_event_enable(event, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user