X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng-sessiond%2Fust-app.c;h=73dc770c9391f3fac295d6e16b58fcfefa195ac9;hp=9a20d5d45a3e05c2d790366736125ee785aab796;hb=90d97d10e57ba8b2b10481837efb3d2402f41f88;hpb=76d45b4000137cff321b29800e11cc5d4a299a98 diff --git a/lttng-sessiond/ust-app.c b/lttng-sessiond/ust-app.c index 9a20d5d45..73dc770c9 100644 --- a/lttng-sessiond/ust-app.c +++ b/lttng-sessiond/ust-app.c @@ -163,6 +163,9 @@ void delete_ust_app_session(int sock, struct ust_app_session *ua_sess) ret = hashtable_destroy(ua_sess->channels); assert(!ret); + if (ua_sess->handle != -1) { + ustctl_release_handle(sock, ua_sess->handle); + } free(ua_sess); } @@ -565,6 +568,8 @@ static int open_ust_metadata(struct ust_app *app, goto error; } + ua_sess->metadata->handle = ua_sess->metadata->obj->handle; + error: return ret; } @@ -996,8 +1001,7 @@ error: * Disable on the tracer side a ust app event for the session and channel. */ static int disable_ust_app_event(struct ust_app_session *ua_sess, - struct ust_app_channel *ua_chan, struct ust_app_event *ua_event, - struct ust_app *app) + struct ust_app_event *ua_event, struct ust_app *app) { int ret; @@ -1146,6 +1150,9 @@ int create_ust_app_event(struct ust_app_session *ua_sess, hashtable_add_unique(ua_chan->events, &ua_event->node); + DBG2("UST app create event %s for PID %d completed", + ua_event->name, app->key.pid); + end: error: return ret; @@ -1158,6 +1165,7 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess, char *pathname, struct ust_app *app) { int ret = 0; + mode_t old_umask; if (ua_sess->metadata == NULL) { /* Allocate UST metadata */ @@ -1183,11 +1191,13 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess, goto error; } + old_umask = umask(0); ret = mkdir(ua_sess->path, S_IRWXU | S_IRWXG); if (ret < 0) { PERROR("mkdir UST metadata"); goto error; } + umask(old_umask); ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/metadata", ua_sess->path); @@ -1396,6 +1406,7 @@ int ust_app_list_events(struct lttng_event **events) } memcpy(tmp[count].name, iter.name, LTTNG_UST_SYM_NAME_LEN); memcpy(tmp[count].loglevel, iter.loglevel, LTTNG_UST_SYM_NAME_LEN); + tmp[count].loglevel_value = iter.loglevel_value; tmp[count].type = LTTNG_UST_TRACEPOINT; tmp[count].pid = app->key.pid; tmp[count].enabled = -1; @@ -1592,7 +1603,7 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess, } ua_event = caa_container_of(ua_event_node, struct ust_app_event, node); - ret = disable_ust_app_event(ua_sess, ua_chan, ua_event, app); + ret = disable_ust_app_event(ua_sess, ua_event, app); if (ret < 0) { /* XXX: Report error someday... */ continue; @@ -1640,7 +1651,7 @@ int ust_app_disable_all_event_glb(struct ltt_ust_session *usess, /* Disable each events of channel */ cds_lfht_for_each_entry(ua_chan->events, &uiter, ua_event, node) { - ret = disable_ust_app_event(ua_sess, ua_chan, ua_event, app); + ret = disable_ust_app_event(ua_sess, ua_event, app); if (ret < 0) { /* XXX: Report error someday... */ continue; @@ -1740,24 +1751,23 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess, ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); - ua_event_node = hashtable_lookup(ua_sess->channels, + ua_event_node = hashtable_lookup(ua_chan->events, (void*)uevent->attr.name, strlen(uevent->attr.name), &uiter); if (ua_event_node == NULL) { - DBG3("UST app enable event %s not found. Skipping app", - uevent->attr.name); + DBG3("UST app enable event %s not found for app PID %d." + "Skipping app", uevent->attr.name, app->key.pid); continue; } ua_event = caa_container_of(ua_event_node, struct ust_app_event, node); ret = enable_ust_app_event(ua_sess, ua_event, app); if (ret < 0) { - /* XXX: Report error someday... */ - continue; + goto error; } } +error: rcu_read_unlock(); - return ret; } @@ -1920,7 +1930,9 @@ error_rcu_unlock: int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) { int ret = 0; + struct cds_lfht_iter iter; struct ust_app_session *ua_sess; + struct ust_app_channel *ua_chan; DBG("Stopping tracing for ust app pid %d", app->key.pid); @@ -1932,21 +1944,16 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) goto error_rcu_unlock; } -#if 0 /* only useful when periodical flush will be supported */ - /* need to keep a handle on shm in session for this. */ - /* Flush all buffers before stopping */ - ret = ustctl_flush_buffer(usess->sock, usess->metadata->obj); - if (ret < 0) { - ERR("UST metadata flush failed"); - } - - cds_list_for_each_entry(ustchan, &usess->channels.head, list) { - ret = ustctl_flush_buffer(usess->sock, ustchan->obj); + cds_lfht_for_each_entry(ua_sess->channels, &iter, ua_chan, node) { + ret = ustctl_sock_flush_buffer(app->key.sock, ua_chan->obj); if (ret < 0) { - ERR("UST flush buffer error"); + ERR("UST app PID %d channel %s flush failed", + app->key.pid, ua_chan->name); + ERR("Ended with ret %d", ret); + /* Continuing flushing all buffers */ + continue; } } -#endif /* This inhibits UST tracing */ ret = ustctl_stop_session(app->key.sock, ua_sess->handle); @@ -1960,6 +1967,13 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) /* Quiescent wait after stopping trace */ ustctl_wait_quiescent(app->key.sock); + /* Flush all buffers before stopping */ + ret = ustctl_sock_flush_buffer(app->key.sock, ua_sess->metadata->obj); + if (ret < 0) { + ERR("UST app PID %d metadata flush failed", app->key.pid); + ERR("Ended with ret %d", ret); + } + return 0; error_rcu_unlock: @@ -2193,9 +2207,6 @@ int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess, } } - /* Add ltt UST context node to ltt UST channel */ - hashtable_add_unique(uchan->ctx, &uctx->node); - rcu_read_unlock(); return ret; } @@ -2246,9 +2257,6 @@ int ust_app_add_ctx_event_glb(struct ltt_ust_session *usess, } } - /* Add ltt UST context node to ltt UST event */ - hashtable_add_unique(uevent->ctx, &uctx->node); - rcu_read_unlock(); return ret; } @@ -2290,7 +2298,7 @@ int ust_app_enable_event_pid(struct ltt_ust_session *usess, ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); - ua_event_node = hashtable_lookup(ua_sess->channels, + ua_event_node = hashtable_lookup(ua_chan->events, (void*)uevent->attr.name, strlen(uevent->attr.name), &iter); if (ua_event_node == NULL) { ret = create_ust_app_event(ua_sess, ua_chan, uevent, app); @@ -2310,3 +2318,59 @@ error: rcu_read_unlock(); return ret; } + +/* + * Disable event for a channel from a UST session for a specific PID. + */ +int ust_app_disable_event_pid(struct ltt_ust_session *usess, + struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent, pid_t pid) +{ + int ret = 0; + struct cds_lfht_iter iter; + struct cds_lfht_node *ua_chan_node, *ua_event_node; + struct ust_app *app; + struct ust_app_session *ua_sess; + struct ust_app_channel *ua_chan; + struct ust_app_event *ua_event; + + DBG("UST app disabling event %s for PID %d", uevent->attr.name, pid); + + rcu_read_lock(); + + app = ust_app_find_by_pid(pid); + if (app == NULL) { + ERR("UST app disable event per PID %d not found", pid); + ret = -1; + goto error; + } + + ua_sess = lookup_session_by_app(usess, app); + /* If ua_sess is NULL, there is a code flow error */ + assert(ua_sess); + + /* Lookup channel in the ust app session */ + ua_chan_node = hashtable_lookup(ua_sess->channels, (void *)uchan->name, + strlen(uchan->name), &iter); + if (ua_chan_node == NULL) { + /* Channel does not exist, skip disabling */ + goto error; + } + ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); + + ua_event_node = hashtable_lookup(ua_chan->events, + (void*)uevent->attr.name, strlen(uevent->attr.name), &iter); + if (ua_event_node == NULL) { + /* Event does not exist, skip disabling */ + goto error; + } + ua_event = caa_container_of(ua_event_node, struct ust_app_event, node); + + ret = disable_ust_app_event(ua_sess, ua_event, app); + if (ret < 0) { + goto error; + } + +error: + rcu_read_unlock(); + return ret; +}