]> git.droids-corp.org - dpdk.git/commitdiff
eal: fix querying DPDK version at runtime
authorBruce Richardson <bruce.richardson@intel.com>
Tue, 16 Feb 2021 15:13:29 +0000 (15:13 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 15 Mar 2021 22:22:14 +0000 (23:22 +0100)
For using a DPDK application, such as OVS, which is dynamically linked, the
DPDK version in use should always report the actual version, not the
version used at build time. This incorrect behaviour can be seen by
building OVS against one version of DPDK and running it against a later
one. Using "ovs-vsctl list Open_vSwitch" to query basic info, the
dpdk_version returned will be the build version not the currently running
one - which can be verified using the DPDK telemetry library client.

  $ sudo ovs-vsctl list Open_vSwitch | grep dpdk_version
  dpdk_version        : "DPDK 20.11.0-rc4"

  $ echo quit | sudo dpdk-telemetry.py
  Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
  {"version": "DPDK 21.02.0-rc2", "pid": 405659, "max_output_len": 16384}
  -->

To fix this, we need to convert the rte_version() function, and any other
necessary parts of the rte_version.h, to be actual functions in EAL, not
just inlines/macros. The only complication in doing so is that telemetry
library cannot call rte_version() directly, and instead needs the version
string passed in on init.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
lib/librte_eal/common/meson.build
lib/librte_eal/common/rte_version.c [new file with mode: 0644]
lib/librte_eal/freebsd/eal.c
lib/librte_eal/include/rte_version.h
lib/librte_eal/linux/eal.c
lib/librte_eal/version.map
lib/librte_telemetry/rte_telemetry.h
lib/librte_telemetry/telemetry.c

index 39d4272976d2a85988bffe21c1739f9be88702ba..70bd854fec053769b06a898e0c30016f4ed25d6f 100644 (file)
@@ -36,6 +36,7 @@ if is_windows
                'rte_random.c',
                'rte_reciprocal.c',
                'rte_service.c',
+               'rte_version.c',
        )
        subdir_done()
 endif
@@ -79,6 +80,7 @@ sources += files(
        'rte_random.c',
        'rte_reciprocal.c',
        'rte_service.c',
+       'rte_version.c',
 )
 
 if is_linux
diff --git a/lib/librte_eal/common/rte_version.c b/lib/librte_eal/common/rte_version.c
new file mode 100644 (file)
index 0000000..4ae5d66
--- /dev/null
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2021 Intel Corporation
+ */
+
+#include <rte_version.h>
+
+const char *
+rte_version_prefix(void) { return RTE_VER_PREFIX; }
+
+unsigned int
+rte_version_year(void) { return RTE_VER_YEAR; }
+
+unsigned int
+rte_version_month(void) { return RTE_VER_MONTH; }
+
+unsigned int
+rte_version_minor(void) { return RTE_VER_MINOR; }
+
+const char *
+rte_version_suffix(void) { return RTE_VER_SUFFIX; }
+
+unsigned int
+rte_version_release(void) { return RTE_VER_RELEASE; }
+
+const char *
+rte_version(void)
+{
+       static char version[32];
+       if (version[0] != 0)
+               return version;
+       if (strlen(RTE_VER_SUFFIX) == 0)
+               snprintf(version, sizeof(version), "%s %d.%02d.%d",
+                               RTE_VER_PREFIX,
+                               RTE_VER_YEAR,
+                               RTE_VER_MONTH,
+                               RTE_VER_MINOR);
+               else
+                       snprintf(version, sizeof(version), "%s %d.%02d.%d%s%d",
+                               RTE_VER_PREFIX,
+                               RTE_VER_YEAR,
+                               RTE_VER_MONTH,
+                               RTE_VER_MINOR,
+                               RTE_VER_SUFFIX,
+                               RTE_VER_RELEASE);
+       return version;
+}
index e2cdad528376da48f6befc597ddee942f54024e4..62320d610fedd5f0bd7d1b73bb2ca7a6b68fbae8 100644 (file)
@@ -943,6 +943,7 @@ rte_eal_init(int argc, char **argv)
        if (!internal_conf->no_telemetry) {
                const char *error_str = NULL;
                if (rte_telemetry_init(rte_eal_get_runtime_dir(),
+                               rte_version(),
                                &internal_conf->ctrl_cpuset, &error_str)
                                != 0) {
                        rte_eal_init_alert(error_str);
index f7a3a1ebcfd8af50842387122e520146ecc61dea..2f3f727b46837de82c6176aef8e93983f1a24d32 100644 (file)
@@ -28,38 +28,47 @@ extern "C" {
  * All version numbers in one to compare with RTE_VERSION_NUM()
  */
 #define RTE_VERSION RTE_VERSION_NUM( \
-                       RTE_VER_YEAR, \
-                       RTE_VER_MONTH, \
-                       RTE_VER_MINOR, \
-                       RTE_VER_RELEASE)
+                       rte_version_year(), \
+                       rte_version_month(), \
+                       rte_version_minor(), \
+                       rte_version_release())
+
+/**
+ * Function to return DPDK version prefix string
+ */
+const char *rte_version_prefix(void);
+
+/**
+ * Function to return DPDK version year
+ */
+unsigned int rte_version_year(void);
+
+/**
+ * Function to return DPDK version month
+ */
+unsigned int rte_version_month(void);
+
+/**
+ * Function to return DPDK minor version number
+ */
+unsigned int rte_version_minor(void);
+
+/**
+ * Function to return DPDK version suffix for any release candidates
+ */
+const char *rte_version_suffix(void);
+
+/**
+ * Function to return DPDK version release candidate value
+ */
+unsigned int rte_version_release(void);
 
 /**
  * Function returning version string
  * @return
- *     string
+ *     DPDK version string
  */
-static inline const char *
-rte_version(void)
-{
-       static char version[32];
-       if (version[0] != 0)
-               return version;
-       if (strlen(RTE_VER_SUFFIX) == 0)
-               snprintf(version, sizeof(version), "%s %d.%02d.%d",
-                       RTE_VER_PREFIX,
-                       RTE_VER_YEAR,
-                       RTE_VER_MONTH,
-                       RTE_VER_MINOR);
-       else
-               snprintf(version, sizeof(version), "%s %d.%02d.%d%s%d",
-                       RTE_VER_PREFIX,
-                       RTE_VER_YEAR,
-                       RTE_VER_MONTH,
-                       RTE_VER_MINOR,
-                       RTE_VER_SUFFIX,
-                       RTE_VER_RELEASE);
-       return version;
-}
+const char *rte_version(void);
 
 #ifdef __cplusplus
 }
