From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 5B9F9A0C41;
	Fri, 16 Apr 2021 10:18:29 +0200 (CEST)
Received: from [217.70.189.124] (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 4D454141B80;
	Fri, 16 Apr 2021 10:18:23 +0200 (CEST)
Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190])
 by mails.dpdk.org (Postfix) with ESMTP id 2EC59141B65
 for <dev@dpdk.org>; Fri, 16 Apr 2021 10:18:18 +0200 (CEST)
Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.59])
 by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4FM8CX6FCxzpYgn;
 Fri, 16 Apr 2021 16:15:20 +0800 (CST)
Received: from localhost.localdomain (10.69.192.56) by
 DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id
 14.3.498.0; Fri, 16 Apr 2021 16:18:11 +0800
From: "Min Hu (Connor)" <humin29@huawei.com>
To: <dev@dpdk.org>
CC: <ferruh.yigit@intel.com>, <ciara.power@intel.com>,
 <reshma.pattan@intel.com>, <david.marchand@redhat.com>
Date: Fri, 16 Apr 2021 16:18:25 +0800
Message-ID: <1618561106-26716-2-git-send-email-humin29@huawei.com>
X-Mailer: git-send-email 2.7.4
In-Reply-To: <1618561106-26716-1-git-send-email-humin29@huawei.com>
References: <1618051453-21264-1-git-send-email-humin29@huawei.com>
 <1618561106-26716-1-git-send-email-humin29@huawei.com>
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [10.69.192.56]
X-CFilter-Loop: Reflected
Subject: [dpdk-dev] [PATCH v4 1/2] telemetry: fix missing check for thread
 creation
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

From: Chengwen Feng <fengchengwen@huawei.com>

Add result check and message print out for thread creation after
failure.

Fixes: b80fe1805eee ("telemetry: introduce backward compatibility")
Cc: stable@dpdk.org

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
---
 lib/librte_telemetry/telemetry.c        | 37 ++++++++++++++++++++++++++++++---
 lib/librte_telemetry/telemetry_legacy.c | 11 ++++++++--
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/lib/librte_telemetry/telemetry.c b/lib/librte_telemetry/telemetry.c
index 7e08afd..08ce189 100644
--- a/lib/librte_telemetry/telemetry.c
+++ b/lib/librte_telemetry/telemetry.c
@@ -350,6 +350,7 @@ socket_listener(void *socket)
 {
 	while (1) {
 		pthread_t th;
+		int rc;
 		struct socket *s = (struct socket *)socket;
 		int s_accepted = accept(s->sock, NULL, NULL);
 		if (s_accepted < 0) {
@@ -366,7 +367,17 @@ socket_listener(void *socket)
 			__atomic_add_fetch(s->num_clients, 1,
 					__ATOMIC_RELAXED);
 		}
-		pthread_create(&th, NULL, s->fn, (void *)(uintptr_t)s_accepted);
+		rc = pthread_create(&th, NULL, s->fn,
+				    (void *)(uintptr_t)s_accepted);
+		if (rc != 0) {
+			TMTY_LOG(ERR, "Error with create client thread: %s\n",
+				 strerror(rc));
+			close(s_accepted);
+			if (s->num_clients != NULL)
+				__atomic_sub_fetch(s->num_clients, 1,
+						   __ATOMIC_RELAXED);
+			continue;
+		}
 		pthread_detach(th);
 	}
 	return NULL;
@@ -425,6 +436,7 @@ static int
 telemetry_legacy_init(void)
 {
 	pthread_t t_old;
+	int rc;
 
 	if (num_legacy_callbacks == 1) {
 		TMTY_LOG(WARNING, "No legacy callbacks, legacy socket not created\n");
@@ -440,7 +452,16 @@ telemetry_legacy_init(void)
 	v1_socket.sock = create_socket(v1_socket.path);
 	if (v1_socket.sock < 0)
 		return -1;
-	pthread_create(&t_old, NULL, socket_listener, &v1_socket);
+	rc = pthread_create(&t_old, NULL, socket_listener, &v1_socket);
+	if (rc != 0) {
+		TMTY_LOG(ERR, "Error with create legcay socket thread: %s\n",
+			 strerror(rc));
+		close(v1_socket.sock);
+		v1_socket.sock = -1;
+		unlink(v1_socket.path);
+		v1_socket.path[0] = '\0';
+		return -1;
+	}
 	pthread_setaffinity_np(t_old, sizeof(*thread_cpuset), thread_cpuset);
 
 	TMTY_LOG(DEBUG, "Legacy telemetry socket initialized ok\n");
@@ -451,6 +472,7 @@ static int
 telemetry_v2_init(void)
 {
 	pthread_t t_new;
+	int rc;
 
 	v2_socket.num_clients = &v2_clients;
 	rte_telemetry_register_cmd("/", list_commands,
@@ -469,7 +491,16 @@ telemetry_v2_init(void)
 	v2_socket.sock = create_socket(v2_socket.path);
 	if (v2_socket.sock < 0)
 		return -1;
-	pthread_create(&t_new, NULL, socket_listener, &v2_socket);
+	rc = pthread_create(&t_new, NULL, socket_listener, &v2_socket);
+	if (rc != 0) {
+		TMTY_LOG(ERR, "Error with create socket thread: %s\n",
+			 strerror(rc));
+		close(v2_socket.sock);
+		v2_socket.sock = -1;
+		unlink(v2_socket.path);
+		v2_socket.path[0] = '\0';
+		return -1;
+	}
 	pthread_setaffinity_np(t_new, sizeof(*thread_cpuset), thread_cpuset);
 	atexit(unlink_sockets);
 
diff --git a/lib/librte_telemetry/telemetry_legacy.c b/lib/librte_telemetry/telemetry_legacy.c
index 5e9af37..b7cd1bd 100644
--- a/lib/librte_telemetry/telemetry_legacy.c
+++ b/lib/librte_telemetry/telemetry_legacy.c
@@ -83,6 +83,7 @@ register_client(const char *cmd __rte_unused, const char *params,
 	pthread_t th;
 	char data[BUF_SIZE];
 	int fd;
+	int rc;
 	struct sockaddr_un addrs;
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
@@ -112,8 +113,14 @@ register_client(const char *cmd __rte_unused, const char *params,
 		close(fd);
 		return -1;
 	}
-	pthread_create(&th, NULL, &legacy_client_handler,
-			(void *)(uintptr_t)fd);
+	rc = pthread_create(&th, NULL, &legacy_client_handler,
+				(void *)(uintptr_t)fd);
+	if (rc != 0) {
+		fprintf(stderr, "Failed to create legacy client thread: %s\n",
+			strerror(rc));
+		close(fd);
+		return -1;
+	}
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 	return 0;
 }
-- 
2.7.4