aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_event_perf.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_event_perf.c')
-rw-r--r--kernel/trace/trace_event_perf.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index 0565bb42566f..196fe9d26773 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -49,7 +49,12 @@ static int perf_trace_event_enable(struct ftrace_event_call *event)
49 rcu_assign_pointer(perf_trace_buf_nmi, buf); 49 rcu_assign_pointer(perf_trace_buf_nmi, buf);
50 } 50 }
51 51
52 ret = event->perf_event_enable(event); 52 if (event->class->reg)
53 ret = event->class->reg(event, TRACE_REG_PERF_REGISTER);
54 else
55 ret = tracepoint_probe_register(event->name,
56 event->class->perf_probe,
57 event);
53 if (!ret) { 58 if (!ret) {
54 total_ref_count++; 59 total_ref_count++;
55 return 0; 60 return 0;
@@ -75,7 +80,8 @@ int perf_trace_enable(int event_id)
75 80
76 mutex_lock(&event_mutex); 81 mutex_lock(&event_mutex);
77 list_for_each_entry(event, &ftrace_events, list) { 82 list_for_each_entry(event, &ftrace_events, list) {
78 if (event->id == event_id && event->perf_event_enable && 83 if (event->id == event_id &&
84 event->class && event->class->perf_probe &&
79 try_module_get(event->mod)) { 85 try_module_get(event->mod)) {
80 ret = perf_trace_event_enable(event); 86 ret = perf_trace_event_enable(event);
81 break; 87 break;
@@ -93,7 +99,10 @@ static void perf_trace_event_disable(struct ftrace_event_call *event)
93 if (--event->perf_refcount > 0) 99 if (--event->perf_refcount > 0)
94 return; 100 return;
95 101
96 event->perf_event_disable(event); 102 if (event->class->reg)
103 event->class->reg(event, TRACE_REG_PERF_UNREGISTER);
104 else
105 tracepoint_probe_unregister(event->name, event->class->perf_probe, event);
97 106
98 if (!--total_ref_count) { 107 if (!--total_ref_count) {
99 buf = perf_trace_buf; 108 buf = perf_trace_buf;