From: Philippe Proulx Date: Wed, 2 Sep 2015 02:53:30 +0000 (-0400) Subject: Fix: include loglevel type in UST event's primary key X-Git-Tag: v2.7.0-rc2~47 X-Git-Url: http://git.lttng.org/?a=commitdiff_plain;h=e9a89251285e6d02dbe8c7b51f0f1b200e200a1f;p=lttng-tools.git Fix: include loglevel type in UST event's primary key Refs: #913 Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/event.c b/src/bin/lttng-sessiond/event.c index cf0b44553..1c3166ed3 100644 --- a/src/bin/lttng-sessiond/event.c +++ b/src/bin/lttng-sessiond/event.c @@ -49,7 +49,8 @@ static void add_unique_ust_event(struct lttng_ht *ht, key.name = event->attr.name; key.filter = (struct lttng_filter_bytecode *) event->filter; - key.loglevel_type = event->attr.loglevel; + key.loglevel_type = event->attr.loglevel_type; + key.loglevel_value = event->attr.loglevel; key.exclusion = event->exclusion; node_ptr = cds_lfht_add_unique(ht->ht, @@ -185,103 +186,6 @@ end: * ============================ */ -/* - * Enable all UST tracepoints for a channel from a UST session. - */ -int event_ust_enable_all_tracepoints(struct ltt_ust_session *usess, - struct ltt_ust_channel *uchan, - char *filter_expression, - struct lttng_filter_bytecode *filter) -{ - int ret, i, size; - struct lttng_ht_iter iter; - struct ltt_ust_event *uevent = NULL; - struct lttng_event *events = NULL; - - assert(usess); - assert(uchan); - - rcu_read_lock(); - - /* Enable existing events */ - cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, - node.node) { - if (uevent->enabled == 0) { - ret = ust_app_enable_event_glb(usess, uchan, uevent); - if (ret < 0) { - continue; - } - uevent->enabled = 1; - } - } - - /* Get all UST available events */ - size = ust_app_list_events(&events); - if (size < 0) { - ret = LTTNG_ERR_UST_LIST_FAIL; - goto error; - } - - for (i = 0; i < size; i++) { - /* - * Check if event exist and if so, continue since it was enable - * previously. - */ - uevent = trace_ust_find_event(uchan->events, events[i].name, filter, - events[i].loglevel, NULL); - if (uevent != NULL) { - ret = ust_app_enable_event_pid(usess, uchan, uevent, - events[i].pid); - if (ret < 0) { - if (ret != -LTTNG_UST_ERR_EXIST) { - ret = LTTNG_ERR_UST_ENABLE_FAIL; - goto error; - } - } - continue; - } - - /* Create ust event */ - uevent = trace_ust_create_event(&events[i], filter_expression, - filter, NULL, false); - if (uevent == NULL) { - ret = LTTNG_ERR_FATAL; - goto error_destroy; - } - - /* Create event for the specific PID */ - ret = ust_app_enable_event_pid(usess, uchan, uevent, - events[i].pid); - if (ret < 0) { - if (ret == -LTTNG_UST_ERR_EXIST) { - ret = LTTNG_ERR_UST_EVENT_EXIST; - goto error; - } else { - ret = LTTNG_ERR_UST_ENABLE_FAIL; - goto error_destroy; - } - } - - uevent->enabled = 1; - /* Add ltt ust event to channel */ - rcu_read_lock(); - add_unique_ust_event(uchan->events, uevent); - rcu_read_unlock(); - } - free(events); - - rcu_read_unlock(); - return LTTNG_OK; - -error_destroy: - trace_ust_destroy_event(uevent); - -error: - free(events); - rcu_read_unlock(); - return ret; -} - /* * Enable UST tracepoint event for a channel from a UST session. * We own filter_expression, filter, and exclusion. @@ -303,8 +207,8 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, rcu_read_lock(); uevent = trace_ust_find_event(uchan->events, event->name, filter, - event->loglevel, exclusion); - if (uevent == NULL) { + event->loglevel_type, event->loglevel, exclusion); + if (!uevent) { uevent = trace_ust_create_event(event, filter_expression, filter, exclusion, internal_event); /* We have passed ownership */ @@ -448,60 +352,6 @@ error: return ret; } -/* - * Disable all UST tracepoints for a channel from a UST session. - */ -int event_ust_disable_all_tracepoints(struct ltt_ust_session *usess, - struct ltt_ust_channel *uchan) -{ - int ret, i, size; - struct lttng_ht_iter iter; - struct ltt_ust_event *uevent = NULL; - struct lttng_event *events = NULL; - - assert(usess); - assert(uchan); - - rcu_read_lock(); - - /* Disabling existing events */ - cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, - node.node) { - if (uevent->enabled == 1) { - ret = event_ust_disable_tracepoint(usess, uchan, - uevent->attr.name); - if (ret < 0) { - continue; - } - } - } - - /* Get all UST available events */ - size = ust_app_list_events(&events); - if (size < 0) { - ret = LTTNG_ERR_UST_LIST_FAIL; - goto error; - } - - for (i = 0; i < size; i++) { - ret = event_ust_disable_tracepoint(usess, uchan, - events[i].name); - if (ret != LTTNG_OK) { - /* Continue to disable the rest... */ - continue; - } - } - free(events); - - rcu_read_unlock(); - return LTTNG_OK; - -error: - free(events); - rcu_read_unlock(); - return ret; -} - /* * Enable all agent event for a given UST session. * @@ -691,12 +541,13 @@ int event_agent_disable(struct ltt_ust_session *usess, struct agent *agt, } /* - * The loglevel is hardcoded with 0 here since the agent ust event is set - * with the loglevel type to ALL thus the loglevel stays 0. The event's - * filter is the one handling the loglevel for agent. + * Agent UST event has its loglevel type forced to + * LTTNG_UST_LOGLEVEL_ALL. The actual loglevel type/value filtering + * happens thanks to an UST filter. The following -1 is actually + * ignored since the type is LTTNG_UST_LOGLEVEL_ALL. */ uevent = trace_ust_find_event(uchan->events, (char *) ust_event_name, - aevent->filter, 0, NULL); + aevent->filter, LTTNG_UST_LOGLEVEL_ALL, -1, NULL); /* If the agent event exists, it must be available on the UST side. */ assert(uevent); diff --git a/src/bin/lttng-sessiond/event.h b/src/bin/lttng-sessiond/event.h index fd47c7764..4e7de911c 100644 --- a/src/bin/lttng-sessiond/event.h +++ b/src/bin/lttng-sessiond/event.h @@ -40,13 +40,6 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int event_ust_disable_tracepoint(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan, char *event_name); -int event_ust_enable_all_tracepoints(struct ltt_ust_session *usess, - struct ltt_ust_channel *uchan, - char *filter_expression, - struct lttng_filter_bytecode *filter); -int event_ust_disable_all_tracepoints(struct ltt_ust_session *usess, - struct ltt_ust_channel *uchan); - int event_agent_enable(struct ltt_ust_session *usess, struct agent *agt, struct lttng_event *event, struct lttng_filter_bytecode *filter, char *filter_expression); diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index 8da942f01..1bc3c7780 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -86,19 +86,21 @@ int trace_ust_ht_match_event(struct cds_lfht_node *node, const void *_key) goto no_match; } - /* Event loglevel. */ - if (ev_loglevel_value != key->loglevel_type) { - if (event->attr.loglevel_type == LTTNG_UST_LOGLEVEL_ALL - && key->loglevel_type == 0 && ev_loglevel_value == -1) { + /* Event loglevel value and type. */ + if (event->attr.loglevel_type == key->loglevel_type) { + /* Same loglevel type. */ + if (key->loglevel_type != LTTNG_UST_LOGLEVEL_ALL) { /* - * Match is accepted. This is because on event creation, the - * loglevel is set to -1 if the event loglevel type is ALL so 0 and - * -1 are accepted for this loglevel type since 0 is the one set by - * the API when receiving an enable event. + * Loglevel value must also match since the loglevel + * type is not all. */ - } else { - goto no_match; + if (ev_loglevel_value != key->loglevel_value) { + goto no_match; + } } + } else { + /* Loglevel type is different: no match. */ + goto no_match; } /* Only one of the filters is NULL, fail. */ @@ -173,7 +175,8 @@ error: */ struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, char *name, struct lttng_filter_bytecode *filter, - int loglevel_value, struct lttng_event_exclusion *exclusion) + enum lttng_ust_loglevel_type loglevel_type, int loglevel_value, + struct lttng_event_exclusion *exclusion) { struct lttng_ht_node_str *node; struct lttng_ht_iter iter; @@ -184,7 +187,8 @@ struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, key.name = name; key.filter = filter; - key.loglevel_type = loglevel_value; + key.loglevel_type = loglevel_type; + key.loglevel_value = loglevel_value; key.exclusion = exclusion; cds_lfht_lookup(ht->ht, ht->hash_fct((void *) name, lttng_ht_seed), diff --git a/src/bin/lttng-sessiond/trace-ust.h b/src/bin/lttng-sessiond/trace-ust.h index d7f732e15..e96f8550b 100644 --- a/src/bin/lttng-sessiond/trace-ust.h +++ b/src/bin/lttng-sessiond/trace-ust.h @@ -34,6 +34,7 @@ struct ltt_ust_ht_key { const char *name; const struct lttng_filter_bytecode *filter; enum lttng_ust_loglevel_type loglevel_type; + int loglevel_value; const struct lttng_event_exclusion *exclusion; }; @@ -170,7 +171,8 @@ int trace_ust_ht_match_event_by_name(struct cds_lfht_node *node, */ struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, char *name, struct lttng_filter_bytecode *filter, - int loglevel_value, struct lttng_event_exclusion *exclusion); + enum lttng_ust_loglevel_type loglevel_type, int loglevel_value, + struct lttng_event_exclusion *exclusion); struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht, char *name); struct agent *trace_ust_find_agent(struct ltt_ust_session *session, @@ -275,9 +277,11 @@ int trace_ust_match_context(struct ltt_ust_context *uctx, { return 0; } -static inline struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, +static inline +struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, char *name, struct lttng_filter_bytecode *filter, - int loglevel_value, struct lttng_event_exclusion *exclusion) + enum lttng_ust_loglevel_type loglevel_type, int loglevel_value, + struct lttng_event_exclusion *exclusion) { return NULL; }