@@ -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
*<runtime_directory>/dpdk_telemetry.<version>*. 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/<uid>` 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
------------------------
@@ -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;
@@ -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;
@@ -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;
}
@@ -587,11 +594,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;
@@ -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