kprobes support: fix handling of event description
[lttng-modules.git] / ltt-events.c
index ec5d6830d4355fa64d91b1870d9443874dae8bd3..cf4fc8b77158fb0f0c398d49249dacce16511ad4 100644 (file)
@@ -203,7 +203,6 @@ void _ltt_channel_destroy(struct ltt_channel *chan)
  */
 struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name,
                                   struct lttng_kernel_event *event_param,
-                                  const struct lttng_event_desc *event_desc,
                                   void *filter)
 {
        struct ltt_event *event;
@@ -223,7 +222,6 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name,
        if (!event)
                goto cache_error;
        event->chan = chan;
-       event->desc = event_desc;
        event->filter = filter;
        event->id = chan->free_event_id++;
        event->instrumentation = event_param->instrumentation;
@@ -231,30 +229,23 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name,
        smp_wmb();
        switch (event_param->instrumentation) {
        case LTTNG_KERNEL_TRACEPOINTS:
-               ret = tracepoint_probe_register(name, event_desc->probe_callback,
-                                               event);
+               event->desc = ltt_event_get(name);
+               if (!event->desc)
+                       goto register_error;
+               ret = tracepoint_probe_register(name,
+                               event->desc->probe_callback,
+                               event);
                if (ret)
                        goto register_error;
                break;
        case LTTNG_KERNEL_KPROBES:
-               event->u.kprobe.kp.pre_handler = lttng_kprobes_handler_pre;
-               event->u.kprobe.symbol_name =
-                       kzalloc(LTTNG_KPROBE_SYM_NAME_LEN * sizeof(char),
-                               GFP_KERNEL);
-               if (!event->u.kprobe.symbol_name)
-                       goto register_error;
-               memcpy(event->u.kprobe.symbol_name,
-                      event_param->u.kprobe.symbol_name,
-                      LTTNG_KPROBE_SYM_NAME_LEN * sizeof(char));
-               event->u.kprobe.kp.symbol_name =
-                       event->u.kprobe.symbol_name;
-               event->u.kprobe.kp.offset = event_param->u.kprobe.offset;
-               event->u.kprobe.kp.addr = (void *) event_param->u.kprobe.addr;
-               ret = register_kprobe(&event->u.kprobe.kp);
-               if (ret) {
-                       kfree(event->u.kprobe.symbol_name);
+               ret = lttng_kprobes_register(name,
+                               event_param->u.kprobe.symbol_name,
+                               event_param->u.kprobe.offset,
+                               event_param->u.kprobe.addr,
+                               event);
+               if (ret)
                        goto register_error;
-               }
                break;
        default:
                WARN_ON_ONCE(1);
@@ -267,8 +258,10 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name,
        return event;
 
 statedump_error:
-       WARN_ON_ONCE(tracepoint_probe_unregister(name, event_desc->probe_callback,
-                                                event));
+       WARN_ON_ONCE(tracepoint_probe_unregister(name,
+                               event->desc->probe_callback,
+                               event));
+       ltt_event_put(event->desc);
 register_error:
        kmem_cache_free(event_cache, event);
 cache_error:
@@ -292,10 +285,10 @@ int _ltt_event_unregister(struct ltt_event *event)
                                                  event);
                if (ret)
                        return ret;
+               ltt_event_put(event->desc);
                break;
        case LTTNG_KERNEL_KPROBES:
-               unregister_kprobe(&event->u.kprobe.kp);
-               kfree(event->u.kprobe.symbol_name);
+               lttng_kprobes_unregister(event);
                ret = 0;
                break;
        default:
This page took 0.024014 seconds and 4 git commands to generate.