mutex_lock(&sessions_mutex);
WRITE_ONCE(session->active, 0);
list_for_each_entry(chan, &session->chan, list) {
- ret = lttng_syscalls_unregister(chan);
+ ret = lttng_syscalls_unregister_event(chan);
WARN_ON(ret);
}
list_for_each_entry(event, &session->events, list) {
}
synchronize_trace(); /* Wait for in-flight events to complete */
list_for_each_entry(chan, &session->chan, list) {
- ret = lttng_syscalls_destroy(chan);
+ ret = lttng_syscalls_destroy_event(chan);
WARN_ON(ret);
}
list_for_each_entry_safe(event_enabler, tmp_event_enabler,
ret = -EINVAL;
break;
case LTTNG_KERNEL_KPROBE:
+ case LTTNG_KERNEL_UPROBE:
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_KRETPROBE:
default:
ret = -EINVAL;
break;
case LTTNG_KERNEL_KPROBE:
+ case LTTNG_KERNEL_UPROBE:
WRITE_ONCE(event_notifier->enabled, 0);
break;
case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_FUNCTION:
- case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_NOOP:
case LTTNG_KERNEL_KRETPROBE:
default:
event_name = event_desc->name;
break;
case LTTNG_KERNEL_KPROBE:
+ case LTTNG_KERNEL_UPROBE:
event_name = event_notifier_param->event.name;
break;
- case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
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:
event);
break;
case LTTNG_KERNEL_SYSCALL:
- ret = lttng_syscall_filter_enable(event->chan, event);
+ ret = lttng_syscall_filter_enable_event(event->chan, event);
break;
case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_UPROBE:
ret = 0;
break;
case LTTNG_KERNEL_SYSCALL:
- ret = lttng_syscall_filter_disable(event->chan, event);
+ ret = lttng_syscall_filter_disable_event(event->chan, event);
break;
case LTTNG_KERNEL_NOOP:
ret = 0;
event_notifier);
break;
case LTTNG_KERNEL_KPROBE:
+ case LTTNG_KERNEL_UPROBE:
ret = 0;
break;
case LTTNG_KERNEL_SYSCALL:
- case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
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);
}
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);
}
{
int ret;
- ret = lttng_syscalls_register(event_enabler->chan, NULL);
+ ret = lttng_syscalls_register_event(event_enabler->chan, NULL);
WARN_ON_ONCE(ret);
}
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)