diff mbox series

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

Message ID 1606344134-22809-1-git-send-email-ian.stokes@intel.com
State Changes Requested
Headers show
Series [ovs-dev,RFC,v1,1/1] dpdk: Update to use DPDK v20.11. | expand

Commit Message

Stokes, Ian Nov. 25, 2020, 10:42 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>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
---
 .travis.yml                              |  6 ++-
 .travis/linux-build.sh                   | 41 +++++++++++------
 .travis/linux-prepare.sh                 |  1 +
 Documentation/intro/install/afxdp.rst    |  2 +-
 Documentation/intro/install/dpdk.rst     | 64 ++++++++++++++------------
 Documentation/topics/dpdk/phy.rst        | 18 +++++---
 Documentation/topics/dpdk/vhost-user.rst | 20 +-------
 Documentation/topics/testing.rst         |  2 +-
 NEWS                                     |  1 +
 acinclude.m4                             | 78 +++++++++++++-------------------
 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 ++------
 15 files changed, 181 insertions(+), 133 deletions(-)
 create mode 100644 include/sparse/rte_mbuf.h
 create mode 100644 include/sparse/rte_trace_point.h

Comments

David Marchand Nov. 27, 2020, 8:01 a.m. UTC | #1
Some suggestions for rebasing now that GHA are in the master branch.

A small note: $HOME is world writable in GHA envs, this triggers a
dpdk init failure when loading a plugin from a path under $HOME (EAL
has a runtime check on o-w permissions for loaded binaries).
My workaround with GHA for dpdk to chmod o-w $HOME, but I did not see
any issue for OVS, since no plugin is loaded in the CI.


On Wed, Nov 25, 2020 at 11:42 PM Ian Stokes <ian.stokes@intel.com> wrote:
> diff --git a/.travis.yml b/.travis.yml
> index 9fd8bbe01..78411bd83 100644
> --- a/.travis.yml
> +++ b/.travis.yml
> @@ -27,10 +27,14 @@ addons:
>        - selinux-policy-dev
>        - libunbound-dev
>        - libunwind-dev
> +      - python3-setuptools
> +      - python3-wheel
> +      - ninja-build

Ah ok, python3-wheel was indeed missing in Travis too.
I missed the change from Sunil who added it in dpdk-latest when I was
testing Ilya GHA support in dpdk-latest.

So we need an updated packages list in GHA.
And meson is not found for a user-only install unless updating PATH.

--- 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 != ''

>
>  before_install: ./.travis/${TRAVIS_OS_NAME}-prepare.sh
>
> -before_script: export PATH=$PATH:$HOME/bin
> +before_script:
> +  - export PATH=$PATH:$HOME/bin

Nit: no need for this change.


>
>  env:
>    - OPTS="--disable-ssl"

[snip]

> diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
> index 60d8931f3..750b6dd0c 100755
> --- a/.travis/linux-build.sh
> +++ b/.travis/linux-build.sh
> @@ -124,19 +137,19 @@ function install_dpdk()
>          pushd dpdk-dir
>      fi
>

Here we must switch to "default" for compilation.

    # 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"


> -    make config CC=gcc T=$TARGET
> +    # Disable building DPDK unit tests. Not needed for OVS build or tests.
> +    DPDK_OPTS="$DPDK_OPTS -Dtests=false"
>
> -    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
> +    # Install DPDK using prefix.
> +    DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
> +
> +    CC=gcc meson $DPDK_OPTS build
> +    ninja -C build
> +    ninja -C build install

[snip]

> diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
> index fe11571d2..a4484b917 100644
> --- a/Documentation/intro/install/dpdk.rst
> +++ b/Documentation/intro/install/dpdk.rst

[snip]

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

20.11*

Please use "versioned" links to 20.11.
They will be valid for later stable LTS 20.11 releases and it will
avoid pointing to main branch documentation.

This might need some double checking, but
s/guides-19.11/guides-20.11/g should do the job.
Stokes, Ian Dec. 1, 2020, 8:14 p.m. UTC | #2
> Some suggestions for rebasing now that GHA are in the master branch.
> 

Thanks for the feedback David, re-working a v2 now and just waiting on the GHA build to complete before submitting the v2.

Minor comments inline.

> A small note: $HOME is world writable in GHA envs, this triggers a
> dpdk init failure when loading a plugin from a path under $HOME (EAL
> has a runtime check on o-w permissions for loaded binaries).
> My workaround with GHA for dpdk to chmod o-w $HOME, but I did not see
> any issue for OVS, since no plugin is loaded in the CI.
> 

Just to clarify here David, are you saying that there isn't currently an issue (i.e. it could potentially happen) but you haven’t seen it?

