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:
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:
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:
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:
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:
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:
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: