case LTTNG_KERNEL_TRACEPOINT:
ret = -EINVAL;
break;
- case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_KPROBE:
- case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_UPROBE:
+ WRITE_ONCE(event_notifier->enabled, 1);
+ break;
+ case LTTNG_KERNEL_SYSCALL:
+ case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
case LTTNG_KERNEL_KRETPROBE:
default:
case LTTNG_KERNEL_TRACEPOINT:
ret = -EINVAL;
break;
- case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_KPROBE:
- case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_UPROBE:
+ WRITE_ONCE(event_notifier->enabled, 0);
+ break;
+ case LTTNG_KERNEL_SYSCALL:
+ case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
case LTTNG_KERNEL_KRETPROBE:
default:
*/
smp_wmb();
- ret = lttng_uprobes_register(event_param->name,
+ ret = lttng_uprobes_register_event(event_param->name,
event_param->u.uprobe.fd,
event);
if (ret)
break;
case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_UPROBE:
+ event_name = event_notifier_param->event.name;
+ break;
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
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:
+ /*
+ * 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_notifier registration.
+ */
+ smp_wmb();
+
+ ret = lttng_uprobes_register_event_notifier(
+ event_notifier_param->event.name,
+ event_notifier_param->event.u.uprobe.fd,
+ event_notifier);
+ if (ret)
+ goto register_error;
+ ret = try_module_get(event_notifier->desc->owner);
+ WARN_ON_ONCE(!ret);
+ break;
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
ret = 0;
break;
case LTTNG_KERNEL_UPROBE:
- lttng_uprobes_unregister(event);
+ lttng_uprobes_unregister_event(event);
ret = 0;
break;
case LTTNG_KERNEL_FUNCTION: /* Fall-through */
desc->event_notifier_callback,
event_notifier);
break;
- case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_UPROBE:
+ ret = 0;
+ break;
+ case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
event_notifier);
break;
case LTTNG_KERNEL_KPROBE:
+ lttng_kprobes_unregister_event_notifier(event_notifier);
+ ret = 0;
+ break;
+ case LTTNG_KERNEL_UPROBE:
+ lttng_uprobes_unregister_event_notifier(event_notifier);
+ ret = 0;
+ break;
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_NOOP:
- case LTTNG_KERNEL_UPROBE:
default:
WARN_ON_ONCE(1);
}
break;
case LTTNG_KERNEL_UPROBE:
module_put(event->desc->owner);
- lttng_uprobes_destroy_private(event);
+ lttng_uprobes_destroy_event_private(event);
break;
case LTTNG_KERNEL_FUNCTION: /* Fall-through */
default:
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_UPROBE:
+ module_put(event_notifier->desc->owner);
+ lttng_uprobes_destroy_event_notifier_private(event_notifier);
+ break;
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
case LTTNG_KERNEL_SYSCALL:
- case LTTNG_KERNEL_UPROBE:
default:
WARN_ON_ONCE(1);
}
switch (event->instrumentation) {
case LTTNG_KERNEL_UPROBE:
- return lttng_uprobes_add_callsite(event, callsite);
+ return lttng_uprobes_event_add_callsite(event, callsite);
default:
return -EINVAL;
}
return ret;
}
+int lttng_event_notifier_add_callsite(struct lttng_event_notifier *event_notifier,
+ struct lttng_kernel_event_callsite __user *callsite)
+{
+
+ switch (event_notifier->instrumentation) {
+ case LTTNG_KERNEL_UPROBE:
+ return lttng_uprobes_event_notifier_add_callsite(event_notifier,
+ callsite);
+ default:
+ return -EINVAL;
+ }
+}
+
int lttng_event_notifier_enabler_attach_context(
struct lttng_event_notifier_enabler *event_notifier_enabler,
struct lttng_kernel_context *context_param)