key.name = event->attr.name;
key.filter = event->filter;
key.loglevel = event->attr.loglevel;
+ key.exclusion = event->exclusion;
node_ptr = cds_lfht_add_unique(ht->ht,
ht->hash_fct(event->node.key, lttng_ht_seed),
assert(ua_event);
free(ua_event->filter);
-
+ if (ua_event->exclusion != NULL)
+ free(ua_event->exclusion);
if (ua_event->obj != NULL) {
ret = ustctl_release_object(sock, ua_event->obj);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
* Return an ust_app_event object or NULL on error.
*/
static struct ust_app_event *find_ust_app_event(struct lttng_ht *ht,
- char *name, struct lttng_ust_filter_bytecode *filter, int loglevel)
+ char *name, struct lttng_ust_filter_bytecode *filter, int loglevel,
+ const struct lttng_event_exclusion *exclusion)
{
struct lttng_ht_iter iter;
struct lttng_ht_node_str *node;
key.name = name;
key.filter = filter;
key.loglevel = loglevel;
+ /* lttng_event_exclusion and lttng_ust_event_exclusion structures are similar */
+ key.exclusion = (struct lttng_ust_event_exclusion *)exclusion;
/* Lookup using the event name as hash and a custom match fct. */
cds_lfht_lookup(ht->ht, ht->hash_fct((void *) name, lttng_ht_seed),
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.
*/
}
}
+ /* 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);
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';
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);
+ }
+ }
}
/*
/* Copy all events from ltt ust channel to ust app channel */
cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, node.node) {
ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
- uevent->filter, uevent->attr.loglevel);
+ uevent->filter, uevent->attr.loglevel, uevent->exclusion);
if (ua_event == NULL) {
DBG2("UST event %s not found on shadow copy channel",
uevent->attr.name);
/* Get event node */
ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
- uevent->filter, uevent->attr.loglevel);
+ uevent->filter, uevent->attr.loglevel, uevent->exclusion);
if (ua_event != NULL) {
ret = -EEXIST;
goto end;
/* Get event node */
ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
- uevent->filter, uevent->attr.loglevel);
+ uevent->filter, uevent->attr.loglevel, uevent->exclusion);
if (ua_event == NULL) {
DBG3("UST app enable event %s not found for app PID %d."
"Skipping app", uevent->attr.name, app->pid);
ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
- uevent->filter, uevent->attr.loglevel);
+ uevent->filter, uevent->attr.loglevel, uevent->exclusion);
if (ua_event == NULL) {
ret = create_ust_app_event(ua_sess, ua_chan, uevent, app);
if (ret < 0) {