index 6c34ac89038690b268dfd9847817c45a1095d4d9..9ffb4b3314ba6b093e28be907df9164be6c12d7a 100644 (file)
@@ -1316,6 +1316,7 @@ rte_eal_init(int argc, char **argv)
        if (!internal_conf->no_telemetry) {
                const char *error_str = NULL;
                if (rte_telemetry_init(rte_eal_get_runtime_dir(),
+                               rte_version(),
                                &internal_conf->ctrl_cpuset, &error_str)
                                != 0) {
                        rte_eal_init_alert(error_str);
index fce90a112f3b3912374b999112c0b38f436d43c7..756c60ed1dd4925f85fb8f170bb3cea9779f4420 100644 (file)
@@ -199,6 +199,13 @@ DPDK_21 {
        rte_uuid_is_null;
        rte_uuid_parse;
        rte_uuid_unparse;
+       rte_version;
+       rte_version_minor;
+       rte_version_month;
+       rte_version_prefix;
+       rte_version_release;
+       rte_version_suffix;
+       rte_version_year;
        rte_vfio_clear_group;
        rte_vfio_container_create;
        rte_vfio_container_destroy;
index f8e54dc68e01dc76f9a6de7ffef9b72983a65d67..f7c8534b823607a172ec05ddadd49528fc840a17 100644 (file)
@@ -311,7 +311,7 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
  */
 __rte_internal
 int
-rte_telemetry_init(const char *runtime_dir, rte_cpuset_t *cpuset,
+rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset,
                const char **err_str);
 
 /**
index b142729da48b0a57a240bbe0c2bfca15ebb9dcb7..14b4ff5ea7cd12c7ef1d42a4c607bb95e36de664 100644 (file)
@@ -15,7 +15,6 @@
 #include <rte_string_fns.h>
 #include <rte_common.h>
 #include <rte_spinlock.h>
-#include <rte_version.h>
 
 #include "rte_telemetry.h"
 #include "telemetry_json.h"
@@ -48,6 +47,8 @@ struct socket {
 static struct socket v2_socket; /* socket for v2 telemetry */
 static struct socket v1_socket; /* socket for v1 telemetry */
 #endif /* !RTE_EXEC_ENV_WINDOWS */
+
+static const char *telemetry_version; /* save rte_version */
 static char telemetry_log_error[1024]; /* Will contain error on init failure */
 /* list of command callbacks, with one command registered by default */
 static struct cmd_callback callbacks[TELEMETRY_MAX_CALLBACKS];
@@ -105,7 +106,7 @@ json_info(const char *cmd __rte_unused, const char *params __rte_unused,
                struct rte_tel_data *d)
 {
        rte_tel_data_start_dict(d);
-       rte_tel_data_add_dict_string(d, "version", rte_version());
+       rte_tel_data_add_dict_string(d, "version", telemetry_version);
        rte_tel_data_add_dict_int(d, "pid", getpid());
        rte_tel_data_add_dict_int(d, "max_output_len", MAX_OUTPUT_LEN);
        return 0;
@@ -303,7 +304,7 @@ client_handler(void *sock_id)
        char info_str[1024];
        snprintf(info_str, sizeof(info_str),
                        "{\"version\":\"%s\",\"pid\":%d,\"max_output_len\":%d}",
-                       rte_version(), getpid(), MAX_OUTPUT_LEN);
+                       telemetry_version, getpid(), MAX_OUTPUT_LEN);
        if (write(s, info_str, strlen(info_str)) < 0) {
                close(s);
                return NULL;
@@ -481,9 +482,10 @@ telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
 int32_t
-rte_telemetry_init(const char *runtime_dir, rte_cpuset_t *cpuset,
-               const char **err_str)
+rte_telemetry_init(const char *runtime_dir, const char *rte_version,
+               rte_cpuset_t *cpuset, const char **err_str)
 {
+       telemetry_version = rte_version;
 #ifndef RTE_EXEC_ENV_WINDOWS
        if (telemetry_v2_init(runtime_dir, cpuset) != 0) {
                *err_str = telemetry_log_error;