From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5EE5CA0C43; Fri, 8 Oct 2021 19:19:29 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 96EED40140; Fri, 8 Oct 2021 19:19:18 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id ADC184067E for ; Fri, 8 Oct 2021 19:19:13 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10131"; a="207362126" X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="207362126" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Oct 2021 10:19:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="523050412" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga001.jf.intel.com with ESMTP; 08 Oct 2021 10:19:06 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson Date: Fri, 8 Oct 2021 18:18:50 +0100 Message-Id: <20211008171852.736387-4-bruce.richardson@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211008171852.736387-1-bruce.richardson@intel.com> References: <20210915141030.23514-1-bruce.richardson@intel.com> <20211008171852.736387-1-bruce.richardson@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v7 3/5] telemetry: use unique socket paths for in-memory mode X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When running in in-memory mode, multiple processes can use the same runtime dir, leading to conflicts with the telemetry sockets in that directory. We can resolve this by appending a suffix to each socket beyond the first, with the suffix being an increasing counter value. Each process uses the first unused socket counter value. Signed-off-by: Bruce Richardson --- lib/telemetry/telemetry.c | 45 +++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c index 5d38e90bcc..a7483167d4 100644 --- a/lib/telemetry/telemetry.c +++ b/lib/telemetry/telemetry.c @@ -467,14 +467,14 @@ create_socket(char *path) /* first check if we have a runtime dir */ if (stat(socket_dir, &st) < 0 || !S_ISDIR(st.st_mode)) { TMTY_LOG(ERR, "Cannot access DPDK runtime directory: %s\n", socket_dir); - goto error; + close(sock); + return -ENOENT; } /* check if current socket is active */ if (connect(sock, (void *)&sun, sizeof(sun)) == 0) { - TMTY_LOG(ERR, "Error binding telemetry socket, path already in use\n"); - TMTY_LOG(ERR, "Use '--file-prefix' to select a different socket path, or '--no-telemetry' to disable\n"); - goto error; + close(sock); + return -EADDRINUSE; } /* socket is not active, delete and attempt rebind */ @@ -482,23 +482,20 @@ create_socket(char *path) unlink(sun.sun_path); if (bind(sock, (void *) &sun, sizeof(sun)) < 0) { TMTY_LOG(ERR, "Error binding socket: %s\n", strerror(errno)); - goto error; + close(sock); + return -errno; /* if unlink failed, this will be -EADDRINUSE as above */ } } if (listen(sock, 1) < 0) { TMTY_LOG(ERR, "Error calling listen for socket: %s\n", strerror(errno)); unlink(sun.sun_path); - goto error; + close(sock); + return -errno; } TMTY_LOG(DEBUG, "Socket creation and binding ok\n"); return sock; - -error: - close(sock); - path[0] = 0; - return -1; } static void @@ -531,8 +528,10 @@ telemetry_legacy_init(void) return -1; } v1_socket.sock = create_socket(v1_socket.path); - if (v1_socket.sock < 0) + if (v1_socket.sock < 0) { + v1_socket.path[0] = '\0'; return -1; + } rc = pthread_create(&t_old, NULL, socket_listener, &v1_socket); if (rc != 0) { TMTY_LOG(ERR, "Error with create legcay socket thread: %s\n", @@ -553,7 +552,9 @@ telemetry_legacy_init(void) static int telemetry_v2_init(void) { + char spath[sizeof(v2_socket.path)]; pthread_t t_new; + short suffix = 0; int rc; v2_socket.num_clients = &v2_clients; @@ -564,15 +565,27 @@ telemetry_v2_init(void) rte_telemetry_register_cmd("/help", command_help, "Returns help text for a command. Parameters: string command"); v2_socket.fn = client_handler; - if (strlcpy(v2_socket.path, get_socket_path(socket_dir, 2), - sizeof(v2_socket.path)) >= sizeof(v2_socket.path)) { + if (strlcpy(spath, get_socket_path(socket_dir, 2), sizeof(spath)) >= sizeof(spath)) { TMTY_LOG(ERR, "Error with socket binding, path too long\n"); return -1; } + memcpy(v2_socket.path, spath, sizeof(v2_socket.path)); v2_socket.sock = create_socket(v2_socket.path); - if (v2_socket.sock < 0) - return -1; + while (v2_socket.sock < 0) { + /* bail out on unexpected error, or suffix wrap-around */ + if (v2_socket.sock != -EADDRINUSE || suffix < 0) { + v2_socket.path[0] = '\0'; /* clear socket path */ + return -1; + } + /* add a suffix to the path if the basic version fails */ + if (snprintf(v2_socket.path, sizeof(v2_socket.path), "%s:%d", + spath, ++suffix) >= (int)sizeof(v2_socket.path)) { + TMTY_LOG(ERR, "Error with socket binding, path too long\n"); + return -1; + } + v2_socket.sock = create_socket(v2_socket.path); + } rc = pthread_create(&t_new, NULL, socket_listener, &v2_socket); if (rc != 0) { TMTY_LOG(ERR, "Error with create socket thread: %s\n", -- 2.30.2