> 
> On Wed, Nov 25, 2020 at 11:42 PM Ian Stokes <ian.stokes@intel.com> wrote:
> > diff --git a/.travis.yml b/.travis.yml
> > index 9fd8bbe01..78411bd83 100644
> > --- a/.travis.yml
> > +++ b/.travis.yml
> > @@ -27,10 +27,14 @@ addons:
> >        - selinux-policy-dev
> >        - libunbound-dev
> >        - libunwind-dev
> > +      - python3-setuptools
> > +      - python3-wheel
> > +      - ninja-build
> 
> Ah ok, python3-wheel was indeed missing in Travis too.
> I missed the change from Sunil who added it in dpdk-latest when I was
> testing Ilya GHA support in dpdk-latest.
> 
> So we need an updated packages list in GHA.
> And meson is not found for a user-only install unless updating PATH.

Thanks for flagging, and providing the patch below, I've rolled this into the v2.


> 
> --- 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

Out of interest, is this the workaround you’ve 'referenced for using $HOME earlier in your response?

> 
>      - name: upload deb packages
>        if:   matrix.deb_package != ''
> 
> >
> >  before_install: ./.travis/${TRAVIS_OS_NAME}-prepare.sh
> >
> > -before_script: export PATH=$PATH:$HOME/bin
> > +before_script:
> > +  - export PATH=$PATH:$HOME/bin
> 
> Nit: no need for this change.

Agreed, I think this was a reformat from when we made dpdk-latest point to the main branch in DPDPK, will remove.
> 
> 
> >
> >  env:
> >    - OPTS="--disable-ssl"
> 
> [snip]
> 
> > diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
> > index 60d8931f3..750b6dd0c 100755
> > --- a/.travis/linux-build.sh
> > +++ b/.travis/linux-build.sh
> > @@ -124,19 +137,19 @@ function install_dpdk()
> >          pushd dpdk-dir
> >      fi
> >
> 
> Here we must switch to "default" for compilation.
> 
>     # 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"
> 

Sure will do.

> 
> > -    make config CC=gcc T=$TARGET
> > +    # Disable building DPDK unit tests. Not needed for OVS build or tests.
> > +    DPDK_OPTS="$DPDK_OPTS -Dtests=false"
> >
> > -    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
> > +    # Install DPDK using prefix.
> > +    DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
> > +
> > +    CC=gcc meson $DPDK_OPTS build
> > +    ninja -C build
> > +    ninja -C build install
> 
> [snip]
> 
> > diff --git a/Documentation/intro/install/dpdk.rst
> b/Documentation/intro/install/dpdk.rst
> > index fe11571d2..a4484b917 100644
> > --- a/Documentation/intro/install/dpdk.rst
> > +++ b/Documentation/intro/install/dpdk.rst
> 
> [snip]
> 
> >  .. _DPDK sources: http://dpdk.org/rel
> > +.. _DPDK documentation:
> > +   https://doc.dpdk.org/guides-20.08/linux_gsg/build_dpdk.html
> 
> 20.11*
> 
> Please use "versioned" links to 20.11.
> They will be valid for later stable LTS 20.11 releases and it will
> avoid pointing to main branch documentation.
> 
> This might need some double checking, but
> s/guides-19.11/guides-20.11/g should do the job.

Fully agree, at the time of the RFC I couldn't find the versioned links but my intention was to update them in the v2 once 20.11 was released.

Will do this for the v2.

Thanks for the review and feedback, much appreciated.

Thanks
Ian
> 
> 
> --
> David Marchand
David Marchand Dec. 2, 2020, 8:35 a.m. UTC | #3
Hello Ian,

On Tue, Dec 1, 2020 at 9:14 PM Stokes, Ian <ian.stokes@intel.com> wrote:
> > A small note: $HOME is world writable in GHA envs, this triggers a
> > dpdk init failure when loading a plugin from a path under $HOME (EAL
> > has a runtime check on o-w permissions for loaded binaries).
> > My workaround with GHA for dpdk to chmod o-w $HOME, but I did not see
> > any issue for OVS, since no plugin is loaded in the CI.
> >
>
> Just to clarify here David, are you saying that there isn't currently an issue (i.e. it could potentially happen) but you haven’t seen it?

I had not tried to reproduce the issue but it should happen with dpdk
shared builds that we don't test in OVS jobs:
https://github.com/openvswitch/ovs/blob/master/.github/workflows/build-and-test.yml#L92


The workaround is to add a chmod o-w $HOME.

Example for dpdk:
https://github.com/ovsrobot/dpdk/commit/c5e1ca36202839e60d0258942c86eef22314e679#diff-5c3fa597431eda03ac3339ae6bf7f05e1a50d6fc7333679ec38e21b337cb6721R73


[snip]

> > So we need an updated packages list in GHA.
> > And meson is not found for a user-only install unless updating PATH.
>
> Thanks for flagging, and providing the patch below, I've rolled this into the v2.

[snip]

> > @@ -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
>
> Out of interest, is this the workaround you’ve 'referenced for using $HOME earlier in your response?

This is for user-only installed meson to be available.
diff mbox series

Patch

diff --git a/.travis.yml b/.travis.yml
index 9fd8bbe01..78411bd83 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,10 +27,14 @@  addons:
       - selinux-policy-dev
       - libunbound-dev
       - libunwind-dev
