[ovs-dev] [PATCH v4] dpdk: Update to use DPDK v20.11.
Stokes, Ian
ian.stokes at intel.com
Wed Dec 16 13:00:20 UTC 2020
> From: Ian Stokes <ian.stokes at intel.com>
>
Thanks for working and sending this Sunil.
@Ilya, does this resolve your concerns WRT the pkg-config check and ARM build in travis?
Regards
Ian
> 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 at redhat.com>
> Co-authored-by: David Marchand <david.marchand at redhat.com>
> Signed-off-by: Sunil Pai G <sunil.pai.g at intel.com>
> Co-authored-by: Sunil Pai G <sunil.pai.g at intel.com>
> Signed-off-by: Eli Britstein <elibr at nvidia.com>
> Co-authored-by: Eli Britstein <elibr at nvidia.com>
> Tested-by: Harry van Haaren <harry.van.haaren at intel.com>
> Tested-by: Govindharajan, Hariprasad <hariprasad.govindharajan at intel.com>
> Signed-off-by: Ian Stokes <ian.stokes at intel.com>
>
> ---
> v3 -> v4
> * Update DPDK documentation links to 20.11
> * Add pkg-config output check when using static DPDK libs.
> * Change the regex to strip -march from DPDK for x86 and arm.
>
> v2 -> v3
> * Remove GHA others write removal.
> * Strip march from pkg-config h=which is forced by DPDK.
>
> RFC v1 -> v2
> * Removed RFC tag.
> * Rebased to head of master.
> * Modified GHA build scripts to install required python packages.
> * Modified URLs to use versioned 20.11 links.
> * Removed unrequired reformat in travis.yml.
> * Modified GHA worflow buil-and-test.yml to remove others write
> permission to $HOME in prepare step.
> ---
> .ci/linux-build.sh | 48 +++++++----
> .ci/linux-prepare.sh | 1 +
> .github/workflows/build-and-test.yml | 5 +-
> .travis.yml | 3 +
> Documentation/faq/releases.rst | 2 +-
> Documentation/intro/install/afxdp.rst | 2 +-
> Documentation/intro/install/dpdk.rst | 68 ++++++++-------
> Documentation/topics/dpdk/phy.rst | 22 +++--
> Documentation/topics/dpdk/vdev.rst | 2 +-
> Documentation/topics/dpdk/vhost-user.rst | 20 +----
> Documentation/topics/testing.rst | 2 +-
> Documentation/topics/userspace-tso.rst | 2 +-
> NEWS | 1 +
> acinclude.m4 | 102 ++++++++++++-----------
> include/sparse/automake.mk | 2 +
> include/sparse/rte_mbuf.h | 29 +++++++
> include/sparse/rte_trace_point.h | 28 +++++++
> lib/dpdk.c | 2 +-
> lib/netdev-dpdk.c | 20 +----
> 19 files changed, 217 insertions(+), 144 deletions(-)
> create mode 100644 include/sparse/rte_mbuf.h
> create mode 100644 include/sparse/rte_trace_point.h
>
> diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
> index 16102ac94..3e5136fd4 100755
> --- a/.ci/linux-build.sh
> +++ b/.ci/linux-build.sh
> @@ -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"
> +
> + # 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}
> @@ -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
> diff --git a/.ci/linux-prepare.sh b/.ci/linux-prepare.sh
> index fea905a83..69a40011f 100755
> --- a/.ci/linux-prepare.sh
> +++ b/.ci/linux-prepare.sh
> @@ -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.
> diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-
> and-test.yml
> index 847fd3150..c83066138 100644
> --- a/.github/workflows/build-and-test.yml
> +++ b/.github/workflows/build-and-test.yml
> @@ -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 != ''
> diff --git a/.travis.yml b/.travis.yml
> index acf3c10fb..51d051108 100644
> --- a/.travis.yml
> +++ b/.travis.yml
> @@ -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
>
> diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst
> index 3623e3f40..a52df2205 100644
> --- a/Documentation/faq/releases.rst
> +++ b/Documentation/faq/releases.rst
> @@ -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:
>
> diff --git a/Documentation/intro/install/afxdp.rst
> b/Documentation/intro/install/afxdp.rst
> index 3c8f78825..aad0aeebe 100644
> --- a/Documentation/intro/install/afxdp.rst
> +++ b/Documentation/intro/install/afxdp.rst
> @@ -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::
> diff --git a/Documentation/intro/install/dpdk.rst
> b/Documentation/intro/install/dpdk.rst
> index fe11571d2..a595417ce 100644
> --- a/Documentation/intro/install/dpdk.rst
> +++ b/Documentation/intro/install/dpdk.rst
> @@ -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::
>
> - .. 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.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:
> +
> + 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
> @@ -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
> diff --git a/Documentation/topics/dpdk/phy.rst
> b/Documentation/topics/dpdk/phy.rst
> index 7ee3eacff..986dbd38e 100644
> --- a/Documentation/topics/dpdk/phy.rst
> +++ b/Documentation/topics/dpdk/phy.rst
> @@ -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::
>
> diff --git a/Documentation/topics/dpdk/vdev.rst
> b/Documentation/topics/dpdk/vdev.rst
> index 1c0df7f4b..7bd48165e 100644
> --- a/Documentation/topics/dpdk/vdev.rst
> +++ b/Documentation/topics/dpdk/vdev.rst
> @@ -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
> diff --git a/Documentation/topics/dpdk/vhost-user.rst
> b/Documentation/topics/dpdk/vhost-user.rst
> index 75d3fc958..bcd51e65c 100644
> --- a/Documentation/topics/dpdk/vhost-user.rst
> +++ b/Documentation/topics/dpdk/vhost-user.rst
> @@ -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>`__
> diff --git a/Documentation/topics/testing.rst
> b/Documentation/topics/testing.rst
> index b9fa94dda..951fe9e85 100644
> --- a/Documentation/topics/testing.rst
> +++ b/Documentation/topics/testing.rst
> @@ -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.
> diff --git a/Documentation/topics/userspace-tso.rst
> b/Documentation/topics/userspace-tso.rst
> index 14a7c6fb3..bd64e7ed3 100644
> --- a/Documentation/topics/userspace-tso.rst
> +++ b/Documentation/topics/userspace-tso.rst
> @@ -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
> ~~~~~~~~~~~~
> diff --git a/NEWS b/NEWS
> index 7e291a180..1a39cc661 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -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.
> diff --git a/acinclude.m4 b/acinclude.m4
> index ddf4b71e1..eb0496c25 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -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,16 @@ 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
> diff --git a/include/sparse/automake.mk b/include/sparse/automake.mk
> index 974ad3fe5..e96637119 100644
> --- a/include/sparse/automake.mk
> +++ b/include/sparse/automake.mk
> @@ -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 \
> diff --git a/include/sparse/rte_mbuf.h b/include/sparse/rte_mbuf.h
> new file mode 100644
> index 000000000..981cdb441
> --- /dev/null
> +++ b/include/sparse/rte_mbuf.h
> @@ -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>
> diff --git a/include/sparse/rte_trace_point.h b/include/sparse/rte_trace_point.h
> new file mode 100644
> index 000000000..803923275
> --- /dev/null
> +++ b/include/sparse/rte_trace_point.h
> @@ -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>
> diff --git a/lib/dpdk.c b/lib/dpdk.c
> index 2f235a742..319540394 100644
> --- a/lib/dpdk.c
> +++ b/lib/dpdk.c
> @@ -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;
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 75dffefb8..2640a421a 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -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) {
> --
> 2.17.1
More information about the dev
mailing list