X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-events.c;h=4c7e71575dff948699d2f40f6740402ee502c9ee;hb=8d55475530bc2e8c7428f7cc926da7e0765dff1e;hp=230e393446735edcfaef947c274a39faa0d6f891;hpb=c190d76e8c7b44d62b3651ab845b765c1b1f8104;p=lttng-modules.git diff --git a/src/lttng-events.c b/src/lttng-events.c index 230e3934..4c7e7157 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -66,7 +66,6 @@ static struct kmem_cache *event_notifier_private_cache; static void lttng_session_lazy_sync_event_enablers(struct lttng_kernel_session *session); static void lttng_session_sync_event_enablers(struct lttng_kernel_session *session); -static void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enabler); 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); @@ -860,11 +859,12 @@ void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream) * Supports event creation while tracing session is active. * Needs to be called with sessions mutex held. */ -struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct lttng_kernel_channel_buffer *chan, - struct lttng_kernel_abi_event *event_param, - const struct lttng_kernel_event_desc *event_desc, - enum lttng_kernel_abi_instrumentation itype) +struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct lttng_event_enabler *event_enabler, + const struct lttng_kernel_event_desc *event_desc) { + struct lttng_kernel_channel_buffer *chan = event_enabler->chan; + struct lttng_kernel_abi_event *event_param = &event_enabler->base.event_param; + enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation; struct lttng_kernel_session *session = chan->parent.session; struct lttng_kernel_event_recorder *event_recorder; struct lttng_kernel_event_recorder_private *event_recorder_priv; @@ -1395,15 +1395,13 @@ int lttng_kernel_counter_clear(struct lttng_counter *counter, return counter->ops->counter_clear(counter->counter, dim_indexes); } -struct lttng_kernel_event_recorder *lttng_kernel_event_recorder_create(struct lttng_kernel_channel_buffer *chan, - struct lttng_kernel_abi_event *event_param, - const struct lttng_kernel_event_desc *event_desc, - enum lttng_kernel_abi_instrumentation itype) +struct lttng_kernel_event_recorder *lttng_kernel_event_recorder_create(struct lttng_event_enabler *event_enabler, + const struct lttng_kernel_event_desc *event_desc) { struct lttng_kernel_event_recorder *event; mutex_lock(&sessions_mutex); - event = _lttng_kernel_event_recorder_create(chan, event_param, event_desc, itype); + event = _lttng_kernel_event_recorder_create(event_enabler, event_desc); mutex_unlock(&sessions_mutex); return event; } @@ -1980,7 +1978,7 @@ int lttng_match_enabler_name(const char *desc_name, } int lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc, - struct lttng_enabler *enabler) + struct lttng_event_enabler_common *enabler) { const char *desc_name, *enabler_name; bool compat = false, entry = false; @@ -2072,7 +2070,7 @@ static int lttng_event_enabler_match_event(struct lttng_event_enabler *event_enabler, struct lttng_kernel_event_recorder *event_recorder) { - struct lttng_enabler *base_enabler = lttng_event_enabler_as_enabler( + struct lttng_event_enabler_common *base_enabler = lttng_event_enabler_as_enabler( event_enabler); if (base_enabler->event_param.instrumentation != event_recorder->priv->parent.instrumentation) @@ -2088,7 +2086,7 @@ static int lttng_event_notifier_enabler_match_event_notifier(struct lttng_event_notifier_enabler *event_notifier_enabler, struct lttng_kernel_event_notifier *event_notifier) { - struct lttng_enabler *base_enabler = lttng_event_notifier_enabler_as_enabler( + struct lttng_event_enabler_common *base_enabler = lttng_event_notifier_enabler_as_enabler( event_notifier_enabler); if (base_enabler->event_param.instrumentation != event_notifier->priv->parent.instrumentation) @@ -2104,7 +2102,7 @@ int lttng_event_notifier_enabler_match_event_notifier(struct lttng_event_notifie static struct lttng_enabler_ref *lttng_enabler_ref( struct list_head *enablers_ref_list, - struct lttng_enabler *enabler) + struct lttng_event_enabler_common *enabler) { struct lttng_enabler_ref *enabler_ref; @@ -2160,8 +2158,7 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler *event_ * We need to create an event for this * event probe. */ - event_recorder = _lttng_kernel_event_recorder_create(event_enabler->chan, - NULL, desc, LTTNG_KERNEL_ABI_TRACEPOINT); + event_recorder = _lttng_kernel_event_recorder_create(event_enabler, desc); if (!event_recorder) { printk(KERN_INFO "LTTng: Unable to create event %s\n", probe_desc->event_desc[i]->event_name); @@ -2280,7 +2277,7 @@ int lttng_event_enabler_ref_events(struct lttng_event_enabler *event_enabler) { struct lttng_kernel_channel_buffer *chan = event_enabler->chan; struct lttng_kernel_session *session = event_enabler->chan->parent.session; - struct lttng_enabler *base_enabler = lttng_event_enabler_as_enabler(event_enabler); + struct lttng_event_enabler_common *base_enabler = lttng_event_enabler_as_enabler(event_enabler); struct lttng_kernel_event_recorder_private *event_recorder_priv; if (base_enabler->event_param.instrumentation == LTTNG_KERNEL_ABI_SYSCALL && @@ -2364,7 +2361,7 @@ int lttng_event_notifier_enabler_ref_event_notifiers( struct lttng_event_notifier_enabler *event_notifier_enabler) { struct lttng_event_notifier_group *event_notifier_group = event_notifier_enabler->group; - struct lttng_enabler *base_enabler = lttng_event_notifier_enabler_as_enabler(event_notifier_enabler); + struct lttng_event_enabler_common *base_enabler = lttng_event_notifier_enabler_as_enabler(event_notifier_enabler); struct lttng_kernel_event_notifier_private *event_notifier_priv; if (base_enabler->event_param.instrumentation == LTTNG_KERNEL_ABI_SYSCALL && @@ -2492,11 +2489,17 @@ struct lttng_event_enabler *lttng_event_enabler_create( event_enabler->chan = chan; /* ctx left NULL */ event_enabler->base.enabled = 0; + return event_enabler; +} + +void lttng_event_enabler_session_add(struct lttng_kernel_session *session, + struct lttng_event_enabler *event_enabler) +{ mutex_lock(&sessions_mutex); - list_add(&event_enabler->node, &event_enabler->chan->parent.session->priv->enablers_head); - lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent.session); + list_add(&event_enabler->node, &session->priv->enablers_head); + event_enabler->published = true; + lttng_session_lazy_sync_event_enablers(session); mutex_unlock(&sessions_mutex); - return event_enabler; } int lttng_event_enabler_enable(struct lttng_event_enabler *event_enabler) @@ -2518,7 +2521,7 @@ int lttng_event_enabler_disable(struct lttng_event_enabler *event_enabler) } static -int lttng_enabler_attach_filter_bytecode(struct lttng_enabler *enabler, +int lttng_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *enabler, struct lttng_kernel_abi_filter_bytecode __user *bytecode) { struct lttng_kernel_bytecode_node *bytecode_node; @@ -2579,7 +2582,7 @@ int lttng_event_add_callsite(struct lttng_kernel_event_common *event, } static -void lttng_enabler_destroy(struct lttng_enabler *enabler) +void lttng_enabler_destroy(struct lttng_event_enabler_common *enabler) { struct lttng_kernel_bytecode_node *filter_node, *tmp_filter_node; @@ -2590,12 +2593,12 @@ void lttng_enabler_destroy(struct lttng_enabler *enabler) } } -static void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enabler) { lttng_enabler_destroy(lttng_event_enabler_as_enabler(event_enabler)); - list_del(&event_enabler->node); + if (event_enabler->published) + list_del(&event_enabler->node); kfree(event_enabler); } @@ -2677,7 +2680,7 @@ int lttng_event_notifier_enabler_attach_capture_bytecode( struct lttng_kernel_abi_capture_bytecode __user *bytecode) { struct lttng_kernel_bytecode_node *bytecode_node; - struct lttng_enabler *enabler = + struct lttng_event_enabler_common *enabler = lttng_event_notifier_enabler_as_enabler(event_notifier_enabler); uint32_t bytecode_len; int ret;