diff --git a/src/bin/lttng-sessiond/channel.c b/src/bin/lttng-sessiond/channel.c
index d07e1d9..0271987 100644
--- a/src/bin/lttng-sessiond/channel.c
+++ b/src/bin/lttng-sessiond/channel.c
@@ -271,9 +271,15 @@ int channel_ust_create(struct ltt_ust_session *usess, int domain,
 	switch (domain) {
 	case LTTNG_DOMAIN_UST:
 		DBG2("Channel %s being created in UST global domain", uchan->name);
-
-		/* Enable channel for global domain */
-		ret = ust_app_create_channel_glb(usess, uchan);
+		/*
+		 * Enable channel for UST global domain on all applications. Ignore
+		 * return value here since whatever error we got, it means that the
+		 * channel was not created on one or many registered applications and
+		 * we can not report this to the user yet. However, at this stage, the
+		 * channel was successfully created on the session daemon side so the
+		 * enable-channel command is a success.
+		 */
+		(void) ust_app_create_channel_glb(usess, uchan);
 		break;
 #if 0
 	case LTTNG_DOMAIN_UST_PID:
@@ -285,11 +291,6 @@ int channel_ust_create(struct ltt_ust_session *usess, int domain,
 		goto error_free_chan;
 	}
 
-	if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
-		ret = LTTNG_ERR_UST_CHAN_FAIL;
-		goto error_free_chan;
-	}
-
 	/* Adding the channel to the channel hash table. */
 	rcu_read_lock();
 	lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c
index c81f6e8..0b5f0ae 100644
--- a/src/bin/lttng-sessiond/ust-app.c
+++ b/src/bin/lttng-sessiond/ust-app.c
@@ -1213,11 +1213,12 @@ error:
 }
 
 /*
- * Create UST app channel and create it on the tracer.
+ * Create UST app channel and create it on the tracer. Set ua_chanp of the
+ * newly created channel if not NULL.
  */
-static struct ust_app_channel *create_ust_app_channel(
-		struct ust_app_session *ua_sess, struct ltt_ust_channel *uchan,
-		struct ust_app *app)
+static int create_ust_app_channel(struct ust_app_session *ua_sess,
+		struct ltt_ust_channel *uchan, struct ust_app *app,
+		struct ust_app_channel **ua_chanp)
 {
 	int ret = 0;
 	struct lttng_ht_iter iter;
@@ -1235,6 +1236,7 @@ static struct ust_app_channel *create_ust_app_channel(
 	ua_chan = alloc_ust_app_channel(uchan->name, &uchan->attr);
 	if (ua_chan == NULL) {
 		/* Only malloc can fail here */
+		ret = -ENOMEM;
 		goto error;
 	}
 	shadow_copy_channel(ua_chan, uchan);
@@ -1246,17 +1248,23 @@ static struct ust_app_channel *create_ust_app_channel(
 		goto error;
 	}
 
+	/* Only add the channel if successful on the tracer side. */
 	lttng_ht_add_unique_str(ua_sess->channels, &ua_chan->node);
 
 	DBG2("UST app create channel %s for PID %d completed", ua_chan->name,
 			app->pid);
 
 end:
-	return ua_chan;
+	if (ua_chanp) {
+		*ua_chanp = ua_chan;
+	}
+
+	/* Everything went well. */
+	return 0;
 
 error:
 	delete_ust_app_channel(-1, ua_chan);
-	return NULL;
+	return ret;
 }
 
 /*
@@ -2001,7 +2009,6 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess,
 	struct lttng_ht_iter iter;
 	struct ust_app *app;
 	struct ust_app_session *ua_sess;
-	struct ust_app_channel *ua_chan;
 
 	/* Very wrong code flow */
 	assert(usess);
@@ -2029,26 +2036,27 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess,
 		ua_sess = create_ust_app_session(usess, app);
 		if (ua_sess == NULL) {
 			/* The malloc() failed. */
-			ret = -1;
+			ret = -ENOMEM;
 			goto error;
 		} else if (ua_sess == (void *) -1UL) {
-			/* The application's socket is not valid. Contiuing */
-			ret = -1;
+			/*
+			 * The application's socket is not valid. Either a bad socket or a
+			 * timeout on it. We can't inform yet the caller that for a
+			 * specific app, the session failed so we continue here.
+			 */
 			continue;
 		}
 
-		/* Create channel onto application */
-		ua_chan = create_ust_app_channel(ua_sess, uchan, app);
-		if (ua_chan == NULL) {
-			/* Major problem here and it's maybe the tracer or malloc() */
-			ret = -1;
+		/* Create channel onto application. We don't need the chan ref. */
+		ret = create_ust_app_channel(ua_sess, uchan, app, NULL);
+		if (ret < 0 && ret == -ENOMEM) {
+			/* No more memory is a fatal error. Stop right now. */
 			goto error;
 		}
 	}
 
-	rcu_read_unlock();
-
 error:
+	rcu_read_unlock();
 	return ret;
 }
 
