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:
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
5
.github/workflows/build-and-test.yml
vendored
5
.github/workflows/build-and-test.yml
vendored
@@ -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 != ''
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
|
||||||
|
@@ -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::
|
||||||
|
@@ -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
|
||||||
|
@@ -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::
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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>`__
|
||||||
|
@@ -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.
|
||||||
|
@@ -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
1
NEWS
@@ -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.
|
||||||
|
101
acinclude.m4
101
acinclude.m4
@@ -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
|
||||||
|
@@ -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
29
include/sparse/rte_mbuf.h
Normal 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>
|
28
include/sparse/rte_trace_point.h
Normal file
28
include/sparse/rte_trace_point.h
Normal 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>
|
@@ -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;
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user