ip: ip_ra_control() rcu fix
[deliverable/linux.git] / kernel / trace / trace_event_perf.c
index 39d5ea7b0653540d2852a55349944824948e51f5..cb6f365016e48f0c7f7848cbaebb39d45fb80c45 100644 (file)
@@ -56,7 +56,13 @@ static int perf_trace_event_init(struct ftrace_event_call *tp_event,
                }
        }
 
-       ret = tp_event->perf_event_enable(tp_event);
+       if (tp_event->class->reg)
+               ret = tp_event->class->reg(tp_event, TRACE_REG_PERF_REGISTER);
+       else
+               ret = tracepoint_probe_register(tp_event->name,
+                                               tp_event->class->perf_probe,
+                                               tp_event);
+
        if (ret)
                goto fail;
 
@@ -89,7 +95,8 @@ int perf_trace_init(struct perf_event *p_event)
 
        mutex_lock(&event_mutex);
        list_for_each_entry(tp_event, &ftrace_events, list) {
-               if (tp_event->id == event_id && tp_event->perf_event_enable &&
+               if (tp_event->event.type == event_id &&
+                   tp_event->class && tp_event->class->perf_probe &&
                    try_module_get(tp_event->mod)) {
                        ret = perf_trace_event_init(tp_event, p_event);
                        break;
@@ -128,7 +135,12 @@ void perf_trace_destroy(struct perf_event *p_event)
        if (--tp_event->perf_refcount > 0)
                return;
 
-       tp_event->perf_event_disable(tp_event);
+       if (tp_event->class->reg)
+               tp_event->class->reg(tp_event, TRACE_REG_PERF_UNREGISTER);
+       else
+               tracepoint_probe_unregister(tp_event->name,
+                                           tp_event->class->perf_probe,
+                                           tp_event);
 
        free_percpu(tp_event->perf_events);
        tp_event->perf_events = NULL;
@@ -145,6 +157,7 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type,
                                       struct pt_regs *regs, int *rctxp)
 {
        struct trace_entry *entry;
+       unsigned long flags;
        char *raw_data;
        int pc;
 
@@ -162,7 +175,8 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type,
        memset(&raw_data[size - sizeof(u64)], 0, sizeof(u64));
 
        entry = (struct trace_entry *)raw_data;
-       tracing_generic_entry_update(entry, regs->flags, pc);
+       local_save_flags(flags);
+       tracing_generic_entry_update(entry, flags, pc);
        entry->type = type;
 
        return raw_data;
This page took 0.026951 seconds and 5 git commands to generate.