X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-events.c;h=c956db54a194c3bf0493b43edd3055bfb61379a7;hb=e2d5dbc7d09c7aa4f7c391fcdd4dfc95ba1ed326;hp=3000e856f56e9634cf985e84afe9db2c2fb7a1d1;hpb=a67ba386d82d85c6b6ca56c249a13ab5a1f34b08;p=lttng-modules.git diff --git a/src/lttng-events.c b/src/lttng-events.c index 3000e856..c956db54 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -69,8 +69,7 @@ static void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enable static void lttng_event_notifier_enabler_destroy(struct lttng_event_notifier_enabler *event_notifier_enabler); static void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group); -static void _lttng_event_destroy(struct lttng_kernel_event_recorder *event); -static void _lttng_event_notifier_destroy(struct lttng_kernel_event_notifier *event_notifier); +static void _lttng_event_destroy(struct lttng_kernel_event_common *event); static void _lttng_channel_destroy(struct lttng_channel *chan); static int _lttng_event_unregister(struct lttng_kernel_event_recorder *event); static int _lttng_event_notifier_unregister(struct lttng_kernel_event_notifier *event_notifier); @@ -357,7 +356,7 @@ void lttng_session_destroy(struct lttng_session *session) &session->enablers_head, node) lttng_event_enabler_destroy(event_enabler); list_for_each_entry_safe(event_recorder_priv, tmpevent_recorder_priv, &session->events, node) - _lttng_event_destroy(event_recorder_priv->pub); + _lttng_event_destroy(&event_recorder_priv->pub->parent); list_for_each_entry_safe(chan, tmpchan, &session->chan, list) { BUG_ON(chan->channel_type == METADATA_CHANNEL); _lttng_channel_destroy(chan); @@ -412,7 +411,7 @@ void lttng_event_notifier_group_destroy( list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv, &event_notifier_group->event_notifiers_head, node) - _lttng_event_notifier_destroy(event_notifier_priv->pub); + _lttng_event_destroy(&event_notifier_priv->pub->parent); if (event_notifier_group->error_counter) { struct lttng_counter *error_counter = event_notifier_group->error_counter; @@ -630,7 +629,7 @@ int lttng_event_enable(struct lttng_kernel_event_recorder *event_recorder) break; case LTTNG_KERNEL_ABI_KRETPROBE: - ret = lttng_kretprobes_event_enable_state(event_recorder, 1); + ret = lttng_kretprobes_event_enable_state(&event_recorder->parent, 1); break; case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ @@ -671,7 +670,7 @@ int lttng_event_disable(struct lttng_kernel_event_recorder *event_recorder) case LTTNG_KERNEL_ABI_KRETPROBE: - ret = lttng_kretprobes_event_enable_state(event_recorder, 0); + ret = lttng_kretprobes_event_enable_state(&event_recorder->parent, 0); break; case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ @@ -1498,7 +1497,7 @@ void register_event_notifier(struct lttng_kernel_event_notifier *event_notifier) switch (event_notifier->priv->parent.instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: ret = lttng_wrapper_tracepoint_probe_register(desc->event_kname, - desc->event_notifier_callback, + desc->probe_callback, event_notifier); break; @@ -1535,7 +1534,7 @@ int _lttng_event_notifier_unregister( switch (event_notifier->priv->parent.instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: ret = lttng_wrapper_tracepoint_probe_unregister(event_notifier->priv->parent.desc->event_kname, - event_notifier->priv->parent.desc->event_notifier_callback, + event_notifier->priv->parent.desc->probe_callback, event_notifier); break; @@ -1568,89 +1567,93 @@ int _lttng_event_notifier_unregister( * Only used internally at session destruction. */ static -void _lttng_event_destroy(struct lttng_kernel_event_recorder *event_recorder) +void _lttng_event_destroy(struct lttng_kernel_event_common *event) { - struct lttng_kernel_event_common_private *event_priv = &event_recorder->priv->parent; + struct lttng_kernel_event_common_private *event_priv = event->priv; struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref; - switch (event_priv->instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: - lttng_event_desc_put(event_priv->desc); - break; + lttng_free_event_filter_runtime(event); + /* Free event enabler refs */ + list_for_each_entry_safe(enabler_ref, tmp_enabler_ref, + &event_priv->enablers_ref_head, node) + kfree(enabler_ref); - case LTTNG_KERNEL_ABI_KPROBE: - module_put(event_priv->desc->owner); - lttng_kprobes_destroy_event_private(event_recorder); - break; + switch (event->type) { + case LTTNG_KERNEL_EVENT_TYPE_RECORDER: + { + struct lttng_kernel_event_recorder *event_recorder = + container_of(event, struct lttng_kernel_event_recorder, parent); - case LTTNG_KERNEL_ABI_KRETPROBE: - module_put(event_priv->desc->owner); - lttng_kretprobes_destroy_private(event_recorder); - break; + switch (event_priv->instrumentation) { + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_event_desc_put(event_priv->desc); + break; - case LTTNG_KERNEL_ABI_SYSCALL: - break; + case LTTNG_KERNEL_ABI_KPROBE: + module_put(event_priv->desc->owner); + lttng_kprobes_destroy_event_private(event_recorder); + break; - case LTTNG_KERNEL_ABI_UPROBE: - module_put(event_priv->desc->owner); - lttng_uprobes_destroy_event_private(event_recorder); - break; + case LTTNG_KERNEL_ABI_KRETPROBE: + module_put(event_priv->desc->owner); + lttng_kretprobes_destroy_private(event_recorder); + break; - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ - default: - WARN_ON_ONCE(1); - } - list_del(&event_recorder->priv->node); - lttng_free_event_filter_runtime(event_recorder); - /* Free event enabler refs */ - list_for_each_entry_safe(enabler_ref, tmp_enabler_ref, - &event_priv->enablers_ref_head, node) - kfree(enabler_ref); - kmem_cache_free(event_recorder_private_cache, event_recorder->priv); - kmem_cache_free(event_recorder_cache, event_recorder); -} + case LTTNG_KERNEL_ABI_SYSCALL: + break; -/* - * Only used internally at session destruction. - */ -static -void _lttng_event_notifier_destroy(struct lttng_kernel_event_notifier *event_notifier) -{ - struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref; + case LTTNG_KERNEL_ABI_UPROBE: + module_put(event_priv->desc->owner); + lttng_uprobes_destroy_event_private(event_recorder); + break; - switch (event_notifier->priv->parent.instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: - lttng_event_desc_put(event_notifier->priv->parent.desc); + case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + default: + WARN_ON_ONCE(1); + } + list_del(&event_recorder->priv->node); + kmem_cache_free(event_recorder_private_cache, event_recorder->priv); + kmem_cache_free(event_recorder_cache, event_recorder); break; + } + case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER: + { + struct lttng_kernel_event_notifier *event_notifier = + container_of(event, struct lttng_kernel_event_notifier, parent); - case LTTNG_KERNEL_ABI_KPROBE: - module_put(event_notifier->priv->parent.desc->owner); - lttng_kprobes_destroy_event_notifier_private(event_notifier); - break; + switch (event_notifier->priv->parent.instrumentation) { + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_event_desc_put(event_notifier->priv->parent.desc); + break; - case LTTNG_KERNEL_ABI_SYSCALL: - break; + case LTTNG_KERNEL_ABI_KPROBE: + module_put(event_notifier->priv->parent.desc->owner); + lttng_kprobes_destroy_event_notifier_private(event_notifier); + break; - case LTTNG_KERNEL_ABI_UPROBE: - module_put(event_notifier->priv->parent.desc->owner); - lttng_uprobes_destroy_event_notifier_private(event_notifier); - break; + case LTTNG_KERNEL_ABI_SYSCALL: + break; - case LTTNG_KERNEL_ABI_KRETPROBE: /* Fall-through */ - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + case LTTNG_KERNEL_ABI_UPROBE: + module_put(event_notifier->priv->parent.desc->owner); + lttng_uprobes_destroy_event_notifier_private(event_notifier); + break; + + case LTTNG_KERNEL_ABI_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + default: + WARN_ON_ONCE(1); + } + list_del(&event_notifier->priv->node); + kmem_cache_free(event_notifier_private_cache, event_notifier->priv); + kmem_cache_free(event_notifier_cache, event_notifier); + break; + } default: WARN_ON_ONCE(1); } - list_del(&event_notifier->priv->node); - lttng_free_event_notifier_filter_runtime(event_notifier); - /* Free event enabler refs */ - list_for_each_entry_safe(enabler_ref, tmp_enabler_ref, - &event_notifier->priv->parent.enablers_ref_head, node) - kfree(enabler_ref); - kmem_cache_free(event_notifier_private_cache, event_notifier->priv); - kmem_cache_free(event_notifier_cache, event_notifier); } struct lttng_id_tracker *get_tracker(struct lttng_session *session, @@ -2515,13 +2518,13 @@ error: return ret; } -int lttng_event_add_callsite(struct lttng_kernel_event_recorder *event_recorder, +int lttng_event_add_callsite(struct lttng_kernel_event_common *event, struct lttng_kernel_abi_event_callsite __user *callsite) { - switch (event_recorder->priv->parent.instrumentation) { + switch (event->priv->instrumentation) { case LTTNG_KERNEL_ABI_UPROBE: - return lttng_uprobes_event_add_callsite(event_recorder, callsite); + return lttng_uprobes_event_add_callsite(event, callsite); default: return -EINVAL; } @@ -2663,19 +2666,6 @@ end: return ret; } -int lttng_event_notifier_add_callsite(struct lttng_kernel_event_notifier *event_notifier, - struct lttng_kernel_abi_event_callsite __user *callsite) -{ - - switch (event_notifier->priv->parent.instrumentation) { - case LTTNG_KERNEL_ABI_UPROBE: - return lttng_uprobes_event_notifier_add_callsite(event_notifier, - callsite); - default: - return -EINVAL; - } -} - static void lttng_event_notifier_enabler_destroy( struct lttng_event_notifier_enabler *event_notifier_enabler) @@ -2712,7 +2702,8 @@ void lttng_session_sync_event_enablers(struct lttng_session *session) struct lttng_kernel_event_recorder *event_recorder = event_recorder_priv->pub; struct lttng_enabler_ref *enabler_ref; struct lttng_bytecode_runtime *runtime; - int enabled = 0, has_enablers_without_bytecode = 0; + int enabled = 0, has_enablers_without_filter_bytecode = 0; + int nr_filters = 0; switch (event_recorder_priv->parent.instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ @@ -2754,17 +2745,21 @@ void lttng_session_sync_event_enablers(struct lttng_session *session) &event_recorder_priv->parent.enablers_ref_head, node) { if (enabler_ref->ref->enabled && list_empty(&enabler_ref->ref->filter_bytecode_head)) { - has_enablers_without_bytecode = 1; + has_enablers_without_filter_bytecode = 1; break; } } event_recorder_priv->parent.has_enablers_without_filter_bytecode = - has_enablers_without_bytecode; + has_enablers_without_filter_bytecode; /* Enable filters */ list_for_each_entry(runtime, - &event_recorder_priv->parent.filter_bytecode_runtime_head, node) + &event_recorder_priv->parent.filter_bytecode_runtime_head, node) { lttng_bytecode_filter_sync_state(runtime); + nr_filters++; + } + WRITE_ONCE(event_recorder_priv->parent.pub->eval_filter, + !(has_enablers_without_filter_bytecode || !nr_filters)); } } @@ -2801,7 +2796,8 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group struct lttng_kernel_event_notifier *event_notifier = event_notifier_priv->pub; struct lttng_enabler_ref *enabler_ref; struct lttng_bytecode_runtime *runtime; - int enabled = 0, has_enablers_without_bytecode = 0; + int enabled = 0, has_enablers_without_filter_bytecode = 0; + int nr_filters = 0, nr_captures = 0; switch (event_notifier_priv->parent.instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ @@ -2839,24 +2835,29 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group &event_notifier_priv->parent.enablers_ref_head, node) { if (enabler_ref->ref->enabled && list_empty(&enabler_ref->ref->filter_bytecode_head)) { - has_enablers_without_bytecode = 1; + has_enablers_without_filter_bytecode = 1; break; } } event_notifier_priv->parent.has_enablers_without_filter_bytecode = - has_enablers_without_bytecode; + has_enablers_without_filter_bytecode; /* Enable filters */ list_for_each_entry(runtime, - &event_notifier_priv->parent.filter_bytecode_runtime_head, node) + &event_notifier_priv->parent.filter_bytecode_runtime_head, node) { lttng_bytecode_filter_sync_state(runtime); + nr_filters++; + } + WRITE_ONCE(event_notifier_priv->parent.pub->eval_filter, + !(has_enablers_without_filter_bytecode || !nr_filters)); /* Enable captures */ list_for_each_entry(runtime, - &event_notifier_priv->capture_bytecode_runtime_head, node) + &event_notifier_priv->capture_bytecode_runtime_head, node) { lttng_bytecode_capture_sync_state(runtime); - - WRITE_ONCE(event_notifier->eval_capture, !!event_notifier_priv->num_captures); + nr_captures++; + } + WRITE_ONCE(event_notifier->eval_capture, !!nr_captures); } }