X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=72a3223c1fa53baa0bf8f413e9e9e99d7e6d335d;hb=000baf6aa0ad8d7a985f147f1f47337b564150ca;hp=adb31e85baeab6577074d3b77884e760f623eff2;hpb=39c5a3a7d69d6a2c3bdd76f2ea1231ebf42537ac;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index adb31e85b..72a3223c1 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -481,6 +481,20 @@ push_data: ret = consumer_push_metadata(socket, registry->metadata_key, metadata_str, len, offset); if (ret < 0) { + /* + * There is an acceptable race here between the registry metadata key + * assignment and the creation on the consumer. The session daemon can + * concurrently push metadata for this registry while being created on + * the consumer since the metadata key of the registry is assigned + * *before* it is setup to avoid the consumer to ask for metadata that + * could possibly be not found in the session daemon. + * + * The metadata will get pushed either by the session being stopped or + * the consumer requesting metadata if that race is triggered. + */ + if (ret == -LTTCOMM_CONSUMERD_CHANNEL_FAIL) { + ret = 0; + } ret_val = ret; goto error_push; } @@ -1136,6 +1150,47 @@ error: return ret; } +/* + * Set event exclusions on the tracer. + */ +static +int set_ust_event_exclusion(struct ust_app_event *ua_event, + struct ust_app *app) +{ + int ret; + + health_code_update(); + + if (!ua_event->exclusion || !ua_event->exclusion->count) { + ret = 0; + goto error; + } + + ret = ustctl_set_exclusion(app->sock, ua_event->exclusion, + ua_event->obj); + if (ret < 0) { + if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { + ERR("UST app event %s exclusions failed for app (pid: %d) " + "with ret %d", ua_event->attr.name, app->pid, ret); + } else { + /* + * This is normal behavior, an application can die during the + * creation process. Don't report an error so the execution can + * continue normally. + */ + ret = 0; + DBG3("UST app event exclusion failed. Application is dead."); + } + goto error; + } + + DBG2("UST exclusion set successfully for event %s", ua_event->name); + +error: + health_code_update(); + return ret; +} + /* * Disable the specified event on to UST tracer for the UST session. */ @@ -1375,6 +1430,14 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess, } } + /* Set exclusions for the event */ + if (ua_event->exclusion) { + ret = set_ust_event_exclusion(ua_event, app); + if (ret < 0) { + goto error; + } + } + /* If event not enabled, disable it on the tracer */ if (ua_event->enabled == 0) { ret = disable_ust_event(app, ua_sess, ua_event); @@ -1410,6 +1473,8 @@ error: static void shadow_copy_event(struct ust_app_event *ua_event, struct ltt_ust_event *uevent) { + size_t exclusion_alloc_size; + strncpy(ua_event->name, uevent->attr.name, sizeof(ua_event->name)); ua_event->name[sizeof(ua_event->name) - 1] = '\0'; @@ -1423,6 +1488,19 @@ static void shadow_copy_event(struct ust_app_event *ua_event, ua_event->filter = alloc_copy_ust_app_filter(uevent->filter); /* Filter might be NULL here in case of ENONEM. */ } + + /* Copy exclusion data */ + if (uevent->exclusion) { + exclusion_alloc_size = sizeof(struct lttng_ust_event_exclusion) + + LTTNG_UST_SYM_NAME_LEN * uevent->exclusion->count; + ua_event->exclusion = zmalloc(exclusion_alloc_size); + if (ua_event->exclusion == NULL) { + PERROR("malloc"); + } else { + memcpy(ua_event->exclusion, uevent->exclusion, + exclusion_alloc_size); + } + } } /* @@ -3198,12 +3276,13 @@ int ust_app_list_event_fields(struct lttng_event_field **fields) } memcpy(tmp_event[count].field_name, uiter.field_name, LTTNG_UST_SYM_NAME_LEN); - tmp_event[count].type = uiter.type; + /* Mapping between these enums matches 1 to 1. */ + tmp_event[count].type = (enum lttng_event_field_type) uiter.type; tmp_event[count].nowrite = uiter.nowrite; memcpy(tmp_event[count].event.name, uiter.event_name, LTTNG_UST_SYM_NAME_LEN); tmp_event[count].event.loglevel = uiter.loglevel; - tmp_event[count].event.type = LTTNG_UST_TRACEPOINT; + tmp_event[count].event.type = LTTNG_EVENT_TRACEPOINT; tmp_event[count].event.pid = app->pid; tmp_event[count].event.enabled = -1; count++;