X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flttng-events.c;h=41fea8500c550b63634237b0569a63dc192f46a9;hb=2d6d88c64dad61235a5693bcf4854765ec62d095;hp=41bbd7098ddae75f57c7df7a9ee61bddbc0f1258;hpb=8bf17deb525927d1191c59a1765d5b11b37c4320;p=deliverable%2Flttng-modules.git diff --git a/src/lttng-events.c b/src/lttng-events.c index 41bbd709..41fea850 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -280,7 +280,7 @@ void lttng_session_destroy(struct lttng_session *session) 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) { @@ -289,7 +289,7 @@ void lttng_session_destroy(struct lttng_session *session) } 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, @@ -614,10 +614,12 @@ 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: - 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: @@ -642,10 +644,12 @@ 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: - 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: @@ -954,7 +958,7 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, */ 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) @@ -1005,6 +1009,8 @@ struct lttng_event_notifier *_lttng_event_notifier_create( 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: @@ -1057,7 +1063,52 @@ 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: + /* + * 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: @@ -1128,7 +1179,7 @@ void register_event(struct lttng_event *event) 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: @@ -1171,13 +1222,13 @@ int _lttng_event_unregister(struct lttng_event *event) 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; break; case LTTNG_KERNEL_UPROBE: - lttng_uprobes_unregister(event); + lttng_uprobes_unregister_event(event); ret = 0; break; case LTTNG_KERNEL_FUNCTION: /* Fall-through */ @@ -1206,9 +1257,11 @@ 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: case LTTNG_KERNEL_UPROBE: + ret = 0; + break; + case LTTNG_KERNEL_SYSCALL: case LTTNG_KERNEL_KRETPROBE: case LTTNG_KERNEL_FUNCTION: case LTTNG_KERNEL_NOOP: @@ -1237,11 +1290,17 @@ 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_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); } @@ -1273,7 +1332,7 @@ void _lttng_event_destroy(struct lttng_event *event) 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: @@ -1295,11 +1354,17 @@ 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_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); } @@ -1832,7 +1897,7 @@ void lttng_create_syscall_event_if_missing(struct lttng_event_enabler *event_ena { int ret; - ret = lttng_syscalls_register(event_enabler->chan, NULL); + ret = lttng_syscalls_register_event(event_enabler->chan, NULL); WARN_ON_ONCE(ret); } @@ -2126,7 +2191,7 @@ int lttng_event_add_callsite(struct lttng_event *event, 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; } @@ -2233,6 +2298,19 @@ error: 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)