X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Flttng-events.c;h=944d4fb2dafc06ba2de44d813cc13c9636d86656;hb=b4a7570837f5cc3e8df56e51b4e8bfb9f95496d3;hp=3569be68d1151077182b60b996905538b9f10cea;hpb=966ad25338569b3afbc1e900ec791eba54c67c9b;p=lttng-modules.git diff --git a/src/lttng-events.c b/src/lttng-events.c index 3569be68..944d4fb2 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -614,19 +614,22 @@ int lttng_event_enable(struct lttng_event *event) goto end; } switch (event->instrumentation) { - case LTTNG_KERNEL_TRACEPOINT: + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: ret = -EINVAL; break; - case LTTNG_KERNEL_KPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ case LTTNG_KERNEL_UPROBE: - case LTTNG_KERNEL_NOOP: WRITE_ONCE(event->enabled, 1); break; + case LTTNG_KERNEL_KRETPROBE: ret = lttng_kretprobes_event_enable_state(event, 1); break; - case LTTNG_KERNEL_FUNCTION: /* Fall-through. */ + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -650,19 +653,23 @@ int lttng_event_disable(struct lttng_event *event) goto end; } switch (event->instrumentation) { - case LTTNG_KERNEL_TRACEPOINT: + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: ret = -EINVAL; break; - case LTTNG_KERNEL_KPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ case LTTNG_KERNEL_UPROBE: - case LTTNG_KERNEL_NOOP: WRITE_ONCE(event->enabled, 0); break; + case LTTNG_KERNEL_KRETPROBE: + ret = lttng_kretprobes_event_enable_state(event, 0); break; - case LTTNG_KERNEL_FUNCTION: /* Fall-through. */ + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -682,17 +689,19 @@ int lttng_event_notifier_enable(struct lttng_event_notifier *event_notifier) goto end; } switch (event_notifier->instrumentation) { - case LTTNG_KERNEL_TRACEPOINT: + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: ret = -EINVAL; break; - case LTTNG_KERNEL_KPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ case LTTNG_KERNEL_UPROBE: WRITE_ONCE(event_notifier->enabled, 1); break; - case LTTNG_KERNEL_FUNCTION: - case LTTNG_KERNEL_NOOP: - case LTTNG_KERNEL_KRETPROBE: + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -712,17 +721,19 @@ int lttng_event_notifier_disable(struct lttng_event_notifier *event_notifier) goto end; } switch (event_notifier->instrumentation) { - case LTTNG_KERNEL_TRACEPOINT: + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: ret = -EINVAL; break; - case LTTNG_KERNEL_KPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ case LTTNG_KERNEL_UPROBE: WRITE_ONCE(event_notifier->enabled, 0); break; - case LTTNG_KERNEL_FUNCTION: - case LTTNG_KERNEL_NOOP: - case LTTNG_KERNEL_KRETPROBE: + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -850,14 +861,16 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, case LTTNG_KERNEL_TRACEPOINT: event_name = event_desc->name; break; - case LTTNG_KERNEL_KPROBE: - case LTTNG_KERNEL_UPROBE: - case LTTNG_KERNEL_KRETPROBE: - case LTTNG_KERNEL_NOOP: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ + case LTTNG_KERNEL_UPROBE: /* Fall-through */ + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: event_name = event_param->name; break; - case LTTNG_KERNEL_FUNCTION: /* Fall-through. */ + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -902,6 +915,7 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, /* Populate lttng_event structure before event registration. */ smp_wmb(); break; + case LTTNG_KERNEL_KPROBE: /* * Needs to be explicitly enabled after creation, since @@ -926,6 +940,7 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, ret = try_module_get(event->desc->owner); WARN_ON_ONCE(!ret); break; + case LTTNG_KERNEL_KRETPROBE: { struct lttng_event *event_return; @@ -949,6 +964,8 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, event_return->enabled = 0; event_return->registered = 1; event_return->instrumentation = itype; + INIT_LIST_HEAD(&event_return->filter_bytecode_runtime_head); + INIT_LIST_HEAD(&event_return->enablers_ref_head); /* * Populate lttng_event structure before kretprobe registration. */ @@ -980,7 +997,7 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, list_add(&event_return->list, &chan->session->events); break; } - case LTTNG_KERNEL_NOOP: + case LTTNG_KERNEL_SYSCALL: /* * Needs to be explicitly enabled after creation, since @@ -1016,6 +1033,7 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, goto register_error; } break; + case LTTNG_KERNEL_UPROBE: /* * Needs to be explicitly enabled after creation, since @@ -1038,7 +1056,9 @@ struct lttng_event *_lttng_event_create(struct lttng_channel *chan, ret = try_module_get(event->desc->owner); WARN_ON_ONCE(!ret); break; + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -1081,14 +1101,16 @@ struct lttng_event_notifier *_lttng_event_notifier_create( case LTTNG_KERNEL_TRACEPOINT: event_name = event_desc->name; break; - case LTTNG_KERNEL_KPROBE: - case LTTNG_KERNEL_UPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ + case LTTNG_KERNEL_UPROBE: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: event_name = event_notifier_param->event.name; break; - case LTTNG_KERNEL_KRETPROBE: - case LTTNG_KERNEL_FUNCTION: - case LTTNG_KERNEL_NOOP: + + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -1139,6 +1161,7 @@ struct lttng_event_notifier *_lttng_event_notifier_create( /* Populate lttng_event_notifier structure before event registration. */ smp_wmb(); break; + case LTTNG_KERNEL_KPROBE: /* * Needs to be explicitly enabled after creation, since @@ -1163,7 +1186,7 @@ struct lttng_event_notifier *_lttng_event_notifier_create( ret = try_module_get(event_notifier->desc->owner); WARN_ON_ONCE(!ret); break; - case LTTNG_KERNEL_NOOP: + case LTTNG_KERNEL_SYSCALL: /* * Needs to be explicitly enabled after creation, since @@ -1200,6 +1223,7 @@ struct lttng_event_notifier *_lttng_event_notifier_create( goto register_error; } break; + case LTTNG_KERNEL_UPROBE: /* * Needs to be explicitly enabled after creation, since @@ -1223,8 +1247,10 @@ struct lttng_event_notifier *_lttng_event_notifier_create( ret = try_module_get(event_notifier->desc->owner); WARN_ON_ONCE(!ret); break; - case LTTNG_KERNEL_KRETPROBE: - case LTTNG_KERNEL_FUNCTION: + + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -1344,16 +1370,19 @@ void register_event(struct lttng_event *event) desc->probe_callback, event); break; + case LTTNG_KERNEL_SYSCALL: ret = lttng_syscall_filter_enable_event(event->chan, event); break; - case LTTNG_KERNEL_KPROBE: - case LTTNG_KERNEL_UPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ + case LTTNG_KERNEL_UPROBE: /* Fall-through */ case LTTNG_KERNEL_KRETPROBE: - case LTTNG_KERNEL_NOOP: ret = 0; break; + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); } @@ -1379,24 +1408,30 @@ int _lttng_event_unregister(struct lttng_event *event) event->desc->probe_callback, event); break; + case LTTNG_KERNEL_KPROBE: lttng_kprobes_unregister_event(event); ret = 0; break; + case LTTNG_KERNEL_KRETPROBE: lttng_kretprobes_unregister(event); ret = 0; break; + case LTTNG_KERNEL_SYSCALL: 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(event); ret = 0; break; + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ default: WARN_ON_ONCE(1); @@ -1423,16 +1458,19 @@ void register_event_notifier(struct lttng_event_notifier *event_notifier) desc->event_notifier_callback, event_notifier); break; + case LTTNG_KERNEL_SYSCALL: ret = lttng_syscall_filter_enable_event_notifier(event_notifier); break; - case LTTNG_KERNEL_KPROBE: + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ case LTTNG_KERNEL_UPROBE: ret = 0; break; - case LTTNG_KERNEL_KRETPROBE: - case LTTNG_KERNEL_FUNCTION: - case LTTNG_KERNEL_NOOP: + + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); } @@ -1457,20 +1495,24 @@ int _lttng_event_notifier_unregister( event_notifier->desc->event_notifier_callback, 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_SYSCALL: ret = lttng_syscall_filter_disable_event_notifier(event_notifier); break; - case LTTNG_KERNEL_KRETPROBE: - case LTTNG_KERNEL_FUNCTION: - case LTTNG_KERNEL_NOOP: + + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); } @@ -1491,22 +1533,27 @@ void _lttng_event_destroy(struct lttng_event *event) case LTTNG_KERNEL_TRACEPOINT: lttng_event_desc_put(event->desc); break; + case LTTNG_KERNEL_KPROBE: module_put(event->desc->owner); lttng_kprobes_destroy_event_private(event); break; + case LTTNG_KERNEL_KRETPROBE: module_put(event->desc->owner); lttng_kretprobes_destroy_private(event); break; - case LTTNG_KERNEL_NOOP: + case LTTNG_KERNEL_SYSCALL: break; + case LTTNG_KERNEL_UPROBE: module_put(event->desc->owner); lttng_uprobes_destroy_event_private(event); break; + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); } @@ -1526,27 +1573,38 @@ void _lttng_event_destroy(struct lttng_event *event) static void _lttng_event_notifier_destroy(struct lttng_event_notifier *event_notifier) { + struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref; + switch (event_notifier->instrumentation) { case LTTNG_KERNEL_TRACEPOINT: 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_NOOP: + case LTTNG_KERNEL_SYSCALL: 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_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: WARN_ON_ONCE(1); } list_del(&event_notifier->list); + lttng_free_event_notifier_filter_runtime(event_notifier); + /* Free event enabler refs */ + list_for_each_entry_safe(enabler_ref, tmp_enabler_ref, + &event_notifier->enablers_ref_head, node) + kfree(enabler_ref); kmem_cache_free(event_notifier_cache, event_notifier); } @@ -1844,6 +1902,7 @@ int lttng_desc_match_enabler(const struct lttng_event_desc *desc, return -EINVAL; } break; + case LTTNG_KERNEL_SYSCALL: desc_name = desc->name; if (!strncmp(desc_name, "compat_", strlen("compat_"))) { @@ -1906,6 +1965,7 @@ int lttng_desc_match_enabler(const struct lttng_event_desc *desc, return -EINVAL; } break; + default: WARN_ON_ONCE(1); return -EINVAL; @@ -2102,9 +2162,11 @@ void lttng_create_event_if_missing(struct lttng_event_enabler *event_enabler) case LTTNG_KERNEL_TRACEPOINT: lttng_create_tracepoint_event_if_missing(event_enabler); break; + case LTTNG_KERNEL_SYSCALL: lttng_create_syscall_event_if_missing(event_enabler); break; + default: WARN_ON_ONCE(1); break; @@ -2187,9 +2249,11 @@ void lttng_create_event_notifier_if_missing(struct lttng_event_notifier_enabler case LTTNG_KERNEL_TRACEPOINT: lttng_create_tracepoint_event_notifier_if_missing(event_notifier_enabler); break; + case LTTNG_KERNEL_SYSCALL: lttng_create_syscall_event_notifier_if_missing(event_notifier_enabler); break; + default: WARN_ON_ONCE(1); break; @@ -2622,7 +2686,7 @@ void lttng_session_sync_event_enablers(struct lttng_session *session) int enabled = 0, has_enablers_without_bytecode = 0; switch (event->instrumentation) { - case LTTNG_KERNEL_TRACEPOINT: + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: /* Enable events */ list_for_each_entry(enabler_ref, @@ -2633,6 +2697,7 @@ void lttng_session_sync_event_enablers(struct lttng_session *session) } } break; + default: /* Not handled with lazy sync. */ continue; @@ -2709,7 +2774,7 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group int enabled = 0, has_enablers_without_bytecode = 0; switch (event_notifier->instrumentation) { - case LTTNG_KERNEL_TRACEPOINT: + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL: /* Enable event_notifiers */ list_for_each_entry(enabler_ref, @@ -2720,6 +2785,7 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group } } break; + default: /* Not handled with sync. */ continue; @@ -2759,6 +2825,8 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group list_for_each_entry(runtime, &event_notifier->capture_bytecode_runtime_head, node) lttng_bytecode_capture_sync_state(runtime); + + WRITE_ONCE(event_notifier->eval_capture, !!event_notifier->num_captures); } }