X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-events.c;h=7f7748dc54b2e0de50294dabac9577d6c6272fed;hb=f237aef8019a982e3577e64895e5b4ae5cb5a968;hp=6512dde8ce1fe2eb3b3f3c5b42e4a0ea5ff46d1d;hpb=83006ee0d75381816540c339e5dda7aba72fafa3;p=lttng-modules.git diff --git a/src/lttng-events.c b/src/lttng-events.c index 6512dde8..7f7748dc 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -362,7 +362,7 @@ void lttng_session_destroy(struct lttng_kernel_session *session) ret = lttng_syscalls_unregister_syscall_table(&chan_priv->parent.syscall_table); WARN_ON(ret); } - list_for_each_entry(event_recorder_priv, &session->priv->events, node) { + list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) { ret = _lttng_event_unregister(&event_recorder_priv->pub->parent); WARN_ON(ret); } @@ -374,7 +374,7 @@ void lttng_session_destroy(struct lttng_kernel_session *session) list_for_each_entry_safe(event_recorder_enabler, tmp_event_recorder_enabler, &session->priv->enablers_head, node) lttng_event_enabler_destroy(&event_recorder_enabler->parent); - list_for_each_entry_safe(event_recorder_priv, tmpevent_recorder_priv, &session->priv->events, node) + list_for_each_entry_safe(event_recorder_priv, tmpevent_recorder_priv, &session->priv->events, parent.node) _lttng_event_destroy(&event_recorder_priv->pub->parent); list_for_each_entry_safe(chan_priv, tmpchan_priv, &session->priv->chan, node) { BUG_ON(chan_priv->channel_type == METADATA_CHANNEL); @@ -413,7 +413,7 @@ void lttng_event_notifier_group_destroy( WARN_ON(ret); list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv, - &event_notifier_group->event_notifiers_head, node) { + &event_notifier_group->event_notifiers_head, parent.node) { ret = _lttng_event_unregister(&event_notifier_priv->pub->parent); WARN_ON(ret); } @@ -431,7 +431,7 @@ void lttng_event_notifier_group_destroy( lttng_event_enabler_destroy(&event_notifier_enabler->parent); list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv, - &event_notifier_group->event_notifiers_head, node) + &event_notifier_group->event_notifiers_head, parent.node) _lttng_event_destroy(&event_notifier_priv->pub->parent); if (event_notifier_group->error_counter) { @@ -567,7 +567,7 @@ int lttng_session_metadata_regenerate(struct lttng_kernel_session *session) chan_priv->metadata_dumped = 0; } - list_for_each_entry(event_recorder_priv, &session->priv->events, node) { + list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) { event_recorder_priv->metadata_dumped = 0; } @@ -1060,7 +1060,7 @@ struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct l module_put(event_recorder->priv->parent.desc->owner); goto statedump_error; } - list_add(&event_recorder_return->priv->node, &chan->parent.session->priv->events); + list_add(&event_recorder_return->priv->parent.node, &chan->parent.session->priv->events); break; } @@ -1138,7 +1138,7 @@ struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct l goto statedump_error; } hlist_add_head(&event_recorder->priv->parent.hlist_node, head); - list_add(&event_recorder->priv->node, &chan->parent.session->priv->events); + list_add(&event_recorder->priv->parent.node, &chan->parent.session->priv->events); return event_recorder; statedump_error: @@ -1348,7 +1348,7 @@ struct lttng_kernel_event_notifier *_lttng_kernel_event_notifier_create(struct l goto register_error; } - list_add(&event_notifier->priv->node, &event_notifier_group->event_notifiers_head); + list_add(&event_notifier->priv->parent.node, &event_notifier_group->event_notifiers_head); hlist_add_head(&event_notifier->priv->parent.hlist_node, head); /* @@ -1623,7 +1623,7 @@ void _lttng_event_destroy(struct lttng_kernel_event_common *event) default: WARN_ON_ONCE(1); } - list_del(&event_recorder->priv->node); + list_del(&event_recorder->priv->parent.node); kmem_cache_free(event_recorder_private_cache, event_recorder->priv); kmem_cache_free(event_recorder_cache, event_recorder); break; @@ -1660,7 +1660,7 @@ void _lttng_event_destroy(struct lttng_kernel_event_common *event) default: WARN_ON_ONCE(1); } - list_del(&event_notifier->priv->node); + list_del(&event_notifier->priv->parent.node); kmem_cache_free(event_notifier_private_cache, event_notifier->priv); kmem_cache_free(event_notifier_cache, event_notifier); break; @@ -1945,7 +1945,8 @@ int lttng_match_enabler_name(const char *desc_name, return 1; } -int lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc, +static +int lttng_desc_match_enabler_check(const struct lttng_kernel_event_desc *desc, struct lttng_event_enabler_common *enabler) { const char *desc_name, *enabler_name; @@ -2034,7 +2035,19 @@ int lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc, } } -static +bool lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc, + struct lttng_event_enabler_common *enabler) +{ + int ret; + + ret = lttng_desc_match_enabler_check(desc, enabler); + if (ret < 0) { + WARN_ON_ONCE(1); + return false; + } + return ret; +} + bool lttng_event_enabler_match_event(struct lttng_event_enabler_common *event_enabler, struct lttng_kernel_event_common *event) { @@ -2075,7 +2088,6 @@ bool lttng_event_enabler_match_event(struct lttng_event_enabler_common *event_en } } -static bool lttng_event_enabler_desc_match_event(struct lttng_event_enabler_common *event_enabler, const struct lttng_kernel_event_desc *desc, struct lttng_kernel_event_common *event) @@ -2131,13 +2143,13 @@ struct lttng_enabler_ref *lttng_enabler_ref( } static -void lttng_create_tracepoint_event_if_missing(struct lttng_event_recorder_enabler *event_enabler) +void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler_common *event_enabler) { - struct lttng_event_ht *events_ht = lttng_get_event_ht_from_enabler(&event_enabler->parent); + struct lttng_event_ht *events_ht = lttng_get_event_ht_from_enabler(event_enabler); struct lttng_kernel_probe_desc *probe_desc; const struct lttng_kernel_event_desc *desc; - int i; struct list_head *probe_list; + int i; probe_list = lttng_get_probe_list_head(); /* @@ -2153,8 +2165,7 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_recorder_enable struct lttng_kernel_event_common_private *event_priv; desc = probe_desc->event_desc[i]; - if (!lttng_desc_match_enabler(desc, - lttng_event_recorder_enabler_as_enabler(event_enabler))) + if (!lttng_desc_match_enabler(desc, event_enabler)) continue; /* @@ -2162,7 +2173,7 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_recorder_enable */ head = utils_borrow_hash_table_bucket(events_ht->table, LTTNG_EVENT_HT_SIZE, desc->event_name); lttng_hlist_for_each_entry(event_priv, head, hlist_node) { - if (lttng_event_enabler_desc_match_event(&event_enabler->parent, desc, event_priv->pub)) + if (lttng_event_enabler_desc_match_event(event_enabler, desc, event_priv->pub)) found = 1; } if (found) @@ -2171,7 +2182,7 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_recorder_enable /* * We need to create an event for this event probe. */ - event = _lttng_kernel_event_create(&event_enabler->parent, desc); + event = _lttng_kernel_event_create(event_enabler, desc); if (!event) { printk(KERN_INFO "LTTng: Unable to create event %s\n", probe_desc->event_desc[i]->event_name); @@ -2180,57 +2191,6 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_recorder_enable } } -static -void lttng_create_tracepoint_event_notifier_if_missing(struct lttng_event_notifier_enabler *event_notifier_enabler) -{ - struct lttng_event_ht *events_ht = lttng_get_event_ht_from_enabler(&event_notifier_enabler->parent); - struct lttng_kernel_probe_desc *probe_desc; - const struct lttng_kernel_event_desc *desc; - int i; - struct list_head *probe_list; - - probe_list = lttng_get_probe_list_head(); - /* - * For each probe event, if we find that a probe event matches - * our enabler, create an associated lttng_event_notifier if not - * already present. - */ - list_for_each_entry(probe_desc, probe_list, head) { - for (i = 0; i < probe_desc->nr_events; i++) { - int found = 0; - struct hlist_head *head; - struct lttng_kernel_event_common *event; - struct lttng_kernel_event_common_private *event_priv; - - desc = probe_desc->event_desc[i]; - if (!lttng_desc_match_enabler(desc, - lttng_event_notifier_enabler_as_enabler(event_notifier_enabler))) - continue; - - /* - * Check if already created. - */ - head = utils_borrow_hash_table_bucket(events_ht->table, - LTTNG_EVENT_HT_SIZE, desc->event_name); - lttng_hlist_for_each_entry(event_priv, head, hlist_node) { - if (lttng_event_enabler_desc_match_event(&event_notifier_enabler->parent, desc, event_priv->pub)) - found = 1; - } - if (found) - continue; - - /* - * We need to create a event_notifier for this event probe. - */ - event = _lttng_kernel_event_create(&event_notifier_enabler->parent, desc); - if (IS_ERR(event)) { - printk(KERN_INFO "Unable to create event_notifier %s\n", - probe_desc->event_desc[i]->event_name); - } - } - } -} - static void lttng_create_syscall_event_if_missing(struct lttng_event_enabler_common *event_enabler) { @@ -2241,20 +2201,19 @@ void lttng_create_syscall_event_if_missing(struct lttng_event_enabler_common *ev } /* - * Create struct lttng_kernel_event_recorder if it is missing and present in the list of - * tracepoint probes. + * Create event if it is missing and present in the list of tracepoint probes. * Should be called with sessions mutex held. */ static -void lttng_create_event_if_missing(struct lttng_event_recorder_enabler *event_enabler) +void lttng_create_event_if_missing(struct lttng_event_enabler_common *event_enabler) { - switch (event_enabler->parent.event_param.instrumentation) { + switch (event_enabler->event_param.instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: lttng_create_tracepoint_event_if_missing(event_enabler); break; case LTTNG_KERNEL_ABI_SYSCALL: - lttng_create_syscall_event_if_missing(&event_enabler->parent); + lttng_create_syscall_event_if_missing(event_enabler); break; default: @@ -2291,10 +2250,10 @@ int lttng_event_enabler_ref_events(struct lttng_event_recorder_enabler *event_en } /* First ensure that probe events are created for this enabler. */ - lttng_create_event_if_missing(event_enabler); + lttng_create_event_if_missing(&event_enabler->parent); /* For each event matching event_enabler in session event list. */ - list_for_each_entry(event_recorder_priv, &session->priv->events, node) { + list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) { struct lttng_kernel_event_recorder *event_recorder = event_recorder_priv->pub; struct lttng_enabler_ref *enabler_ref; @@ -2326,29 +2285,6 @@ int lttng_event_enabler_ref_events(struct lttng_event_recorder_enabler *event_en return 0; } -/* - * Create struct lttng_kernel_event_notifier if it is missing and present in the list of - * tracepoint probes. - * Should be called with sessions mutex held. - */ -static -void lttng_create_event_notifier_if_missing(struct lttng_event_notifier_enabler *event_notifier_enabler) -{ - switch (event_notifier_enabler->parent.event_param.instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: - lttng_create_tracepoint_event_notifier_if_missing(event_notifier_enabler); - break; - - case LTTNG_KERNEL_ABI_SYSCALL: - lttng_create_syscall_event_if_missing(&event_notifier_enabler->parent); - break; - - default: - WARN_ON_ONCE(1); - break; - } -} - /* * Create event_notifiers associated with a event_notifier enabler (if not already present). */ @@ -2377,10 +2313,10 @@ int lttng_event_notifier_enabler_ref_event_notifiers( } /* First ensure that probe event_notifiers are created for this enabler. */ - lttng_create_event_notifier_if_missing(event_notifier_enabler); + lttng_create_event_if_missing(&event_notifier_enabler->parent); /* Link the created event_notifier with its associated enabler. */ - list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, node) { + list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, parent.node) { struct lttng_kernel_event_notifier *event_notifier = event_notifier_priv->pub; struct lttng_enabler_ref *enabler_ref; @@ -2736,7 +2672,7 @@ void lttng_session_sync_event_enablers(struct lttng_kernel_session *session) * and its channel and session transient states are enabled, we * enable the event, else we disable it. */ - list_for_each_entry(event_recorder_priv, &session->priv->events, node) { + list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) { struct lttng_kernel_event_recorder *event_recorder = event_recorder_priv->pub; struct lttng_enabler_ref *enabler_ref; struct lttng_kernel_bytecode_runtime *runtime; @@ -2831,7 +2767,7 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group * For each event_notifier, if at least one of its enablers is enabled, * we enable the event_notifier, else we disable it. */ - list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, node) { + list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, parent.node) { struct lttng_kernel_event_notifier *event_notifier = event_notifier_priv->pub; struct lttng_enabler_ref *enabler_ref; struct lttng_kernel_bytecode_runtime *runtime; @@ -4152,7 +4088,7 @@ skip_session: goto end; } - list_for_each_entry(event_recorder_priv, &session->priv->events, node) { + list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) { ret = _lttng_event_metadata_statedump(session, event_recorder_priv->pub->chan, event_recorder_priv->pub); if (ret)