Re: [dpdk-dev] [PATCH v2] eal: fix querying DPDK version at runtime
From: David Marchand <hidden>
Date: 2021-03-17 08:41:10
On Tue, Feb 16, 2021 at 4:13 PM Bruce Richardson [off-list ref] wrote:
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.orgquoted hunk ↗ jump to hunk
diff --git a/lib/librte_eal/include/rte_version.h b/lib/librte_eal/include/rte_version.h index f7a3a1ebc..2f3f727b4 100644 --- a/lib/librte_eal/include/rte_version.h +++ b/lib/librte_eal/include/rte_version.h@@ -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())
It breaks SPDK and applications relying on RTE_VERSION in preprocessor directives. RTE_VERSION* macros should be left alone, and applications that need the runtime value should call rte_version(). See logs in https://lab.dpdk.org/results/dashboard/results/results-uploads/test_runs/2f636aaf4ce244eba20844f9ff006033/log_upload_file/2021/3/dpdk_6857cb635821_2021-03-17_06-34-34_NA.zip CC lib/env_dpdk/pci_virtio.o CC lib/env_dpdk/pci_vmd.o CC lib/env_dpdk/pci_idxd.o In file included from env_internal.h:42:0, from pci_vmd.c:34: /dpdk/build/include/rte_version.h:31:20: error: missing binary operator before token "(" rte_version_year(), \ ^ /dpdk/build/include/rte_version.h:25:36: note: in definition of macro 'RTE_VERSION_NUM' #define RTE_VERSION_NUM(a,b,c,d) ((a) << 24 | (b) << 16 | (c) << 8 | (d)) ^ env_internal.h:49:5: note: in expansion of macro 'RTE_VERSION' #if RTE_VERSION < RTE_VERSION_NUM(19, 11, 0, 0) ^~~~~~~~~~~ In file included from env_internal.h:42:0, from pci.c:34: /dpdk/build/include/rte_version.h:31:20: error: missing binary operator before token "(" rte_version_year(), \ ^ -- David Marchand