From patchwork Fri Oct 8 17:18:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100824 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4DA79A0C43; Fri, 8 Oct 2021 19:19:18 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6C2EF4068F; Fri, 8 Oct 2021 19:19:16 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id D240F40140 for ; Fri, 8 Oct 2021 19:19:12 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10131"; a="207362113" X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="207362113" 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:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="523050391" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga001.jf.intel.com with ESMTP; 08 Oct 2021 10:19:02 -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:48 +0100 Message-Id: <20211008171852.736387-2-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 Subject: [dpdk-dev] [PATCH v7 1/5] eal: limit telemetry to primary processes 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" Telemetry interface should be exposed for primary processes only, since secondary processes will conflict on socket creation, and since all data in secondary process is generally available to primary. For example, all device stats for ethdevs, cryptodevs, etc. will all be common across processes. Signed-off-by: Bruce Richardson Acked-by: Ciara Power --- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index 6cee5ae369..b06a2c1662 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -946,7 +946,7 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Cannot clear runtime directory"); return -1; } - if (!internal_conf->no_telemetry) { + if (rte_eal_process_type() == RTE_PROC_PRIMARY && !internal_conf->no_telemetry) { int tlog = rte_log_register_type_and_pick_level( "lib.telemetry", RTE_LOG_WARNING); if (tlog < 0) diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 3577eaeaa4..0d0fc66668 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1320,7 +1320,7 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Cannot clear runtime directory"); return -1; } - if (!internal_conf->no_telemetry) { + if (rte_eal_process_type() == RTE_PROC_PRIMARY && !internal_conf->no_telemetry) { int tlog = rte_log_register_type_and_pick_level( "lib.telemetry", RTE_LOG_WARNING); if (tlog < 0) From patchwork Fri Oct 8 17:18:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100825 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D69F2A0C43; Fri, 8 Oct 2021 19:19:23 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 86DC1410DB; Fri, 8 Oct 2021 19:19:17 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id E27934067E for ; Fri, 8 Oct 2021 19:19:12 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10131"; a="207362120" X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="207362120" 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:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="523050400" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga001.jf.intel.com with ESMTP; 08 Oct 2021 10:19:04 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson , Conor Walsh Date: Fri, 8 Oct 2021 18:18:49 +0100 Message-Id: <20211008171852.736387-3-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 Subject: [dpdk-dev] [PATCH v7 2/5] telemetry: fix deletion of active sockets 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 DPDK is run with --in-memory mode, multiple processes can run simultaneously using the same runtime dir. This leads to each process, as it starts up, removing the telemetry socket of another process, giving unexpected behaviour. This patch changes that behaviour to first check if the existing socket is active. If not, it's an old socket to be cleaned up and can be removed. If it is active, telemetry initialization fails and an error message is printed out giving instructions on how to remove the error; either by using file-prefix to have a different runtime dir (and therefore socket path) or by disabling telemetry if it not needed. Fixes: 6dd571fd07c3 ("telemetry: introduce new functionality") Reported-by: David Marchand Signed-off-by: Bruce Richardson Acked-by: Ciara Power Tested-by: Conor Walsh --- lib/telemetry/telemetry.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c index 48f4c7ba46..5d38e90bcc 100644 --- a/lib/telemetry/telemetry.c +++ b/lib/telemetry/telemetry.c @@ -457,27 +457,47 @@ create_socket(char *path) struct sockaddr_un sun = {.sun_family = AF_UNIX}; strlcpy(sun.sun_path, path, sizeof(sun.sun_path)); - unlink(sun.sun_path); + TMTY_LOG(DEBUG, "Attempting socket bind to path '%s'\n", path); + if (bind(sock, (void *) &sun, sizeof(sun)) < 0) { struct stat st; - TMTY_LOG(ERR, "Error binding socket: %s\n", strerror(errno)); - if (stat(socket_dir, &st) < 0 || !S_ISDIR(st.st_mode)) + TMTY_LOG(DEBUG, "Initial bind to socket '%s' failed.\n", 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); - sun.sun_path[0] = 0; - goto error; + goto error; + } + + /* 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; + } + + /* socket is not active, delete and attempt rebind */ + TMTY_LOG(DEBUG, "Attempting unlink and retrying bind\n"); + unlink(sun.sun_path); + if (bind(sock, (void *) &sun, sizeof(sun)) < 0) { + TMTY_LOG(ERR, "Error binding socket: %s\n", strerror(errno)); + goto error; + } } if (listen(sock, 1) < 0) { TMTY_LOG(ERR, "Error calling listen for socket: %s\n", strerror(errno)); + unlink(sun.sun_path); goto error; } + TMTY_LOG(DEBUG, "Socket creation and binding ok\n"); return sock; error: close(sock); - unlink_sockets(); + path[0] = 0; return -1; } From patchwork Fri Oct 8 17:18:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100826 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org 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 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 Acked-by: Ciara Power --- 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", From patchwork Fri Oct 8 17:18:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100827 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 62B25A0C43; Fri, 8 Oct 2021 19:19:35 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9B169410F6; Fri, 8 Oct 2021 19:19:19 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id D94F44068F for ; Fri, 8 Oct 2021 19:19:13 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10131"; a="207362142" X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="207362142" 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:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="523050423" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga001.jf.intel.com with ESMTP; 08 Oct 2021 10:19:08 -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:51 +0100 Message-Id: <20211008171852.736387-5-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 Subject: [dpdk-dev] [PATCH v7 4/5] usertools/dpdk-telemetry: connect to separate instances 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" For processes run using "in-memory" mode sharing the same runtime dir, we add support for connecting to the separate instance sockets created using ":1", ":2" etc. via new "-i" or "--instance" argument. Add details on connecting to separate instances to the telemetry howto document. Signed-off-by: Bruce Richardson Acked-by: Ciara Power --- doc/guides/howto/telemetry.rst | 41 ++++++++++++++++++++++++++++++++++ usertools/dpdk-telemetry.py | 7 +++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/doc/guides/howto/telemetry.rst b/doc/guides/howto/telemetry.rst index 8f4fa1a510..c9b14a37b7 100644 --- a/doc/guides/howto/telemetry.rst +++ b/doc/guides/howto/telemetry.rst @@ -87,3 +87,44 @@ and query information using the telemetry client python script. --> /help,/ethdev/xstats {"/help": {"/ethdev/xstats": "Returns the extended stats for a port. Parameters: int port_id"}} + + +Connecting to Different DPDK Processes +-------------------------------------- + +When multiple DPDK process instances are running on a system, the user will +naturally wish to be able to select the instance to which the connection is +being made. The method to select the instance depends on how the individual +instances are run: + +* For DPDK processes run using a non-default file-prefix, + i.e. using the `--file-prefix` EAL option flag, + the file-prefix for the process should be passed via the `-f` or `--file-prefix` script flag. + + For example, to connect to testpmd run as:: + + $ ./build/app/dpdk-testpmd -l 2,3 --file-prefix="tpmd" + + One would use the telemetry script command:: + + $ ./usertools/dpdk-telemetry -f "tpmd" + +* For the case where multiple processes are run using the `--in-memory` EAL flag, + but no `-file-prefix` flag, or the same `-file-prefix` flag, + those processes will all share the same runtime directory. + In this case, + each process after the first will add an increasing count suffix to the telemetry socket name, + with the processees taking the first available free socket name. + This suffix count can be passed to the telemetry script using the `-i` or `--instance` flag. + + For example, if the following two applications are run in separate terminals:: + + $ ./build/app/dpdk-testpmd -l 2,3 --in-memory # will use socket "dpdk_telemetry.v2" + + $ ./build/app/test/dpdk-test -l 4,5 --in-memory # will use "dpdk_telemetry.v2:1" + + The following telemetry script commands would allow one to connect to each binary:: + + $ ./usertools/dpdk-telemetry.py # will connect to testpmd + + $ ./usertools/dpdk-telemetry.py -i 1 # will connect to test binary diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py index 2974a64732..ce27548c3e 100755 --- a/usertools/dpdk-telemetry.py +++ b/usertools/dpdk-telemetry.py @@ -112,6 +112,11 @@ def get_dpdk_runtime_dir(fp): parser = argparse.ArgumentParser() parser.add_argument('-f', '--file-prefix', default='rte', help='Provide file-prefix for DPDK runtime directory') +parser.add_argument('-i', '--instance', default='0', type=int, + help='Provide file-prefix for DPDK runtime directory') args = parser.parse_args() rd = get_dpdk_runtime_dir(args.file_prefix) -handle_socket(os.path.join(rd, 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION))) +sock_path = os.path.join(rd, 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION)) +if args.instance > 0: + sock_path += ":{}".format(args.instance) +handle_socket(sock_path) From patchwork Fri Oct 8 17:18:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100828 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 23C1CA0C43; Fri, 8 Oct 2021 19:19:42 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EE85D4111D; Fri, 8 Oct 2021 19:19:20 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id D9F08410E2 for ; Fri, 8 Oct 2021 19:19:17 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10131"; a="207362161" X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="207362161" 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:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,358,1624345200"; d="scan'208";a="523050437" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga001.jf.intel.com with ESMTP; 08 Oct 2021 10:19:09 -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:52 +0100 Message-Id: <20211008171852.736387-6-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 Subject: [dpdk-dev] [PATCH v7 5/5] usertools/dpdk-telemetry: provide info on available sockets 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 a user runs the dpdk-telemetry script and fails to connect because the socket path does not exist, run a scan for possible sockets that could be connected to and inform the user of the command needed to connect to those. For example: $ ./usertools/dpdk-telemetry.py -i4 Connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2:4 Error connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2:4 Other DPDK telemetry sockets found: - dpdk_telemetry.v2 # Connect with './usertools/dpdk-telemetry.py' - dpdk_telemetry.v2:2 # Connect with './usertools/dpdk-telemetry.py -i 2' - dpdk_telemetry.v2:1 # Connect with './usertools/dpdk-telemetry.py -i 1' Signed-off-by: Bruce Richardson Acked-by: Ciara Power --- usertools/dpdk-telemetry.py | 42 ++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py index ce27548c3e..da3ba60430 100755 --- a/usertools/dpdk-telemetry.py +++ b/usertools/dpdk-telemetry.py @@ -10,6 +10,7 @@ import socket import os import sys +import glob import json import errno import readline @@ -17,6 +18,8 @@ # global vars TELEMETRY_VERSION = "v2" +SOCKET_NAME = 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION) +DEFAULT_PREFIX = 'rte' CMDS = [] @@ -48,7 +51,28 @@ def get_app_name(pid): return None -def handle_socket(path): +def find_sockets(path): + """ Find any possible sockets to connect to and return them """ + return glob.glob(os.path.join(path, SOCKET_NAME + '*')) + + +def print_socket_options(prefix, paths): + """ Given a set of socket paths, give the commands needed to connect """ + cmd = sys.argv[0] + if prefix != DEFAULT_PREFIX: + cmd += " -f " + prefix + for s in paths: + sock_name = os.path.basename(s) + if sock_name.endswith(TELEMETRY_VERSION): + print("- {} # Connect with '{}'".format(os.path.basename(s), + cmd)) + else: + print("- {} # Connect with '{} -i {}'".format(os.path.basename(s), + cmd, + s.split(':')[-1])) + + +def handle_socket(args, path): """ Connect to socket and handle user input """ prompt = '' # this evaluates to false in conditions sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) @@ -62,6 +86,15 @@ def handle_socket(path): except OSError: print("Error connecting to " + path) sock.close() + # if socket exists but is bad, or if non-interactive just return + if os.path.exists(path) or not prompt: + return + # if user didn't give a valid socket path, but there are + # some sockets, help the user out by printing how to connect + socks = find_sockets(os.path.dirname(path)) + if socks: + print("\nOther DPDK telemetry sockets found:") + print_socket_options(args.file_prefix, socks) return json_reply = read_socket(sock, 1024, prompt) output_buf_len = json_reply["max_output_len"] @@ -110,13 +143,12 @@ def get_dpdk_runtime_dir(fp): readline.set_completer_delims(readline.get_completer_delims().replace('/', '')) parser = argparse.ArgumentParser() -parser.add_argument('-f', '--file-prefix', default='rte', +parser.add_argument('-f', '--file-prefix', default=DEFAULT_PREFIX, help='Provide file-prefix for DPDK runtime directory') parser.add_argument('-i', '--instance', default='0', type=int, help='Provide file-prefix for DPDK runtime directory') args = parser.parse_args() -rd = get_dpdk_runtime_dir(args.file_prefix) -sock_path = os.path.join(rd, 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION)) +sock_path = os.path.join(get_dpdk_runtime_dir(args.file_prefix), SOCKET_NAME) if args.instance > 0: sock_path += ":{}".format(args.instance) -handle_socket(sock_path) +handle_socket(args, sock_path)