From patchwork Tue Oct 5 13:59:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100511 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 58328A0C4C; Tue, 5 Oct 2021 16:18:06 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8321141367; Tue, 5 Oct 2021 16:18:02 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id 2C760412D2 for ; Tue, 5 Oct 2021 16:18:00 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10128"; a="206563930" X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="206563930" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2021 06:59:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="488044088" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga008.jf.intel.com with ESMTP; 05 Oct 2021 06:59:18 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson Date: Tue, 5 Oct 2021 14:59:05 +0100 Message-Id: <20211005135909.726091-2-bruce.richardson@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135909.726091-1-bruce.richardson@intel.com> References: <20210915141030.23514-1-bruce.richardson@intel.com> <20211005135909.726091-1-bruce.richardson@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v6 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 Tue Oct 5 13:59:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100512 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 C4C30A0C4C; Tue, 5 Oct 2021 16:18:11 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9718A41383; Tue, 5 Oct 2021 16:18:04 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id 80EE54134B for ; Tue, 5 Oct 2021 16:18:01 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10128"; a="206563947" X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="206563947" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2021 06:59:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="488044099" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga008.jf.intel.com with ESMTP; 05 Oct 2021 06:59:21 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson Date: Tue, 5 Oct 2021 14:59:06 +0100 Message-Id: <20211005135909.726091-3-bruce.richardson@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135909.726091-1-bruce.richardson@intel.com> References: <20210915141030.23514-1-bruce.richardson@intel.com> <20211005135909.726091-1-bruce.richardson@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v6 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 | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c index 9021025a1b..bd804a25a9 100644 --- a/lib/telemetry/telemetry.c +++ b/lib/telemetry/telemetry.c @@ -457,19 +457,35 @@ 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)) + /* 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 */ + 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; } @@ -477,7 +493,7 @@ create_socket(char *path) error: close(sock); - unlink_sockets(); + path[0] = 0; return -1; } From patchwork Tue Oct 5 13:59:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100513 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 55D7DA0C4C; Tue, 5 Oct 2021 16:18:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A689841398; Tue, 5 Oct 2021 16:18:05 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id 0A8DA4137D for ; Tue, 5 Oct 2021 16:18:02 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10128"; a="206563956" X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="206563956" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2021 06:59:25 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="488044121" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga008.jf.intel.com with ESMTP; 05 Oct 2021 06:59:23 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson Date: Tue, 5 Oct 2021 14:59:07 +0100 Message-Id: <20211005135909.726091-4-bruce.richardson@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135909.726091-1-bruce.richardson@intel.com> References: <20210915141030.23514-1-bruce.richardson@intel.com> <20211005135909.726091-1-bruce.richardson@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v6 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 DPDK is run using "in-memory" flag, multiple processes can be run using the same file-prefix and hence the same runtime directory. To avoid problems with conflicting telemetry unix socket paths, we can put the pid of the process into the socket name. As with the existing telemetry socket files, these sockets are removed on normal program exit. Signed-off-by: Bruce Richardson Tested-by: Conor Walsh --- doc/guides/howto/telemetry.rst | 17 ++++++++++++++++- lib/eal/freebsd/eal.c | 1 + lib/eal/linux/eal.c | 1 + lib/telemetry/telemetry.c | 15 ++++++++++++--- lib/telemetry/telemetry_internal.h | 3 ++- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/doc/guides/howto/telemetry.rst b/doc/guides/howto/telemetry.rst index 8f4fa1a510..8a61302459 100644 --- a/doc/guides/howto/telemetry.rst +++ b/doc/guides/howto/telemetry.rst @@ -13,12 +13,27 @@ ethdev port list, and eal parameters. Telemetry Interface ------------------- -The :doc:`../prog_guide/telemetry_lib` opens a socket with path +For applications run normally, i.e. without the `--in-memory` EAL flag, +the :doc:`../prog_guide/telemetry_lib` opens a socket with path */dpdk_telemetry.*. The version represents the telemetry version, the latest is v2. For example, a client would connect to a socket with path */var/run/dpdk/\*/dpdk_telemetry.v2* (when the primary process is run by a root user). +For applications run with the `--in-memory` EAL flag, +the socket file is created with an additional suffix of the process PID. +This is because multiple independent DPDK processes can be run simultaneously +using the same runtime directory when *in-memory* mode is used. +For example, when a user with UID 1000 runs processes with in-memory mode, +we would find sockets available such as:: + + /run/user/1000/dpdk/rte/dpdk_telemetry.v2.1982 + /run/user/1000/dpdk/rte/dpdk_telemetry.v2.1935 + +Where `/run/user/` is the runtime directory for the user given by the +`$XDG_RUNTIME_DIR` environment variable, +and `rte` is the default DPDK file prefix used for a runtime directory. + Telemetry Initialization ------------------------ diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index b06a2c1662..ed39d10b4e 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -952,6 +952,7 @@ rte_eal_init(int argc, char **argv) if (tlog < 0) tlog = RTE_LOGTYPE_EAL; if (rte_telemetry_init(rte_eal_get_runtime_dir(), + internal_conf->in_memory | internal_conf->no_shconf, rte_version(), &internal_conf->ctrl_cpuset, rte_log, tlog) != 0) return -1; diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 0d0fc66668..9db4eb7913 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1326,6 +1326,7 @@ rte_eal_init(int argc, char **argv) if (tlog < 0) tlog = RTE_LOGTYPE_EAL; if (rte_telemetry_init(rte_eal_get_runtime_dir(), + internal_conf->in_memory | internal_conf->no_shconf, rte_version(), &internal_conf->ctrl_cpuset, rte_log, tlog) != 0) return -1; diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c index bd804a25a9..24441d100b 100644 --- a/lib/telemetry/telemetry.c +++ b/lib/telemetry/telemetry.c @@ -51,6 +51,7 @@ static struct socket v1_socket; /* socket for v1 telemetry */ static const char *telemetry_version; /* save rte_version */ static const char *socket_dir; /* runtime directory */ +static bool socket_uses_pid; /* for in-memory mode, we need different socket paths */ static rte_cpuset_t *thread_cpuset; static rte_log_fn rte_log_ptr; static uint32_t logtype; @@ -432,8 +433,14 @@ static inline char * get_socket_path(const char *runtime_dir, const int version) { static char path[PATH_MAX]; - snprintf(path, sizeof(path), "%s/dpdk_telemetry.v%d", - strlen(runtime_dir) ? runtime_dir : "/tmp", version); + if (!socket_uses_pid) + snprintf(path, sizeof(path), "%s/dpdk_telemetry.v%d", + strlen(runtime_dir) ? runtime_dir : "/tmp", version); + else + snprintf(path, sizeof(path), "%s/dpdk_telemetry.v%d.%u", + strlen(runtime_dir) ? runtime_dir : "/tmp", + version, + (unsigned int)getpid()); return path; } @@ -591,11 +598,13 @@ telemetry_v2_init(void) #endif /* !RTE_EXEC_ENV_WINDOWS */ int32_t -rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset, +rte_telemetry_init(const char *runtime_dir, bool in_memory, + const char *rte_version, rte_cpuset_t *cpuset, rte_log_fn log_fn, uint32_t registered_logtype) { telemetry_version = rte_version; socket_dir = runtime_dir; + socket_uses_pid = in_memory; /* for in-memory mode use pid in sock path for uniqueness */ thread_cpuset = cpuset; rte_log_ptr = log_fn; logtype = registered_logtype; diff --git a/lib/telemetry/telemetry_internal.h b/lib/telemetry/telemetry_internal.h index d085c492dc..d8fb37a633 100644 --- a/lib/telemetry/telemetry_internal.h +++ b/lib/telemetry/telemetry_internal.h @@ -109,7 +109,8 @@ typedef int (*rte_log_fn)(uint32_t level, uint32_t logtype, const char *format, */ __rte_internal int -rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset, +rte_telemetry_init(const char *runtime_dir, bool in_memory, + const char *rte_version, rte_cpuset_t *cpuset, rte_log_fn log_fn, uint32_t registered_logtype); #endif From patchwork Tue Oct 5 13:59:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100514 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 246C8A0C4C; Tue, 5 Oct 2021 16:18:25 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 27E7F413B7; Tue, 5 Oct 2021 16:18:07 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id CFD074137D for ; Tue, 5 Oct 2021 16:18:03 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10128"; a="206563962" X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="206563962" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2021 06:59:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="488044127" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga008.jf.intel.com with ESMTP; 05 Oct 2021 06:59:25 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson Date: Tue, 5 Oct 2021 14:59:08 +0100 Message-Id: <20211005135909.726091-5-bruce.richardson@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135909.726091-1-bruce.richardson@intel.com> References: <20210915141030.23514-1-bruce.richardson@intel.com> <20211005135909.726091-1-bruce.richardson@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v6 4/5] usertools/dpdk-telemetry: connect to in-memory 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" Allow connecting to an in-memory process via "-p " flag, which can be used to identify the in-memory process to which to connect. Signed-off-by: Bruce Richardson Tested-by: Conor Walsh --- doc/guides/howto/telemetry.rst | 6 ++++++ usertools/dpdk-telemetry.py | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/guides/howto/telemetry.rst b/doc/guides/howto/telemetry.rst index 8a61302459..c3adca9504 100644 --- a/doc/guides/howto/telemetry.rst +++ b/doc/guides/howto/telemetry.rst @@ -63,6 +63,12 @@ and query information using the telemetry client python script. ./usertools/dpdk-telemetry.py + .. note:: + + When connecting to a process run with `--in-memory` EAL flag, + one must specify the PID of the process to connect to using the `-p` flag. + This is because there may be multiple such instances. + #. When connected, the script displays the following, waiting for user input:: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py index 2974a64732..690014ba9a 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('-p', '--pid', + help='Connect to DPDK process with the given pid') 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.pid: + sock_path += ".{}".format(args.pid) +handle_socket(sock_path) From patchwork Tue Oct 5 13:59:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 100515 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 27ED2A0C4C; Tue, 5 Oct 2021 16:18:31 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4ACD5413C0; Tue, 5 Oct 2021 16:18:08 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id EEAFD41383 for ; Tue, 5 Oct 2021 16:18:03 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10128"; a="206563970" X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="206563970" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2021 06:59:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,349,1624345200"; d="scan'208";a="488044144" Received: from silpixa00399126.ir.intel.com ([10.237.223.151]) by orsmga008.jf.intel.com with ESMTP; 05 Oct 2021 06:59:27 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Ciara Power , David Marchand , Anatoly Burakov , Kevin Traynor , Bruce Richardson Date: Tue, 5 Oct 2021 14:59:09 +0100 Message-Id: <20211005135909.726091-6-bruce.richardson@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135909.726091-1-bruce.richardson@intel.com> References: <20210915141030.23514-1-bruce.richardson@intel.com> <20211005135909.726091-1-bruce.richardson@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v6 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, when running the script without any parameters, but there are DPDK processes running with in-memory mode (so they need to be identified by PID), the error message will include the details of how to connect to each process: $ ./usertools/dpdk-telemetry.py Connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2 Error connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2 Other DPDK telemetry sockets found: - dpdk_telemetry.v2.20755 # Connect with './usertools/dpdk-telemetry.py -p 20755' - dpdk_telemetry.v2.20451 # Connect with './usertools/dpdk-telemetry.py -p 20451' Signed-off-by: Bruce Richardson Tested-by: Conor Walsh --- doc/guides/howto/telemetry.rst | 3 +++ usertools/dpdk-telemetry.py | 41 ++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/doc/guides/howto/telemetry.rst b/doc/guides/howto/telemetry.rst index c3adca9504..cdde57cb3b 100644 --- a/doc/guides/howto/telemetry.rst +++ b/doc/guides/howto/telemetry.rst @@ -68,6 +68,9 @@ and query information using the telemetry client python script. When connecting to a process run with `--in-memory` EAL flag, one must specify the PID of the process to connect to using the `-p` flag. This is because there may be multiple such instances. + If there are only *in-memory* DPDK processes to connect to, + and no PID, or an invalid PID parameter, is provided, + the telemetry script will list any available telemetry sockets and how to connect to them. #. When connected, the script displays the following, waiting for user input:: diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py index 690014ba9a..7f22e21828 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 '{} -p {}'".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,13 @@ 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('-p', '--pid', help='Connect to DPDK process with the given pid') 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(rd, SOCKET_NAME) if args.pid: sock_path += ".{}".format(args.pid) -handle_socket(sock_path) +handle_socket(args, sock_path)