2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 15:55:19 +00:00

dpdk: Update to use DPDK v20.11.

This commit adds support for DPDK v20.11, it includes the following
changes.

1. travis: Remove explicit DPDK kmods configuration.
2. sparse: Fix build with 20.05 DPDK tracepoints.
3. netdev-dpdk: Remove experimental API flag.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=173216&state=*

4. sparse: Update to DPDK 20.05 trace point header.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=179604&state=*

5. sparse: Fix build with DPDK 20.08.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=200181&state=*

6. build: Add support for DPDK meson build.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=199138&state=*

7. netdev-dpdk: Remove usage of RTE_ETH_DEV_CLOSE_REMOVE flag.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=207850&state=*

8. netdev-dpdk: Fix build with 20.11-rc1.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=209006&state=*

9. sparse: Fix __ATOMIC_* redefinition errors

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=209452&state=*

10. build: Remove DPDK make build references.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=216682&state=*

For credit all authors of the original commits to 'dpdk-latest' with the
above changes have been added as co-authors for this commit.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Co-authored-by: David Marchand <david.marchand@redhat.com>
Signed-off-by: Sunil Pai G <sunil.pai.g@intel.com>
Co-authored-by: Sunil Pai G <sunil.pai.g@intel.com>
Signed-off-by: Eli Britstein <elibr@nvidia.com>
Co-authored-by: Eli Britstein <elibr@nvidia.com>
Tested-by: Harry van Haaren <harry.van.haaren@intel.com>
Tested-by: Govindharajan, Hariprasad <hariprasad.govindharajan@intel.com>
Tested-by: Tonghao Zhang <xiangxia.m.yue@gmail.com>
Acked-by: Ilya Maximets <i.maximets@ovn.org>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
This commit is contained in:
Ian Stokes
2020-12-15 16:41:28 +00:00
parent af06184705
commit 252e1e5764
19 changed files with 219 additions and 147 deletions

View File

