Implement event notifiers for kprobes
[deliverable/lttng-modules.git] / src / lttng-events.c
index 41bbd7098ddae75f57c7df7a9ee61bddbc0f1258..84ffd28332e9b5b02a1cafed7d83f82e9249cff3 100644 (file)
@@ -614,8 +614,10 @@ int lttng_event_notifier_enable(struct lttng_event_notifier *event_notifier)
        case LTTNG_KERNEL_TRACEPOINT:
                ret = -EINVAL;
                break;
-       case LTTNG_KERNEL_SYSCALL:
        case LTTNG_KERNEL_KPROBE:
+               WRITE_ONCE(event_notifier->enabled, 1);
+               break;
+       case LTTNG_KERNEL_SYSCALL:
        case LTTNG_KERNEL_FUNCTION:
        case LTTNG_KERNEL_UPROBE:
        case LTTNG_KERNEL_NOOP:
@@ -642,8 +644,10 @@ int lttng_event_notifier_disable(struct lttng_event_notifier *event_notifier)
        case LTTNG_KERNEL_TRACEPOINT:
                ret = -EINVAL;
                break;
-       case LTTNG_KERNEL_SYSCALL:
        case LTTNG_KERNEL_KPROBE:
+               WRITE_ONCE(event_notifier->enabled, 0);
+               break;
+       case LTTNG_KERNEL_SYSCALL:
        case LTTNG_KERNEL_FUNCTION:
        case LTTNG_KERNEL_UPROBE:
        case LTTNG_KERNEL_NOOP:
@@ -1004,6 +1008,8 @@ struct lttng_event_notifier *_lttng_event_notifier_create(
                event_name = event_desc->name;
                break;
        case LTTNG_KERNEL_KPROBE:
+               event_name = event_notifier_param->event.name;
+               break;
        case LTTNG_KERNEL_UPROBE:
        case LTTNG_KERNEL_KRETPROBE:
        case LTTNG_KERNEL_FUNCTION:
@@ -1057,6 +1063,29 @@ struct lttng_event_notifier *_lttng_event_notifier_create(
                smp_wmb();
                break;
        case LTTNG_KERNEL_KPROBE:
+               /*
+                * Needs to be explicitly enabled after creation, since
+                * we may want to apply filters.
+                */
+               event_notifier->enabled = 0;
+               event_notifier->registered = 1;
+               /*
+                * Populate lttng_event_notifier structure before event
+                * registration.
+                */
+               smp_wmb();
+               ret = lttng_kprobes_register_event_notifier(
+                               event_notifier_param->event.u.kprobe.symbol_name,
+                               event_notifier_param->event.u.kprobe.offset,
+                               event_notifier_param->event.u.kprobe.addr,
+                               event_notifier);
+               if (ret) {
+                       ret = -EINVAL;
+                       goto register_error;
+               }
+               ret = try_module_get(event_notifier->desc->owner);
+               WARN_ON_ONCE(!ret);
+               break;
        case LTTNG_KERNEL_UPROBE:
        case LTTNG_KERNEL_KRETPROBE:
        case LTTNG_KERNEL_FUNCTION:
@@ -1206,8 +1235,10 @@ void register_event_notifier(struct lttng_event_notifier *event_notifier)
                                                  desc->event_notifier_callback,
                                                  event_notifier);
                break;
-       case LTTNG_KERNEL_SYSCALL:
        case LTTNG_KERNEL_KPROBE:
+               ret = 0;
+               break;
+       case LTTNG_KERNEL_SYSCALL:
        case LTTNG_KERNEL_UPROBE:
        case LTTNG_KERNEL_KRETPROBE:
        case LTTNG_KERNEL_FUNCTION:
@@ -1237,6 +1268,9 @@ int _lttng_event_notifier_unregister(
                                                  event_notifier);
                break;
        case LTTNG_KERNEL_KPROBE:
+               lttng_kprobes_unregister_event_notifier(event_notifier);
+               ret = 0;
+               break;
        case LTTNG_KERNEL_KRETPROBE:
        case LTTNG_KERNEL_FUNCTION:
        case LTTNG_KERNEL_SYSCALL:
@@ -1295,6 +1329,9 @@ void _lttng_event_notifier_destroy(struct lttng_event_notifier *event_notifier)
                lttng_event_desc_put(event_notifier->desc);
                break;
        case LTTNG_KERNEL_KPROBE:
+               module_put(event_notifier->desc->owner);
+               lttng_kprobes_destroy_event_notifier_private(event_notifier);
+               break;
        case LTTNG_KERNEL_KRETPROBE:
        case LTTNG_KERNEL_FUNCTION:
        case LTTNG_KERNEL_NOOP:
This page took 0.02506 seconds and 5 git commands to generate.