+      - python3-setuptools
+      - python3-wheel
+      - ninja-build
 
 before_install: ./.travis/${TRAVIS_OS_NAME}-prepare.sh
 
-before_script: export PATH=$PATH:$HOME/bin
+before_script:
+  - export PATH=$PATH:$HOME/bin
 
 env:
   - OPTS="--disable-ssl"
diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
index 60d8931f3..750b6dd0c 100755
--- a/.travis/linux-build.sh
+++ b/.travis/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,19 +137,19 @@  function install_dpdk()
         pushd dpdk-dir
     fi
 
-    make config CC=gcc T=$TARGET
+    # Disable building DPDK unit tests. Not needed for OVS build or tests.
+    DPDK_OPTS="$DPDK_OPTS -Dtests=false"
 
-    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
+    # 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
 
-    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}
@@ -183,7 +196,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/.travis/linux-prepare.sh b/.travis/linux-prepare.sh
index 71eb347e8..1baa11641 100755
--- a/.travis/linux-prepare.sh
+++ b/.travis/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/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..a4484b917 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`_
 
@@ -62,6 +62,8 @@  Detailed system requirements can be found at `DPDK requirements`_.
 .. _DPDK supported NIC: http://dpdk.org/doc/nics
 .. _DPDK requirements: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
 
+.. _dpdk-install:
+
 Installing
 ----------
 
@@ -71,38 +73,44 @@  Install DPDK
 #. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``::
 
        $ cd /usr/src/
-       $ wget https://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz
-       $ tar xf dpdk-19.11.2.tar.xz
-       $ export DPDK_DIR=/usr/src/dpdk-stable-19.11.2
+       $ wget https://fast.dpdk.org/rel/dpdk-20.11.tar.xz
+       $ tar xf dpdk-20.11.tar.xz
+       $ export DPDK_DIR=/usr/src/dpdk-20.11
        $ cd $DPDK_DIR
 
-#. (Optional) Configure DPDK as a shared library
+#. Configure and install DPDK using Meson
 
-   DPDK can be built as either a static library or a shared library.  By
-   default, it is configured for the former. If you wish to use the latter, set
-   ``CONFIG_RTE_BUILD_SHARED_LIB=y`` in ``$DPDK_DIR/config/common_base``.
+   Build and install the DPDK library::
 
-   .. note::
+       $ export DPDK_BUILD=$DPDK_DIR/build
+       $ meson build
+       $ ninja -C build
+       $ sudo ninja -C build install
+       $ sudo ldconfig
 
-      Minor performance loss is expected when using OVS with a shared DPDK
-      library compared to a static DPDK library.
+   Detailed information can be found at `DPDK documentation`_.
 
-#. Configure and install DPDK
+#. (Optional) Configure and export the DPDK shared library location
 
-   Build and install the DPDK library::
+   Since DPDK is built both as static and shared library by default, no extra
+   configuration is required for the build.
 
-       $ export DPDK_TARGET=x86_64-native-linuxapp-gcc
-       $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
-       $ make install T=$DPDK_TARGET DESTDIR=install
+   Exporting the path to library is not necessary if the DPDK libraries are
+   system installed. For libraries installed using a prefix, export the path
+   to this library and also update the $PKG_CONFIG_PATH for use
+   before building OVS::
 
-#. (Optional) Export the DPDK shared library location
+      $ export LD_LIBRARY_PATH=/path/to/installed/DPDK/libraries
+      $ export PKG_CONFIG_PATH=/path/to/installed/".pc" file/for/DPDK
 
-   If DPDK was built as a shared library, export the path to this library for
-   use when building OVS::
+   .. note::
 
-       $ export LD_LIBRARY_PATH=$DPDK_DIR/x86_64-native-linuxapp-gcc/lib
+      Minor performance loss is expected when using OVS with a shared DPDK
+      library compared to a static DPDK library.
 
 .. _DPDK sources: http://dpdk.org/rel
+.. _DPDK documentation:
+   https://doc.dpdk.org/guides-20.08/linux_gsg/build_dpdk.html
 
 Install OVS
 ~~~~~~~~~~~
@@ -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/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..8924e14ea 100644
--- a/Documentation/topics/dpdk/phy.rst
+++ b/Documentation/topics/dpdk/phy.rst
@@ -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/prog_guide/env_abstraction_layer.html
 
 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/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
diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
index 75d3fc958..2b6c7ba02 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/prog_guide/vhost_lib.html>`__
diff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst
index b9fa94dda..6321ba748 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/linux_gsg/index.html
 
 All the features documented under `Unit Tests`_ are available for the DPDK
 datapath testsuite.
diff --git a/NEWS b/NEWS
index 185555848..1a61c6efe 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..2fd9aa255 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,25 @@  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"])
+              ;;
     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 +413,14 @@  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
     OVS_CFLAGS="$OVS_CFLAGS $DPDK_INCLUDE"
     OVS_ENABLE_OPTION([-mssse3])
 
@@ -444,17 +429,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) {