@@ -87,17 +87,29 @@ function install_dpdk()
{ {
local DPDK_VER=$1 local DPDK_VER=$1
local VERSION_FILE="dpdk-dir/travis-dpdk-cache-version" local VERSION_FILE="dpdk-dir/travis-dpdk-cache-version"
local DPDK_OPTS=""
local DPDK_LIB=""
if [ -z "$TRAVIS_ARCH" ] || if [ -z "$TRAVIS_ARCH" ] ||
[ "$TRAVIS_ARCH" == "amd64" ]; then [ "$TRAVIS_ARCH" == "amd64" ]; then
TARGET="x86_64-native-linuxapp-gcc" DPDK_LIB=$(pwd)/dpdk-dir/build/lib/x86_64-linux-gnu
elif [ "$TRAVIS_ARCH" == "aarch64" ]; then elif [ "$TRAVIS_ARCH" == "aarch64" ]; then
TARGET="arm64-armv8a-linuxapp-gcc" DPDK_LIB=$(pwd)/dpdk-dir/build/lib/aarch64-linux-gnu
else else
echo "Target is unknown" echo "Target is unknown"
exit 1 exit 1
fi fi
if [ "$DPDK_SHARED" ]; then
EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=shared"
export LD_LIBRARY_PATH=$DPDK_LIB/:$LD_LIBRARY_PATH
else
EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=static"
fi
# Export the following path for pkg-config to find the .pc file.
export PKG_CONFIG_PATH=$DPDK_LIB/pkgconfig/:$PKG_CONFIG_PATH
if [ "${DPDK_VER##refs/*/}" != "${DPDK_VER}" ]; then if [ "${DPDK_VER##refs/*/}" != "${DPDK_VER}" ]; then
# Avoid using cache for git tree build. # Avoid using cache for git tree build.
rm -rf dpdk-dir rm -rf dpdk-dir
@@ -110,7 +122,8 @@ function install_dpdk()
if [ -f "${VERSION_FILE}" ]; then if [ -f "${VERSION_FILE}" ]; then
VER=$(cat ${VERSION_FILE}) VER=$(cat ${VERSION_FILE})
if [ "${VER}" = "${DPDK_VER}" ]; then if [ "${VER}" = "${DPDK_VER}" ]; then
EXTRA_OPTS="${EXTRA_OPTS} --with-dpdk=$(pwd)/dpdk-dir/build" # Update the library paths.
sudo ldconfig
echo "Found cached DPDK ${VER} build in $(pwd)/dpdk-dir" echo "Found cached DPDK ${VER} build in $(pwd)/dpdk-dir"
return return
fi fi
@@ -124,23 +137,24 @@ function install_dpdk()
pushd dpdk-dir pushd dpdk-dir
fi fi
make config CC=gcc T=$TARGET # Switching to 'default' machine to make dpdk-dir cache usable on
# different CPUs. We can't be sure that all CI machines are exactly same.
DPDK_OPTS="$DPDK_OPTS -Dmachine=default"
if [ "$DPDK_SHARED" ]; then # Disable building DPDK unit tests. Not needed for OVS build or tests.
sed -i '/CONFIG_RTE_BUILD_SHARED_LIB=n/s/=n/=y/' build/.config DPDK_OPTS="$DPDK_OPTS -Dtests=false"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/$TARGET/lib
fi
# Disable building DPDK kernel modules. Not needed for OVS build or tests. # Install DPDK using prefix.
sed -i '/CONFIG_RTE_EAL_IGB_UIO=y/s/=y/=n/' build/.config DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
sed -i '/CONFIG_RTE_KNI_KMOD=y/s/=y/=n/' build/.config
CC=gcc meson $DPDK_OPTS build
ninja -C build
ninja -C build install
# Update the library paths.
sudo ldconfig
# Switching to 'default' machine to make dpdk-dir cache usable on different
# CPUs. We can't be sure that all CI machines are exactly same.
sed -i '/CONFIG_RTE_MACHINE="native"/s/="native"/="default"/' build/.config
make -j4 CC=gcc EXTRA_CFLAGS='-fPIC'
EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=$(pwd)/build"
echo "Installed DPDK source in $(pwd)" echo "Installed DPDK source in $(pwd)"
popd popd
echo "${DPDK_VER}" > ${VERSION_FILE} echo "${DPDK_VER}" > ${VERSION_FILE}
@@ -187,7 +201,7 @@ fi
if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then
if [ -z "$DPDK_VER" ]; then if [ -z "$DPDK_VER" ]; then
DPDK_VER="19.11.2" DPDK_VER="20.11"
fi fi
install_dpdk $DPDK_VER install_dpdk $DPDK_VER
if [ "$CC" = "clang" ]; then if [ "$CC" = "clang" ]; then

View File

@@ -22,6 +22,7 @@ cd ..
pip3 install --disable-pip-version-check --user flake8 hacking pip3 install --disable-pip-version-check --user flake8 hacking
pip3 install --user --upgrade docutils pip3 install --user --upgrade docutils
pip3 install --user 'meson==0.47.1'
if [ "$M32" ]; then if [ "$M32" ]; then
# Installing 32-bit libraries. # Installing 32-bit libraries.

View File

@@ -8,7 +8,8 @@ jobs:
dependencies: | dependencies: |
automake libtool gcc bc libjemalloc1 libjemalloc-dev \ automake libtool gcc bc libjemalloc1 libjemalloc-dev \
libssl-dev llvm-dev libelf-dev libnuma-dev libpcap-dev \ libssl-dev llvm-dev libelf-dev libnuma-dev libpcap-dev \
python3-openssl python3-pip python3-sphinx \ ninja-build python3-openssl python3-pip \
python3-setuptools python3-sphinx python3-wheel \
selinux-policy-dev selinux-policy-dev
deb_dependencies: | deb_dependencies: |
linux-headers-$(uname -r) build-essential fakeroot devscripts equivs linux-headers-$(uname -r) build-essential fakeroot devscripts equivs
@@ -146,7 +147,7 @@ jobs:
run: ./.ci/linux-prepare.sh run: ./.ci/linux-prepare.sh
- name: build - name: build
run: PATH="$PATH:$HOME/bin" ./.ci/linux-build.sh run: PATH="$PATH:$HOME/bin:$HOME/.local/bin" ./.ci/linux-build.sh
- name: upload deb packages - name: upload deb packages
if: matrix.deb_package != '' if: matrix.deb_package != ''

View File

@@ -24,6 +24,9 @@ addons:
- selinux-policy-dev - selinux-policy-dev
- libunbound-dev - libunbound-dev
- libunwind-dev - libunwind-dev
- python3-setuptools
- python3-wheel
- ninja-build
before_install: ./.ci/${TRAVIS_OS_NAME}-prepare.sh before_install: ./.ci/${TRAVIS_OS_NAME}-prepare.sh

View File

@@ -214,7 +214,7 @@ Q: Are all the DPDK releases that OVS versions work with maintained?
The latest information about DPDK stable and LTS releases can be found The latest information about DPDK stable and LTS releases can be found
at `DPDK stable`_. at `DPDK stable`_.
.. _DPDK stable: http://dpdk.org/doc/guides/contributing/stable.html .. _DPDK stable: http://doc.dpdk.org/guides-20.11/contributing/stable.html
Q: I get an error like this when I configure Open vSwitch: Q: I get an error like this when I configure Open vSwitch:

View File

@@ -396,7 +396,7 @@ PVP using vhostuser device
-------------------------- --------------------------
First, build OVS with DPDK and AFXDP:: First, build OVS with DPDK and AFXDP::
./configure --enable-afxdp --with-dpdk=<dpdk path> ./configure --enable-afxdp --with-dpdk=shared|static
make -j4 && make install make -j4 && make install
Create a vhost-user port from OVS:: Create a vhost-user port from OVS::

View File

@@ -42,7 +42,7 @@ Build requirements
In addition to the requirements described in :doc:`general`, building Open In addition to the requirements described in :doc:`general`, building Open
vSwitch with DPDK will require the following: vSwitch with DPDK will require the following:
- DPDK 19.11.2 - DPDK 20.11
- A `DPDK supported NIC`_ - A `DPDK supported NIC`_
@@ -59,8 +59,10 @@ vSwitch with DPDK will require the following:
Detailed system requirements can be found at `DPDK requirements`_. Detailed system requirements can be found at `DPDK requirements`_.
.. _DPDK supported NIC: http://dpdk.org/doc/nics .. _DPDK supported NIC: https://doc.dpdk.org/guides-20.11/nics/index.html
.. _DPDK requirements: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html .. _DPDK requirements: https://doc.dpdk.org/guides-20.11/linux_gsg/sys_reqs.html
.. _dpdk-install:
Installing Installing
---------- ----------
@@ -71,38 +73,44 @@ Install DPDK
#. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``:: #. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``::
$ cd /usr/src/ $ cd /usr/src/
$ wget https://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz $ wget https://fast.dpdk.org/rel/dpdk-20.11.tar.xz
$ tar xf dpdk-19.11.2.tar.xz $ tar xf dpdk-20.11.tar.xz
$ export DPDK_DIR=/usr/src/dpdk-stable-19.11.2 $ export DPDK_DIR=/usr/src/dpdk-20.11
$ cd $DPDK_DIR $ cd $DPDK_DIR
#. (Optional) Configure DPDK as a shared library #. Configure and install DPDK using Meson
DPDK can be built as either a static library or a shared library. By Build and install the DPDK library::
default, it is configured for the former. If you wish to use the latter, set
``CONFIG_RTE_BUILD_SHARED_LIB=y`` in ``$DPDK_DIR/config/common_base``. $ export DPDK_BUILD=$DPDK_DIR/build
$ meson build
$ ninja -C build
$ sudo ninja -C build install
$ sudo ldconfig
Detailed information can be found at `DPDK documentation`_.
#. (Optional) Configure and export the DPDK shared library location
Since DPDK is built both as static and shared library by default, no extra
configuration is required for the build.
Exporting the path to library is not necessary if the DPDK libraries are
system installed. For libraries installed using a prefix, export the path
to this library and also update the $PKG_CONFIG_PATH for use
before building OVS::
$ export LD_LIBRARY_PATH=/path/to/installed/DPDK/libraries
$ export PKG_CONFIG_PATH=/path/to/installed/".pc" file/for/DPDK
.. note:: .. note::
Minor performance loss is expected when using OVS with a shared DPDK Minor performance loss is expected when using OVS with a shared DPDK
library compared to a static DPDK library. library compared to a static DPDK library.
#. Configure and install DPDK
Build and install the DPDK library::
$ export DPDK_TARGET=x86_64-native-linuxapp-gcc
$ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
$ make install T=$DPDK_TARGET DESTDIR=install
#. (Optional) Export the DPDK shared library location
If DPDK was built as a shared library, export the path to this library for
use when building OVS::
$ export LD_LIBRARY_PATH=$DPDK_DIR/x86_64-native-linuxapp-gcc/lib
.. _DPDK sources: http://dpdk.org/rel .. _DPDK sources: http://dpdk.org/rel
.. _DPDK documentation:
https://doc.dpdk.org/guides-20.11/linux_gsg/build_dpdk.html
Install OVS Install OVS
~~~~~~~~~~~ ~~~~~~~~~~~
@@ -121,16 +129,16 @@ has to be configured to build against the DPDK library (``--with-dpdk``).
#. Bootstrap, if required, as described in :ref:`general-bootstrapping` #. Bootstrap, if required, as described in :ref:`general-bootstrapping`
#. Configure the package using the ``--with-dpdk`` flag:: #. Configure the package using the ``--with-dpdk`` flag:
$ ./configure --with-dpdk=$DPDK_BUILD If OVS must consume DPDK static libraries
(also equivalent to ``--with-dpdk=yes`` )::
where ``DPDK_BUILD`` is the path to the built DPDK library. This can be $ ./configure --with-dpdk=static
skipped if DPDK library is installed in its default location.
If no path is provided to ``--with-dpdk``, but a pkg-config configuration If OVS must consume DPDK shared libraries::
for libdpdk is available the include paths will be generated via an
equivalent ``pkg-config --cflags libdpdk``. $ ./configure --with-dpdk=shared
.. note:: .. note::
While ``--with-dpdk`` is required, you can pass any other configuration While ``--with-dpdk`` is required, you can pass any other configuration
@@ -703,7 +711,7 @@ Limitations
release notes`_. release notes`_.
.. _DPDK release notes: .. _DPDK release notes:
https://doc.dpdk.org/guides-19.11/rel_notes/release_19_11.html https://doc.dpdk.org/guides-20.11/rel_notes/release_20_11.html
- Upper bound MTU: DPDK device drivers differ in how the L2 frame for a - Upper bound MTU: DPDK device drivers differ in how the L2 frame for a
given MTU value is calculated e.g. i40e driver includes 2 x vlan headers in given MTU value is calculated e.g. i40e driver includes 2 x vlan headers in

View File

@@ -117,7 +117,7 @@ tool::
For more information, refer to the `DPDK documentation <dpdk-drivers>`__. For more information, refer to the `DPDK documentation <dpdk-drivers>`__.
.. _dpdk-drivers: http://dpdk.org/doc/guides/linux_gsg/linux_drivers.html .. _dpdk-drivers: https://doc.dpdk.org/guides-20.11/linux_gsg/linux_drivers.html
.. _dpdk-phy-multiqueue: .. _dpdk-phy-multiqueue:
@@ -218,18 +218,24 @@ If the log is not seen then the port can be detached like so::
Hotplugging with IGB_UIO Hotplugging with IGB_UIO
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
As of DPDK 19.11, default igb_uio hotplugging behavior changes from .. important::
As of DPDK v20.11 IGB_UIO has been deprecated and is no longer built as
part of the default DPDK library. Below is intended for those who wish
to use IGB_UIO outside of the standard DPDK build from v20.11 onwards.
As of DPDK v19.11, default igb_uio hotplugging behavior changed from
previous DPDK versions. previous DPDK versions.
With DPDK 19.11, if no device is bound to igb_uio when OVS is launched then From DPDK v19.11 onwards, if no device is bound to igb_uio when OVS is
the IOVA mode may be set to virtual addressing for DPDK. This is incompatible launched then the IOVA mode may be set to virtual addressing for DPDK.
for hotplugging with igb_uio. This is incompatible for hotplugging with igb_uio.
To hotplug a port with igb_uio in this case, DPDK must be configured to use To hotplug a port with igb_uio in this case, DPDK must be configured to use
physical addressing for IOVA mode. For more information regarding IOVA modes physical addressing for IOVA mode. For more information regarding IOVA modes
in DPDK please refer to the `DPDK IOVA Mode Detection`__. in DPDK please refer to the `DPDK IOVA Mode Detection`__.
__ https://doc.dpdk.org/guides-19.11/prog_guide/env_abstraction_layer.html#iova-mode-detection __ https://doc.dpdk.org/guides-20.11/prog_guide/env_abstraction_layer.html#iova-mode-detection
To configure OVS DPDK to use physical addressing for IOVA:: To configure OVS DPDK to use physical addressing for IOVA::
@@ -261,7 +267,7 @@ Representors are multi devices created on top of one PF.
For more information, refer to the `DPDK documentation`__. For more information, refer to the `DPDK documentation`__.
__ https://doc.dpdk.org/guides-19.11/prog_guide/switch_representation.html __ https://doc.dpdk.org/guides-20.11/prog_guide/switch_representation.html
Prior to port representors there was a one-to-one relationship between the PF Prior to port representors there was a one-to-one relationship between the PF
and the eth device. With port representors the relationship becomes one PF to and the eth device. With port representors the relationship becomes one PF to
@@ -395,7 +401,7 @@ in the ``options`` column of the ``Interface`` table.
kernel netdevice, and be inherited from it when Open vSwitch is restarted, kernel netdevice, and be inherited from it when Open vSwitch is restarted,
even if the options described in this section are unset from Open vSwitch. even if the options described in this section are unset from Open vSwitch.
.. _bifurcated-drivers: http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html#bifurcated-driver .. _bifurcated-drivers: https://doc.dpdk.org/guides-20.11/linux_gsg/linux_drivers.html#bifurcated-driver
- Configure the VF MAC address:: - Configure the VF MAC address::

View File

@@ -63,4 +63,4 @@ run::
More information on the different types of virtual DPDK PMDs can be found in More information on the different types of virtual DPDK PMDs can be found in
the `DPDK documentation`__. the `DPDK documentation`__.
__ http://dpdk.org/doc/guides/nics/overview.html __ https://doc.dpdk.org/guides-20.11/nics/overview.html

View File

@@ -389,23 +389,7 @@ application in the VM.
To begin, instantiate a guest as described in :ref:`dpdk-vhost-user` or To begin, instantiate a guest as described in :ref:`dpdk-vhost-user` or
:ref:`dpdk-vhost-user-client`. Once started, connect to the VM, download the :ref:`dpdk-vhost-user-client`. Once started, connect to the VM, download the
DPDK sources to VM and build DPDK:: DPDK sources to VM and build DPDK as described in :ref:`dpdk-install`.
$ cd /root/dpdk/
$ wget https://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz
$ tar xf dpdk-19.11.2.tar.xz
$ export DPDK_DIR=/root/dpdk/dpdk-stable-19.11.2
$ export DPDK_TARGET=x86_64-native-linuxapp-gcc
$ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
$ cd $DPDK_DIR
$ make install T=$DPDK_TARGET DESTDIR=install
Build the test-pmd application::
$ cd app/test-pmd
$ export RTE_SDK=$DPDK_DIR
$ export RTE_TARGET=$DPDK_TARGET
$ make
Setup huge pages and DPDK devices using UIO:: Setup huge pages and DPDK devices using UIO::
@@ -555,4 +539,4 @@ shown with::
Further information can be found in the Further information can be found in the
`DPDK documentation `DPDK documentation
<https://doc.dpdk.org/guides-19.11/prog_guide/vhost_lib.html>`__ <https://doc.dpdk.org/guides-20.11/prog_guide/vhost_lib.html>`__

View File

@@ -353,7 +353,7 @@ All tests are skipped if no hugepages are configured. User must look into the DP
manual to figure out how to `Configure hugepages`_. manual to figure out how to `Configure hugepages`_.
The phy test will skip if no compatible physical device is available. The phy test will skip if no compatible physical device is available.
.. _Configure hugepages: https://doc.dpdk.org/guides-19.11/linux_gsg/sys_reqs.html .. _Configure hugepages: https://doc.dpdk.org/guides-20.11/linux_gsg/sys_reqs.html
All the features documented under `Unit Tests`_ are available for the DPDK All the features documented under `Unit Tests`_ are available for the DPDK
datapath testsuite. datapath testsuite.

View File

@@ -46,7 +46,7 @@ datasheet for compatibility. Secondly, the NIC must have an associated DPDK
Poll Mode Driver (PMD) which supports `TSO`. For a list of features per PMD, Poll Mode Driver (PMD) which supports `TSO`. For a list of features per PMD,
refer to the `DPDK documentation`__. refer to the `DPDK documentation`__.
__ https://doc.dpdk.org/guides-19.11/nics/overview.html __ https://doc.dpdk.org/guides-20.11/nics/overview.html
Enabling TSO Enabling TSO
~~~~~~~~~~~~ ~~~~~~~~~~~~

1
NEWS
View File

@@ -11,6 +11,7 @@ Post-v2.14.0
Use the 'cluster/set-backlog-threshold' command to change limits. Use the 'cluster/set-backlog-threshold' command to change limits.
- DPDK: - DPDK:
* Removed support for vhost-user dequeue zero-copy. * Removed support for vhost-user dequeue zero-copy.
* Add support for DPDK 20.11.
- Userspace datapath: - Userspace datapath:
* Add the 'pmd' option to "ovs-appctl dpctl/dump-flows", which * Add the 'pmd' option to "ovs-appctl dpctl/dump-flows", which
restricts a flow dump to a single PMD thread if set. restricts a flow dump to a single PMD thread if set.

View File

@@ -334,8 +334,9 @@ dnl
dnl Configure DPDK source tree dnl Configure DPDK source tree
AC_DEFUN([OVS_CHECK_DPDK], [ AC_DEFUN([OVS_CHECK_DPDK], [
AC_ARG_WITH([dpdk], AC_ARG_WITH([dpdk],
[AC_HELP_STRING([--with-dpdk=/path/to/dpdk], [AC_HELP_STRING([--with-dpdk=static|shared|yes],
[Specify the DPDK build directory])], [Specify "static" or "shared" depending on the
DPDK libraries to use])],
[have_dpdk=true]) [have_dpdk=true])
AC_MSG_CHECKING([whether dpdk is enabled]) AC_MSG_CHECKING([whether dpdk is enabled])
@@ -345,35 +346,45 @@ AC_DEFUN([OVS_CHECK_DPDK], [
else else
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
case "$with_dpdk" in case "$with_dpdk" in
yes) "shared")
DPDK_AUTO_DISCOVER="true" PKG_CHECK_MODULES([DPDK], [libdpdk], [
PKG_CHECK_MODULES_STATIC([DPDK], [libdpdk], [ DPDK_INCLUDE="$DPDK_CFLAGS"
DPDK_INCLUDE="$DPDK_CFLAGS" DPDK_LIB="$DPDK_LIBS"], [
DPDK_LIB="$DPDK_LIBS"], [ DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk" DPDK_LIB="-ldpdk"])
DPDK_LIB="-ldpdk"]) ;;
;; "static" | "yes")
*) PKG_CHECK_MODULES_STATIC([DPDK], [libdpdk], [
DPDK_AUTO_DISCOVER="false" DPDK_INCLUDE="$DPDK_CFLAGS"
DPDK_INCLUDE_PATH="$with_dpdk/include" DPDK_LIB="$DPDK_LIBS"], [
# If 'with_dpdk' is passed install directory, point to headers DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
# installed in $DESTDIR/$prefix/include/dpdk DPDK_LIB="-ldpdk"])
if test -e "$DPDK_INCLUDE_PATH/rte_config.h"; then
DPDK_INCLUDE="-I$DPDK_INCLUDE_PATH" dnl Statically linked private DPDK objects of form
elif test -e "$DPDK_INCLUDE_PATH/dpdk/rte_config.h"; then dnl -l:file.a must be positioned between
DPDK_INCLUDE="-I$DPDK_INCLUDE_PATH/dpdk" dnl --whole-archive ... --no-whole-archive linker parameters.
fi dnl Old pkg-config versions misplace --no-whole-archive parameter
DPDK_LIB_DIR="$with_dpdk/lib" dnl and put it next to --whole-archive.
DPDK_LIB="-ldpdk" AC_MSG_CHECKING([for faulty pkg-config version])
;; echo "$DPDK_LIB" | grep -q 'whole-archive.*l:lib.*no-whole-archive'
status=$?
case $status in
0)
AC_MSG_RESULT([no])
;;
1)
AC_MSG_RESULT([yes])
AC_MSG_ERROR([Please upgrade pkg-config])
;;
*)
AC_MSG_ERROR([grep exited with status $status])
;;
esac
esac esac
ovs_save_CFLAGS="$CFLAGS" ovs_save_CFLAGS="$CFLAGS"
ovs_save_LDFLAGS="$LDFLAGS" ovs_save_LDFLAGS="$LDFLAGS"
CFLAGS="$CFLAGS $DPDK_INCLUDE" CFLAGS="$CFLAGS $DPDK_INCLUDE"
if test "$DPDK_AUTO_DISCOVER" = "false"; then
LDFLAGS="$LDFLAGS -L${DPDK_LIB_DIR}"
fi
AC_CHECK_HEADERS([rte_config.h], [], [ AC_CHECK_HEADERS([rte_config.h], [], [
AC_MSG_ERROR([unable to find rte_config.h in $with_dpdk]) AC_MSG_ERROR([unable to find rte_config.h in $with_dpdk])
@@ -422,20 +433,18 @@ AC_DEFUN([OVS_CHECK_DPDK], [
[AC_MSG_RESULT([yes]) [AC_MSG_RESULT([yes])
DPDKLIB_FOUND=true], DPDKLIB_FOUND=true],
[AC_MSG_RESULT([no]) [AC_MSG_RESULT([no])
if test "$DPDK_AUTO_DISCOVER" = "true"; then AC_MSG_ERROR(m4_normalize([
AC_MSG_ERROR(m4_normalize([ Could not find DPDK library in default search path, update
Could not find DPDK library in default search path, Use --with-dpdk PKG_CONFIG_PATH for pkg-config to find the .pc file in
to specify the DPDK library installed in non-standard location])) non-standard location]))
else
AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
fi
]) ])
CFLAGS="$ovs_save_CFLAGS" CFLAGS="$ovs_save_CFLAGS"
LDFLAGS="$ovs_save_LDFLAGS" LDFLAGS="$ovs_save_LDFLAGS"
if test "$DPDK_AUTO_DISCOVER" = "false"; then # Stripping out possible instruction set specific configuration that DPDK
OVS_LDFLAGS="$OVS_LDFLAGS -L$DPDK_LIB_DIR" # forces in pkg-config since this could override user-specified options.
fi # It's enough to have -mssse3 to build with DPDK headers.
DPDK_INCLUDE=$(echo "$DPDK_INCLUDE" | sed 's/-march=[[^ ]]*//g')
OVS_CFLAGS="$OVS_CFLAGS $DPDK_INCLUDE" OVS_CFLAGS="$OVS_CFLAGS $DPDK_INCLUDE"
OVS_ENABLE_OPTION([-mssse3]) OVS_ENABLE_OPTION([-mssse3])
@@ -444,17 +453,15 @@ AC_DEFUN([OVS_CHECK_DPDK], [
# This happens because the rest of the DPDK code doesn't use any symbol in # This happens because the rest of the DPDK code doesn't use any symbol in
# the pmd driver objects, and the drivers register themselves using an # the pmd driver objects, and the drivers register themselves using an
# __attribute__((constructor)) function. # __attribute__((constructor)) function.
# # Wrap the DPDK libraries inside a single -Wl directive
# These options are specified inside a single -Wl directive to prevent # after comma separation to prevent autotools from reordering them.
# autotools from reordering them. DPDK_vswitchd_LDFLAGS=$(echo "$DPDK_LIB"| tr -s ' ' ',' | sed 's/-Wl,//g')
# # Replace -pthread with -lpthread for LD and remove the last extra comma.
# OTOH newer versions of dpdk pkg-config (generated with Meson) DPDK_vswitchd_LDFLAGS=$(echo "$DPDK_vswitchd_LDFLAGS"| sed 's/,$//' | \
# will already have flagged just the right set of libs with sed 's/-pthread/-lpthread/g')
# --whole-archive - in those cases do not wrap it once more. # Prepend "-Wl,".
case "$DPDK_LIB" in DPDK_vswitchd_LDFLAGS="-Wl,$DPDK_vswitchd_LDFLAGS"
*whole-archive*) DPDK_vswitchd_LDFLAGS=$DPDK_LIB;;
*) DPDK_vswitchd_LDFLAGS=-Wl,--whole-archive,$DPDK_LIB,--no-whole-archive
esac
AC_SUBST([DPDK_vswitchd_LDFLAGS]) AC_SUBST([DPDK_vswitchd_LDFLAGS])
AC_DEFINE([DPDK_NETDEV], [1], [System uses the DPDK module.]) AC_DEFINE([DPDK_NETDEV], [1], [System uses the DPDK module.])
fi fi

View File

@@ -11,7 +11,9 @@ noinst_HEADERS += \
include/sparse/netpacket/packet.h \ include/sparse/netpacket/packet.h \
include/sparse/pthread.h \ include/sparse/pthread.h \
include/sparse/rte_atomic.h \ include/sparse/rte_atomic.h \
include/sparse/rte_mbuf.h \
include/sparse/rte_memcpy.h \ include/sparse/rte_memcpy.h \
include/sparse/rte_trace_point.h \
include/sparse/sys/socket.h \ include/sparse/sys/socket.h \
include/sparse/sys/sysmacros.h \ include/sparse/sys/sysmacros.h \
include/sparse/sys/types.h \ include/sparse/sys/types.h \

29
include/sparse/rte_mbuf.h Normal file
View File

@@ -0,0 +1,29 @@
/* Copyright (c) 2020 Intel, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
/* sparse doesn't know about gcc atomic builtins. */
#ifndef __ATOMIC_ACQ_REL
#define __ATOMIC_ACQ_REL 0
#define __ATOMIC_RELAXED 1
#define __atomic_add_fetch(p, val, memorder) (*(p) = *(p) + (val))
#define __atomic_store_n(p, val, memorder) (*(p) = (val))
#endif
/* Get actual <rte_mbuf.h> definitions for us to annotate and build on. */
#include_next <rte_mbuf.h>

View File

@@ -0,0 +1,28 @@
/* Copyright 2020, Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
/* sparse doesn't know about gcc atomic builtins. */
#ifndef __ATOMIC_ACQUIRE
#define __ATOMIC_ACQUIRE 0
#define __atomic_load_n(p, memorder) *(p)
#endif
/* Get actual <rte_trace_point.h> definitions for us to annotate and
* build on. */
#include_next <rte_trace_point.h>

View File

@@ -443,7 +443,7 @@ dpdk_init__(const struct smap *ovs_other_config)
/** /**
* NOTE: This is an unsophisticated mechanism for determining the DPDK * NOTE: This is an unsophisticated mechanism for determining the DPDK
* lcore for the DPDK Master. * main core.
*/ */
if (auto_determine) { if (auto_determine) {
const struct ovs_numa_info_core *core; const struct ovs_numa_info_core *core;

View File

@@ -26,12 +26,6 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <linux/if.h> #include <linux/if.h>
/* Include rte_compat.h first to allow experimental API's needed for the
* rte_meter.h rfc4115 functions. Once they are no longer marked as
* experimental the #define and rte_compat.h include can be removed.
*/
#define ALLOW_EXPERIMENTAL_API
#include <rte_compat.h>
#include <rte_bus_pci.h> #include <rte_bus_pci.h>
#include <rte_config.h> #include <rte_config.h>
#include <rte_cycles.h> #include <rte_cycles.h>
@@ -1312,7 +1306,7 @@ static int
vhost_common_construct(struct netdev *netdev) vhost_common_construct(struct netdev *netdev)
OVS_REQUIRES(dpdk_mutex) OVS_REQUIRES(dpdk_mutex)
{ {
int socket_id = rte_lcore_to_socket_id(rte_get_master_lcore()); int socket_id = rte_lcore_to_socket_id(rte_get_main_lcore());
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
dev->vhost_rxq_enabled = dpdk_rte_mzalloc(OVS_VHOST_MAX_QUEUE_NUM * dev->vhost_rxq_enabled = dpdk_rte_mzalloc(OVS_VHOST_MAX_QUEUE_NUM *
@@ -1463,7 +1457,6 @@ netdev_dpdk_destruct(struct netdev *netdev)
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
struct rte_device *rte_dev; struct rte_device *rte_dev;
struct rte_eth_dev *eth_dev; struct rte_eth_dev *eth_dev;
bool remove_on_close;
ovs_mutex_lock(&dpdk_mutex); ovs_mutex_lock(&dpdk_mutex);
@@ -1475,20 +1468,15 @@ netdev_dpdk_destruct(struct netdev *netdev)
* FIXME: avoid direct access to DPDK internal array rte_eth_devices. * FIXME: avoid direct access to DPDK internal array rte_eth_devices.
*/ */
eth_dev = &rte_eth_devices[dev->port_id]; eth_dev = &rte_eth_devices[dev->port_id];
remove_on_close =
eth_dev->data &&
(eth_dev->data->dev_flags & RTE_ETH_DEV_CLOSE_REMOVE);
rte_dev = eth_dev->device; rte_dev = eth_dev->device;
/* Remove the eth device. */ /* Remove the eth device. */
rte_eth_dev_close(dev->port_id); rte_eth_dev_close(dev->port_id);
/* Remove this rte device and all its eth devices if flag /* Remove this rte device and all its eth devices if all the eth
* RTE_ETH_DEV_CLOSE_REMOVE is not supported (which means representors * devices belonging to the rte device are closed.
* are not supported), or if all the eth devices belonging to the rte
* device are closed.
*/ */
if (!remove_on_close || !netdev_dpdk_get_num_ports(rte_dev)) { if (!netdev_dpdk_get_num_ports(rte_dev)) {
int ret = rte_dev_remove(rte_dev); int ret = rte_dev_remove(rte_dev);
if (ret < 0) { if (ret < 0) {