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.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index 39d5ea7b0653..26b8607a0abc 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -56,7 +56,13 @@ static int perf_trace_event_init(struct ftrace_event_call *tp_event,
56 } 56 }
57 } 57 }
58 58
59 ret = tp_event->perf_event_enable(tp_event); 59 if (tp_event->class->reg)
60 ret = tp_event->class->reg(tp_event, TRACE_REG_PERF_REGISTER);
61 else
62 ret = tracepoint_probe_register(tp_event->name,
63 tp_event->class->perf_probe,
64 tp_event);
65
60 if (ret) 66 if (ret)
61 goto fail; 67 goto fail;
62 68
@@ -89,7 +95,8 @@ int perf_trace_init(struct perf_event *p_event)
89 95
90 mutex_lock(&event_mutex); 96 mutex_lock(&event_mutex);
91 list_for_each_entry(tp_event, &ftrace_events, list) { 97 list_for_each_entry(tp_event, &ftrace_events, list) {
92 if (tp_event->id == event_id && tp_event->perf_event_enable && 98 if (tp_event->event.type == event_id &&
99 tp_event->class && tp_event->class->perf_probe &&
93 try_module_get(tp_event->mod)) { 100 try_module_get(tp_event->mod)) {
94 ret = perf_trace_event_init(tp_event, p_event); 101 ret = perf_trace_event_init(tp_event, p_event);
95 break; 102 break;
@@ -128,7 +135,12 @@ void perf_trace_destroy(struct perf_event *p_event)
128 if (--tp_event->perf_refcount > 0) 135 if (--tp_event->perf_refcount > 0)
129 return; 136 return;
130 137
131 tp_event->perf_event_disable(tp_event); 138 if (tp_event->class->reg)
139 tp_event->class->reg(tp_event, TRACE_REG_PERF_UNREGISTER);
140 else
141 tracepoint_probe_unregister(tp_event->name,
142 tp_event->class->perf_probe,
143 tp_event);
132 144
133 free_percpu(tp_event->perf_events); 145 free_percpu(tp_event->perf_events);
134 tp_event->perf_events = NULL; 146 tp_event->perf_events = NULL;