Skip to content

Commit

Permalink
dpdk: Update to use DPDK v20.11.
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
Signed-off-by: 0-day Robot <robot@bytheb.org>
  • Loading branch information
4 people authored and ovsrobot committed Dec 2, 2020
1 parent fa57e9e commit 1d21726
Show file tree
Hide file tree
Showing 16 changed files with 190 additions and 138 deletions.
48 changes: 31 additions & 17 deletions .ci/linux-build.sh
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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"

# Install DPDK using prefix.
DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"

CC=gcc meson $DPDK_OPTS build
ninja -C build
ninja -C build install

# 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
# 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}
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions .ci/linux-prepare.sh
Expand Up @@ -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.
Expand Down
10 changes: 7 additions & 3 deletions .github/workflows/build-and-test.yml
Expand Up @@ -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
Expand Down Expand Up @@ -143,10 +144,13 @@ jobs:
run: sudo apt install -y libunbound-dev libunwind-dev

- name: prepare
run: ./.ci/linux-prepare.sh
run: |
./.ci/linux-prepare.sh
# Workaround on $HOME permissions as EAL checks them for plugin loading
chmod o-w $HOME
- 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 != ''
Expand Down
3 changes: 3 additions & 0 deletions .travis.yml
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion Documentation/intro/install/afxdp.rst
Expand Up @@ -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::
Expand Down
64 changes: 36 additions & 28 deletions Documentation/intro/install/dpdk.rst
Expand Up @@ -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`_

Expand All @@ -62,6 +62,8 @@ 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-install:

Installing
----------

Expand All @@ -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::

.. note::
$ export DPDK_BUILD=$DPDK_DIR/build
$ meson build
$ ninja -C build
$ sudo ninja -C build install
$ sudo ldconfig

Minor performance loss is expected when using OVS with a shared DPDK
library compared to a static DPDK library.
Detailed information can be found at `DPDK documentation`_.

#. Configure and install DPDK
#. (Optional) Configure and export the DPDK shared library location

Build and install the DPDK library::
Since DPDK is built both as static and shared library by default, no extra
configuration is required for the build.

$ export DPDK_TARGET=x86_64-native-linuxapp-gcc
$ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
$ make install T=$DPDK_TARGET DESTDIR=install
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::

#. (Optional) Export the DPDK shared library location
$ export LD_LIBRARY_PATH=/path/to/installed/DPDK/libraries
$ export PKG_CONFIG_PATH=/path/to/installed/".pc" file/for/DPDK

If DPDK was built as a shared library, export the path to this library for
use when building OVS::
.. note::

$ export LD_LIBRARY_PATH=$DPDK_DIR/x86_64-native-linuxapp-gcc/lib
Minor performance loss is expected when using OVS with a shared DPDK
library compared to a static DPDK library.

.. _DPDK sources: http://dpdk.org/rel
.. _DPDK documentation:
https://doc.dpdk.org/guides-20.08/linux_gsg/build_dpdk.html

Install OVS
~~~~~~~~~~~
Expand All @@ -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:

If OVS must consume DPDK static libraries
(also equivalent to ``--with-dpdk=yes`` )::

$ ./configure --with-dpdk=$DPDK_BUILD
$ ./configure --with-dpdk=static

where ``DPDK_BUILD`` is the path to the built DPDK library. This can be
skipped if DPDK library is installed in its default location.
If OVS must consume DPDK shared libraries::

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``.
$ ./configure --with-dpdk=shared

.. note::
While ``--with-dpdk`` is required, you can pass any other configuration
Expand Down Expand Up @@ -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
Expand Down
18 changes: 12 additions & 6 deletions Documentation/topics/dpdk/phy.rst
Expand Up @@ -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::

Expand Down Expand Up @@ -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
Expand Down
20 changes: 2 additions & 18 deletions Documentation/topics/dpdk/vhost-user.rst
Expand Up @@ -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::

Expand Down Expand Up @@ -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>`__
2 changes: 1 addition & 1 deletion Documentation/topics/testing.rst
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -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.
Expand Down

0 comments on commit 1d21726

Please sign in to comment.