+ int ret;
+ struct ltt_kernel_event *kevent;
+
+ assert(kchan);
+ assert(event);
+
+ kevent = trace_kernel_find_event(event->name, kchan,
+ event->type, filter);
+ if (kevent == NULL) {
+ ret = kernel_create_event(event, kchan, filter_expression, filter);
+ /* We have passed ownership */
+ filter_expression = NULL;
+ filter = NULL;
+ if (ret) {
+ goto end;
+ }
+ } else if (kevent->enabled == 0) {
+ ret = kernel_enable_event(kevent);
+ if (ret < 0) {
+ ret = LTTNG_ERR_KERN_ENABLE_FAIL;
+ goto end;
+ }
+ } else {
+ /* At this point, the event is considered enabled */
+ ret = LTTNG_ERR_KERN_EVENT_EXIST;
+ goto end;
+ }
+
+ ret = LTTNG_OK;
+end:
+ free(filter_expression);
+ free(filter);
+ return ret;
+}
+
+/*
+ * ============================
+ * UST : The Ultimate Frontier!
+ * ============================
+ */
+
+/*
+ * Enable UST tracepoint event for a channel from a UST session.
+ * We own filter_expression, filter, and exclusion.
+ */
+int event_ust_enable_tracepoint(struct ltt_ust_session *usess,
+ struct ltt_ust_channel *uchan, struct lttng_event *event,
+ char *filter_expression,
+ struct lttng_bytecode *filter,
+ struct lttng_event_exclusion *exclusion,
+ bool internal_event)
+{
+ int ret = LTTNG_OK, to_create = 0;
+ struct ltt_ust_event *uevent;
+
+ assert(usess);
+ assert(uchan);
+ assert(event);
+
+ rcu_read_lock();
+
+ uevent = trace_ust_find_event(uchan->events, event->name, filter,
+ (enum lttng_ust_loglevel_type) event->loglevel_type,
+ event->loglevel, exclusion);
+ if (!uevent) {
+ ret = trace_ust_create_event(event, filter_expression,
+ filter, exclusion, internal_event, &uevent);
+ /* We have passed ownership */
+ filter_expression = NULL;
+ filter = NULL;
+ exclusion = NULL;
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+
+ /* Valid to set it after the goto error since uevent is still NULL */
+ to_create = 1;