diff mbox series

[ovs-dev,v5,1/1] dpdk: Update to use DPDK v20.11.

Message ID 1608142365-26215-1-git-send-email-ian.stokes@intel.com
State Accepted
Headers show
Series [ovs-dev,v5,1/1] dpdk: Update to use DPDK v20.11. | expand

Commit Message

Stokes, Ian Dec. 16, 2020, 6:12 p.m. UTC
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>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>

---
v4 -> v5
* Fixed indentation for pkg-config error message.
* Removed typo from pkg-config error message.
* Removed whitespace splitting comment.
---
 .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                             | 101 +++++++++++++++++--------------
 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, 216 insertions(+), 144 deletions(-)
 create mode 100644 include/sparse/rte_mbuf.h
 create mode 100644 include/sparse/rte_trace_point.h

Comments

Stokes, Ian Dec. 16, 2020, 6:29 p.m. UTC | #1
> 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>
> Signed-off-by: Ian Stokes <ian.stokes@intel.com>

Hi All,

Thanks for all the testing and reviewing on this patch.

@Ilya Maximets as discussed on the v4, I've made the requested changes, validated with GHA and travis and pushed to master.

https://github.com/istokes/ovs/actions/runs/426258913
https://travis-ci.com/github/istokes/ovs/builds/209170487

Regards
Ian
> 
> ---
> v4 -> v5
> * Fixed indentation for pkg-config error message.
> * Removed typo from pkg-config error message.
> * Removed whitespace splitting comment.
> ---
>  .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                             | 101 +++++++++++++++++--------------
>  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, 216 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..60871f67a 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,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
> 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.13.6
Ilya Maximets Dec. 16, 2020, 6:37 p.m. UTC | #2
On 12/16/20 7:29 PM, Stokes, Ian wrote:
>> 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>
>> Signed-off-by: Ian Stokes <ian.stokes@intel.com>
> 
> Hi All,
> 
> Thanks for all the testing and reviewing on this patch.
> 
> @Ilya Maximets as discussed on the v4, I've made the requested changes, validated with GHA and travis and pushed to master.
> 
> https://github.com/istokes/ovs/actions/runs/426258913
> https://travis-ci.com/github/istokes/ovs/builds/209170487

OK.  Thanks!

> 
> Regards
> Ian
diff mbox series

Patch

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..60871f67a 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,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
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) {