X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fevent.c;h=13f09a51efad3b2f8b3a7e81ebc7ac5d2795c724;hp=71b66a8468cd06410ca3e277fa63750d9b0780df;hb=3e81c0f2fcfb479413c71a73e4de25bcdb6b198d;hpb=b953b8cd56dbdc30e9228a7334c6e5fbe302cfc7 diff --git a/src/bin/lttng-sessiond/event.c b/src/bin/lttng-sessiond/event.c index 71b66a846..13f09a51e 100644 --- a/src/bin/lttng-sessiond/event.c +++ b/src/bin/lttng-sessiond/event.c @@ -353,6 +353,59 @@ 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, error = 0; + 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) { + error = LTTNG_ERR_UST_DISABLE_FAIL; + 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 < 0) { + /* Continue to disable the rest... */ + error = LTTNG_ERR_UST_DISABLE_FAIL; + continue; + } + } + + ret = error ? error : LTTNG_OK; +error: + rcu_read_unlock(); + free(events); + return ret; +} + /* * Enable all agent event for a given UST session. * @@ -412,10 +465,11 @@ int event_agent_enable(struct ltt_ust_session *usess, usess->id, event->loglevel_type, event->loglevel, filter_expression ? filter_expression : "NULL"); - aevent = agent_find_event(event->name, event->loglevel, agt); + aevent = agent_find_event(event->name, event->loglevel_type, + event->loglevel, agt); if (!aevent) { - aevent = agent_create_event(event->name, event->loglevel, - event->loglevel_type, filter, + aevent = agent_create_event(event->name, event->loglevel_type, + event->loglevel, filter, filter_expression); if (!aevent) { ret = LTTNG_ERR_NOMEM; @@ -475,30 +529,26 @@ const char *event_get_default_agent_ust_name(enum lttng_domain_type domain) } /* - * Disable a single agent event for a given UST session. + * Disable a given agent event for a given UST session. * + * Must be called with the RCU read lock held. * Return LTTNG_OK on success or else a LTTNG_ERR* code. */ -int event_agent_disable(struct ltt_ust_session *usess, struct agent *agt, - char *event_name) +static int event_agent_disable_one(struct ltt_ust_session *usess, + struct agent *agt, struct agent_event *aevent) { int ret; - struct agent_event *aevent; struct ltt_ust_event *uevent = NULL; struct ltt_ust_channel *uchan = NULL; const char *ust_event_name, *ust_channel_name; assert(agt); assert(usess); - assert(event_name); + assert(aevent); - DBG("Event agent disabling %s for session %" PRIu64, event_name, usess->id); - - aevent = agent_find_event_by_name(event_name, agt); - if (!aevent) { - ret = LTTNG_ERR_UST_EVENT_NOT_FOUND; - goto error; - } + DBG("Event agent disabling %s (loglevel type %d, loglevel value %d) for session %" PRIu64, + aevent->name, aevent->loglevel_type, aevent->loglevel_value, + usess->id); /* Already disabled? */ if (!aevent->enabled) { @@ -567,6 +617,52 @@ end: error: return ret; } + +/* + * Disable all agent events matching a given name for a given UST session. + * + * Return LTTNG_OK on success or else a LTTNG_ERR* code. + */ +int event_agent_disable(struct ltt_ust_session *usess, struct agent *agt, + char *event_name) +{ + int ret = LTTNG_OK; + struct agent_event *aevent; + struct lttng_ht_iter iter; + struct lttng_ht_node_str *node; + + assert(agt); + assert(usess); + assert(event_name); + + DBG("Event agent disabling %s (all loglevels) for session %" PRIu64, event_name, usess->id); + + rcu_read_lock(); + agent_find_events_by_name(event_name, agt, &iter); + node = lttng_ht_iter_get_node_str(&iter); + + if (node == NULL) { + DBG2("Event agent NOT found by name %s", event_name); + ret = LTTNG_ERR_UST_EVENT_NOT_FOUND; + goto end; + } + + do { + aevent = caa_container_of(node, struct agent_event, node); + ret = event_agent_disable_one(usess, agt, aevent); + + if (ret != LTTNG_OK) { + goto end; + } + + /* Get next duplicate agent event by name. */ + agent_event_next_duplicate(event_name, agt, &iter); + node = lttng_ht_iter_get_node_str(&iter); + } while (node); +end: + rcu_read_unlock(); + return ret; +} /* * Disable all agent event for a given UST session. * @@ -591,7 +687,7 @@ int event_agent_disable_all(struct ltt_ust_session *usess, goto error; } - /* Flag every event that they are now enabled. */ + /* Disable every event. */ rcu_read_lock(); cds_lfht_for_each_entry(agt->events->ht, &iter.iter, aevent, node.node) { @@ -601,14 +697,13 @@ int event_agent_disable_all(struct ltt_ust_session *usess, ret = event_agent_disable(usess, agt, aevent->name); if (ret != LTTNG_OK) { - rcu_read_unlock(); - goto error; + goto error_unlock; } } - rcu_read_unlock(); - ret = LTTNG_OK; +error_unlock: + rcu_read_unlock(); error: return ret; }