2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 22:35:15 +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 VERSION_FILE="dpdk-dir/travis-dpdk-cache-version"
local DPDK_OPTS=""
local DPDK_LIB=""
if [ -z "$TRAVIS_ARCH" ] ||
[ "$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
TARGET="arm64-armv8a-linuxapp-gcc"
DPDK_LIB=$(pwd)/dpdk-dir/build/lib/aarch64-linux-gnu
else
echo "Target is unknown"
exit 1
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
# Avoid using cache for git tree build.
rm -rf dpdk-dir
@@ -110,7 +122,8 @@ function install_dpdk()
if [ -f "${VERSION_FILE}" ]; then
VER=$(cat ${VERSION_FILE})
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"
return
fi
@@ -124,23 +137,24 @@ function install_dpdk()
pushd dpdk-dir
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
sed -i '/CONFIG_RTE_BUILD_SHARED_LIB=n/s/=n/=y/' build/.config
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/$TARGET/lib
fi
# Disable building DPDK unit tests. Not needed for OVS build or tests.
DPDK_OPTS="$DPDK_OPTS -Dtests=false"
# Disable building DPDK kernel modules. Not needed for OVS build or tests.
sed -i '/CONFIG_RTE_EAL_IGB_UIO=y/s/=y/=n/' build/.config
sed -i '/CONFIG_RTE_KNI_KMOD=y/s/=y/=n/' build/.config
# Install DPDK using prefix.
DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
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)"
popd
echo "${DPDK_VER}" > ${VERSION_FILE}
@@ -187,7 +201,7 @@ fi
if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then
if [ -z "$DPDK_VER" ]; then
DPDK_VER="19.11.2"
DPDK_VER="20.11"
fi
install_dpdk $DPDK_VER
if [ "$CC" = "clang" ]; then

View File

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

View File

@@ -8,7 +8,8 @@ jobs:
dependencies: |
automake libtool gcc bc libjemalloc1 libjemalloc-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
deb_dependencies: |
linux-headers-$(uname -r) build-essential fakeroot devscripts equivs
@@ -146,7 +147,7 @@ jobs:
run: ./.ci/linux-prepare.sh
- 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
if: matrix.deb_package != ''

View File

@@ -24,6 +24,9 @@ addons:
- selinux-policy-dev
- libunbound-dev
- libunwind-dev
- python3-setuptools
- python3-wheel
- ninja-build
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
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:

View File

@@ -396,7 +396,7 @@ PVP using vhostuser device
--------------------------
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
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
vSwitch with DPDK will require the following:
- DPDK 19.11.2
- DPDK 20.11
- A `DPDK supported NIC`_
@@ -59,8 +59,10 @@ vSwitch with DPDK will require the following:
Detailed system requirements can be found at `DPDK requirements`_.
.. _DPDK supported NIC: http://dpdk.org/doc/nics
.. _DPDK requirements: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
.. _DPDK supported NIC: https://doc.dpdk.org/guides-20.11/nics/index.html
.. _DPDK requirements: https://doc.dpdk.org/guides-20.11/linux_gsg/sys_reqs.html
.. _dpdk-install:
Installing
----------
@@ -71,38 +73,44 @@ Install DPDK
#. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``::
$ cd /usr/src/
$ wget https://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz
$ tar xf dpdk-19.11.2.tar.xz
$ export DPDK_DIR=/usr/src/dpdk-stable-19.11.2
$ wget https://fast.dpdk.org/rel/dpdk-20.11.tar.xz
$ tar xf dpdk-20.11.tar.xz
$ export DPDK_DIR=/usr/src/dpdk-20.11
$ 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
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``.
Build and install the DPDK library::
$ 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::
Minor performance loss is expected when using OVS with a shared DPDK
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 documentation:
https://doc.dpdk.org/guides-20.11/linux_gsg/build_dpdk.html
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`
#. 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
skipped if DPDK library is installed in its default location.
$ ./configure --with-dpdk=static
If no path is provided to ``--with-dpdk``, but a pkg-config configuration
for libdpdk is available the include paths will be generated via an
equivalent ``pkg-config --cflags libdpdk``.
If OVS must consume DPDK shared libraries::
$ ./configure --with-dpdk=shared
.. note::
While ``--with-dpdk`` is required, you can pass any other configuration
@@ -703,7 +711,7 @@ Limitations
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
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>`__.
.. _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:
@@ -218,18 +218,24 @@ If the log is not seen then the port can be detached like so::
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.
With DPDK 19.11, if no device is bound to igb_uio when OVS is launched then
the IOVA mode may be set to virtual addressing for DPDK. This is incompatible
for hotplugging with igb_uio.
From DPDK v19.11 onwards, if no device is bound to igb_uio when OVS is
launched then the IOVA mode may be set to virtual addressing for DPDK.
This is incompatible for hotplugging with igb_uio.
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
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::
@@ -261,7 +267,7 @@ Representors are multi devices created on top of one PF.
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
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,
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::

View File

@@ -63,4 +63,4 @@ run::
More information on the different types of virtual DPDK PMDs can be found in
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
:ref:`dpdk-vhost-user-client`. Once started, connect to the VM, download the
DPDK sources to VM and build DPDK::
$ 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
DPDK sources to VM and build DPDK as described in :ref:`dpdk-install`.
Setup huge pages and DPDK devices using UIO::
@@ -555,4 +539,4 @@ shown with::
Further information can be found in the
`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`_.
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
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,
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
~~~~~~~~~~~~

1
NEWS
View File

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

View File

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

View File

@@ -11,7 +11,9 @@ noinst_HEADERS += \
include/sparse/netpacket/packet.h \
include/sparse/pthread.h \
include/sparse/rte_atomic.h \
include/sparse/rte_mbuf.h \
include/sparse/rte_memcpy.h \
include/sparse/rte_trace_point.h \
include/sparse/sys/socket.h \
include/sparse/sys/sysmacros.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
* lcore for the DPDK Master.
* main core.
*/
if (auto_determine) {
const struct ovs_numa_info_core *core;

View File

@@ -26,12 +26,6 @@
#include <sys/socket.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_config.h>
#include <rte_cycles.h>
@@ -1312,7 +1306,7 @@ static int
vhost_common_construct(struct netdev *netdev)
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);
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 rte_device *rte_dev;
struct rte_eth_dev *eth_dev;
bool remove_on_close;
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.
*/
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;
/* Remove the eth device. */
rte_eth_dev_close(dev->port_id);
/* Remove this rte device and all its eth devices if flag
* RTE_ETH_DEV_CLOSE_REMOVE is not supported (which means representors
* are not supported), or if all the eth devices belonging to the rte
* device are closed.
/* Remove this rte device and all its eth devices 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);
if (ret < 0) {