diff mbox series

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

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

Commit Message

Stokes, Ian Nov. 30, 2021, 3:53 p.m. UTC
This commit adds support for DPDK v21.11, it includes the following
changes.

1. ci: Install python elftools for DPDK 21.02.
2. ci: Update meson requirement for DPDK 21.05.
3. netdev-dpdk: Fix build with 21.05.
4. ci: Compile DPDK in non developer mode.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=242480&state=*

5. netdev-dpdk: Remove access to DPDK internals.
6. netdev-dpdk: Remove unused attribute from rte_flow rule.
7. netdev-dpdk: Fix mbuf macros namespace with 21.11-rc1.
8. netdev-dpdk: Fix vhost namespace with 21.11-rc2.

   http://patchwork.ozlabs.org/project/openvswitch/list/?series=271040&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: Ian Stokes <ian.stokes@intel.com>
---
 .ci/linux-build.sh                       |   6 +-
 .ci/linux-prepare.sh                     |   4 +-
 Documentation/faq/releases.rst           |   2 +-
 Documentation/intro/install/dpdk.rst     |  16 ++---
 Documentation/topics/dpdk/phy.rst        |   8 +--
 Documentation/topics/dpdk/vdev.rst       |   2 +-
 Documentation/topics/dpdk/vhost-user.rst |   2 +-
 Documentation/topics/testing.rst         |   2 +-
 NEWS                                     |   1 +
 lib/dp-packet.h                          |  26 +++----
 lib/netdev-dpdk.c                        | 115 ++++++++++++++++---------------
 11 files changed, 98 insertions(+), 86 deletions(-)

Comments

Maxime Coquelin Dec. 2, 2021, 9:21 a.m. UTC | #1
Hi Ian,

On 11/30/21 16:53, Ian Stokes wrote:
> This commit adds support for DPDK v21.11, it includes the following
> changes.
> 
> 1. ci: Install python elftools for DPDK 21.02.
> 2. ci: Update meson requirement for DPDK 21.05.
> 3. netdev-dpdk: Fix build with 21.05.
> 4. ci: Compile DPDK in non developer mode.
> 
>     http://patchwork.ozlabs.org/project/openvswitch/list/?series=242480&state=*
> 
> 5. netdev-dpdk: Remove access to DPDK internals.
> 6. netdev-dpdk: Remove unused attribute from rte_flow rule.
> 7. netdev-dpdk: Fix mbuf macros namespace with 21.11-rc1.
> 8. netdev-dpdk: Fix vhost namespace with 21.11-rc2.

Thanks for taking care of this one.

> 
>     http://patchwork.ozlabs.org/project/openvswitch/list/?series=271040&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: Ian Stokes <ian.stokes@intel.com>
> ---
>   .ci/linux-build.sh                       |   6 +-
>   .ci/linux-prepare.sh                     |   4 +-
>   Documentation/faq/releases.rst           |   2 +-
>   Documentation/intro/install/dpdk.rst     |  16 ++---
>   Documentation/topics/dpdk/phy.rst        |   8 +--
>   Documentation/topics/dpdk/vdev.rst       |   2 +-
>   Documentation/topics/dpdk/vhost-user.rst |   2 +-
>   Documentation/topics/testing.rst         |   2 +-
>   NEWS                                     |   1 +
>   lib/dp-packet.h                          |  26 +++----
>   lib/netdev-dpdk.c                        | 115 ++++++++++++++++---------------
>   11 files changed, 98 insertions(+), 86 deletions(-)
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

Thanks,
Maxime
David Marchand Dec. 2, 2021, 11:47 a.m. UTC | #2
On Tue, Nov 30, 2021 at 4:54 PM Ian Stokes <ian.stokes@intel.com> wrote:
>
> This commit adds support for DPDK v21.11, it includes the following
> changes.
>
> 1. ci: Install python elftools for DPDK 21.02.
> 2. ci: Update meson requirement for DPDK 21.05.
> 3. netdev-dpdk: Fix build with 21.05.
> 4. ci: Compile DPDK in non developer mode.
>
>    http://patchwork.ozlabs.org/project/openvswitch/list/?series=242480&state=*
>
> 5. netdev-dpdk: Remove access to DPDK internals.
> 6. netdev-dpdk: Remove unused attribute from rte_flow rule.
> 7. netdev-dpdk: Fix mbuf macros namespace with 21.11-rc1.
> 8. netdev-dpdk: Fix vhost namespace with 21.11-rc2.
>
>    http://patchwork.ozlabs.org/project/openvswitch/list/?series=271040&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: Ian Stokes <ian.stokes@intel.com>
> ---
>  .ci/linux-build.sh                       |   6 +-
>  .ci/linux-prepare.sh                     |   4 +-
>  Documentation/faq/releases.rst           |   2 +-
>  Documentation/intro/install/dpdk.rst     |  16 ++---
>  Documentation/topics/dpdk/phy.rst        |   8 +--
>  Documentation/topics/dpdk/vdev.rst       |   2 +-
>  Documentation/topics/dpdk/vhost-user.rst |   2 +-
>  Documentation/topics/testing.rst         |   2 +-

I did a quick pass and caught some small things to fix:

- should we list 21.11.x for 2.17.x in Documentation/faq/releases.rst table?


- there is one reference to 20.11 documentation in
Documentation/topics/userspace-tso.rst:__
https://doc.dpdk.org/guides-20.11/nics/overview.html


- Fedora spec still references 20.11:
rhel/openvswitch-fedora.spec.in:BuildRequires: dpdk-devel >= 20.11


The rest is the same than dpdk-latest branch (with the experimental
api build check kept in dpdk-latest only).
So lgtm, and with those small things from above fixed, feel free to add:

Reviewed-by: David Marchand <david.marchand@redhat.com>

Thanks Ian.
Ilya Maximets Dec. 2, 2021, 12:18 p.m. UTC | #3
On 12/2/21 12:47, David Marchand wrote:
> I did a quick pass and caught some small things to fix:
> 
> - should we list 21.11.x for 2.17.x in Documentation/faq/releases.rst table?

This will be done as part of "Prepare for 2.17.0." patch while preparing
for the actual release along with update for the kernel support list.

Best regards, Ilya Maximets.
Stokes, Ian Dec. 2, 2021, 12:26 p.m. UTC | #4
> On Tue, Nov 30, 2021 at 4:54 PM Ian Stokes <ian.stokes@intel.com> wrote:
> >
> > This commit adds support for DPDK v21.11, it includes the following
> > changes.
> >
> > 1. ci: Install python elftools for DPDK 21.02.
> > 2. ci: Update meson requirement for DPDK 21.05.
> > 3. netdev-dpdk: Fix build with 21.05.
> > 4. ci: Compile DPDK in non developer mode.
> >
> >
> http://patchwork.ozlabs.org/project/openvswitch/list/?series=242480&state=*
> >
> > 5. netdev-dpdk: Remove access to DPDK internals.
> > 6. netdev-dpdk: Remove unused attribute from rte_flow rule.
> > 7. netdev-dpdk: Fix mbuf macros namespace with 21.11-rc1.
> > 8. netdev-dpdk: Fix vhost namespace with 21.11-rc2.
> >
> >
> http://patchwork.ozlabs.org/project/openvswitch/list/?series=271040&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: Ian Stokes <ian.stokes@intel.com>
> > ---
> >  .ci/linux-build.sh                       |   6 +-
> >  .ci/linux-prepare.sh                     |   4 +-
> >  Documentation/faq/releases.rst           |   2 +-
> >  Documentation/intro/install/dpdk.rst     |  16 ++---
> >  Documentation/topics/dpdk/phy.rst        |   8 +--
> >  Documentation/topics/dpdk/vdev.rst       |   2 +-
> >  Documentation/topics/dpdk/vhost-user.rst |   2 +-
> >  Documentation/topics/testing.rst         |   2 +-
> 
> I did a quick pass and caught some small things to fix:
> 
> - should we list 21.11.x for 2.17.x in Documentation/faq/releases.rst table?

Good point, in the past we've held off on adding this until the 2.17 branch is actually created so I left this out for the moment.
> 
> 
> - there is one reference to 20.11 documentation in
> Documentation/topics/userspace-tso.rst:__
> https://doc.dpdk.org/guides-20.11/nics/overview.html
> 
Good catch, will fix.

> 
> - Fedora spec still references 20.11:
> rhel/openvswitch-fedora.spec.in:BuildRequires: dpdk-devel >= 20.11
Happy to update this, I think in the past its been carried out by the RH folks.

> 
> 
> The rest is the same than dpdk-latest branch (with the experimental
> api build check kept in dpdk-latest only).
> So lgtm, and with those small things from above fixed, feel free to add:

So the one thing I spotted was the dpdk unit tests now fail, it seems there is a new log we need to track from testpmd I'm guessing to ensure they work, will roll this change into the v1 of this patch along with the changes above.

> 
> Reviewed-by: David Marchand <david.marchand@redhat.com>
> 

Thanks for the review.

Thanks
Ian
David Marchand Dec. 2, 2021, 12:37 p.m. UTC | #5
On Thu, Dec 2, 2021 at 1:18 PM Ilya Maximets <i.maximets@ovn.org> wrote:
>
> On 12/2/21 12:47, David Marchand wrote:
> > I did a quick pass and caught some small things to fix:
> >
> > - should we list 21.11.x for 2.17.x in Documentation/faq/releases.rst table?
>
> This will be done as part of "Prepare for 2.17.0." patch while preparing
> for the actual release along with update for the kernel support list.

I was not sure because of 8d04161534e1 ("faq: Update OVS/DPDK version
table for OVS 2.15.").
But that's better to do this kind of update once, when preparing the release.

Thanks Ilya.
Ilya Maximets Dec. 2, 2021, 12:42 p.m. UTC | #6
On 12/2/21 13:37, David Marchand wrote:
> On Thu, Dec 2, 2021 at 1:18 PM Ilya Maximets <i.maximets@ovn.org> wrote:
>>
>> On 12/2/21 12:47, David Marchand wrote:
>>> I did a quick pass and caught some small things to fix:
>>>
>>> - should we list 21.11.x for 2.17.x in Documentation/faq/releases.rst table?
>>
>> This will be done as part of "Prepare for 2.17.0." patch while preparing
>> for the actual release along with update for the kernel support list.
> 
> I was not sure because of 8d04161534e1 ("faq: Update OVS/DPDK version
> table for OVS 2.15.").

Yeah.  Before 2.16 this kind of documentation updates were more or less
random as we always forgot to do that.

> But that's better to do this kind of update once, when preparing the release.

Keeping them to the release patches gives some stability and makes it harder
to forget to update the documentation, IMO.

> 
> Thanks Ilya.
> 
>
David Marchand Dec. 2, 2021, 1:33 p.m. UTC | #7
On Thu, Dec 2, 2021 at 1:26 PM Stokes, Ian <ian.stokes@intel.com> wrote:
> > The rest is the same than dpdk-latest branch (with the experimental
> > api build check kept in dpdk-latest only).
> > So lgtm, and with those small things from above fixed, feel free to add:
>
> So the one thing I spotted was the dpdk unit tests now fail, it seems there is a new log we need to track from testpmd I'm guessing to ensure they work, will roll this change into the v1 of this patch along with the changes above.

I caught one issue depending on hugepage sizes availability when
working on system-dpdk ut but I had dropped this hunk and forgot when
I sent the patches for the master branch.
I suspect this is the one you hit.

This is due to c69150679891 ("eal/linux: improve no hugepages logging").

You'll want to update those warning logs in system-dpdk.at, like:
-/EAL: No free hugepages reported in hugepages-1048576kB/d"])
+/EAL: No free .* hugepages reported/d"])

This will likely conflict with my patchset on system-dpdk, but this is
easy to fix.
Stokes, Ian Dec. 9, 2021, 12:31 p.m. UTC | #8
> > On Tue, Nov 30, 2021 at 4:54 PM Ian Stokes <ian.stokes@intel.com> wrote:
> > >
> > > This commit adds support for DPDK v21.11, it includes the following
> > > changes.
> > >
> > > 1. ci: Install python elftools for DPDK 21.02.
> > > 2. ci: Update meson requirement for DPDK 21.05.
> > > 3. netdev-dpdk: Fix build with 21.05.
> > > 4. ci: Compile DPDK in non developer mode.
> > >
> > >
> >
> http://patchwork.ozlabs.org/project/openvswitch/list/?series=242480&state=*
> > >
> > > 5. netdev-dpdk: Remove access to DPDK internals.
> > > 6. netdev-dpdk: Remove unused attribute from rte_flow rule.
> > > 7. netdev-dpdk: Fix mbuf macros namespace with 21.11-rc1.
> > > 8. netdev-dpdk: Fix vhost namespace with 21.11-rc2.
> > >
> > >
> >
> http://patchwork.ozlabs.org/project/openvswitch/list/?series=271040&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: Ian Stokes <ian.stokes@intel.com>
> > > ---
> > >  .ci/linux-build.sh                       |   6 +-
> > >  .ci/linux-prepare.sh                     |   4 +-
> > >  Documentation/faq/releases.rst           |   2 +-
> > >  Documentation/intro/install/dpdk.rst     |  16 ++---
> > >  Documentation/topics/dpdk/phy.rst        |   8 +--
> > >  Documentation/topics/dpdk/vdev.rst       |   2 +-
> > >  Documentation/topics/dpdk/vhost-user.rst |   2 +-
> > >  Documentation/topics/testing.rst         |   2 +-
> >
> > I did a quick pass and caught some small things to fix:
> >
> > - should we list 21.11.x for 2.17.x in Documentation/faq/releases.rst table?
> 
> Good point, in the past we've held off on adding this until the 2.17 branch is
> actually created so I left this out for the moment.
> >
> >
> > - there is one reference to 20.11 documentation in
> > Documentation/topics/userspace-tso.rst:__
> > https://doc.dpdk.org/guides-20.11/nics/overview.html
> >
> Good catch, will fix.
> 
> >
> > - Fedora spec still references 20.11:
> > rhel/openvswitch-fedora.spec.in:BuildRequires: dpdk-devel >= 20.11
> Happy to update this, I think in the past its been carried out by the RH folks.
> 
> >
> >
> > The rest is the same than dpdk-latest branch (with the experimental
> > api build check kept in dpdk-latest only).
> > So lgtm, and with those small things from above fixed, feel free to add:
> 
> So the one thing I spotted was the dpdk unit tests now fail, it seems there is a
> new log we need to track from testpmd I'm guessing to ensure they work, will
> roll this change into the v1 of this patch along with the changes above.
> 
> >
> > Reviewed-by: David Marchand <david.marchand@redhat.com>
> >
> 

Hi David,

Apologies for the delay, very busy this week with the conference etc. I've sent a new v1 with the changes above.

http://patchwork.ozlabs.org/project/openvswitch/list/?series=275984

We hit some issues with the unit tests (separate to the changes we discussed) which caused some delay, however they seem unrelated to the update itself to 21.11 and more related to some of the platforms we were testing on so shouldn't block 21.11 update, apologies for the delay while investigating this.

Thanks
Ian
diff mbox series

Patch

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 863f02388..ff6ae4b10 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -159,6 +159,10 @@  function install_dpdk()
     # Disable building DPDK unit tests. Not needed for OVS build or tests.
     DPDK_OPTS="$DPDK_OPTS -Dtests=false"
 
+    # Disable DPDK developer mode, this results in less build checks and less
+    # meson verbose outputs.
+    DPDK_OPTS="$DPDK_OPTS -Ddeveloper_mode=disabled"
+
     # Install DPDK using prefix.
     DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
 
@@ -216,7 +220,7 @@  fi
 
 if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then
     if [ -z "$DPDK_VER" ]; then
-        DPDK_VER="20.11.1"
+        DPDK_VER="21.11"
     fi
     install_dpdk $DPDK_VER
     if [ "$CC" = "clang" ]; then
diff --git a/.ci/linux-prepare.sh b/.ci/linux-prepare.sh
index 360c0a68e..b3addf404 100755
--- a/.ci/linux-prepare.sh
+++ b/.ci/linux-prepare.sh
@@ -21,8 +21,8 @@  make -j4 HAVE_LLVM= HAVE_SQLITE= install
 cd ..
 
 pip3 install --disable-pip-version-check --user \
-    flake8 hacking sphinx wheel setuptools
-pip3 install --user  'meson==0.47.1'
+    flake8 hacking sphinx wheel setuptools pyelftools
+pip3 install --user  'meson==0.49.2'
 
 if [ "$M32" ]; then
     # Installing 32-bit libraries.
diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst
index 64bc577e0..59d55202d 100644
--- a/Documentation/faq/releases.rst
+++ b/Documentation/faq/releases.rst
@@ -225,7 +225,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://doc.dpdk.org/guides-20.11/contributing/stable.html
+.. _DPDK stable: http://doc.dpdk.org/guides-21.11/contributing/stable.html
 
 Q: I get an error like this when I configure Open vSwitch:
 
diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
index d554409fc..d9f44055d 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 20.11.1
+- DPDK 21.11
 
 - A `DPDK supported NIC`_
 
@@ -59,8 +59,8 @@  vSwitch with DPDK will require the following:
 
 Detailed system requirements can be found at `DPDK requirements`_.
 
-.. _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 supported NIC: https://doc.dpdk.org/guides-21.11/nics/index.html
+.. _DPDK requirements: https://doc.dpdk.org/guides-21.11/linux_gsg/sys_reqs.html
 
 .. _dpdk-install:
 
@@ -73,9 +73,9 @@  Install DPDK
 #. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``::
 
        $ cd /usr/src/
-       $ wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz
-       $ tar xf dpdk-20.11.1.tar.xz
-       $ export DPDK_DIR=/usr/src/dpdk-stable-20.11.1
+       $ wget https://fast.dpdk.org/rel/dpdk-21.11.tar.xz
+       $ tar xf dpdk-21.11.tar.xz
+       $ export DPDK_DIR=/usr/src/dpdk-21.11
        $ cd $DPDK_DIR
 
 #. Configure and install DPDK using Meson
@@ -121,7 +121,7 @@  Install DPDK
 
 .. _DPDK sources: http://dpdk.org/rel
 .. _DPDK documentation:
-   https://doc.dpdk.org/guides-20.11/linux_gsg/build_dpdk.html
+   https://doc.dpdk.org/guides-21.11/linux_gsg/build_dpdk.html
 
 Install OVS
 ~~~~~~~~~~~
@@ -722,7 +722,7 @@  Limitations
   release notes`_.
 
 .. _DPDK release notes:
-   https://doc.dpdk.org/guides-20.11/rel_notes/release_20_11.html
+   https://doc.dpdk.org/guides-21.11/rel_notes/release_21_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 986dbd38e..937f4c40e 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: https://doc.dpdk.org/guides-20.11/linux_gsg/linux_drivers.html
+.. _dpdk-drivers: https://doc.dpdk.org/guides-21.11/linux_gsg/linux_drivers.html
 
 .. _dpdk-phy-multiqueue:
 
@@ -235,7 +235,7 @@  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-20.11/prog_guide/env_abstraction_layer.html#iova-mode-detection
+__ https://doc.dpdk.org/guides-21.11/prog_guide/env_abstraction_layer.html#iova-mode-detection
 
 To configure OVS DPDK to use physical addressing for IOVA::
 
@@ -267,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-20.11/prog_guide/switch_representation.html
+__ https://doc.dpdk.org/guides-21.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
@@ -401,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: https://doc.dpdk.org/guides-20.11/linux_gsg/linux_drivers.html#bifurcated-driver
+.. _bifurcated-drivers: https://doc.dpdk.org/guides-21.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 7bd48165e..97ac6d9a5 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`__.
 
-__ https://doc.dpdk.org/guides-20.11/nics/overview.html
+__ https://doc.dpdk.org/guides-21.11/nics/overview.html
diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
index 4545f8f64..97e66a99e 100644
--- a/Documentation/topics/dpdk/vhost-user.rst
+++ b/Documentation/topics/dpdk/vhost-user.rst
@@ -539,4 +539,4 @@  shown with::
 
 Further information can be found in the
 `DPDK documentation
-<https://doc.dpdk.org/guides-20.11/prog_guide/vhost_lib.html>`__
+<https://doc.dpdk.org/guides-21.11/prog_guide/vhost_lib.html>`__
diff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst
index 0ddcbd58a..ea11700e3 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-20.11/linux_gsg/sys_reqs.html
+.. _Configure hugepages: https://doc.dpdk.org/guides-21.11/linux_gsg/sys_reqs.html
 
 All the features documented under `Unit Tests`_ are available for the DPDK
 datapath testsuite.
diff --git a/NEWS b/NEWS
index dce1aeb2b..80122f677 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@  Post-v2.16.0
        limiting behavior.
      * Add hardware offload support for matching IPv4/IPv6 frag types
        (experimental).
+     * Add support for DPDK 21.11.
    - Python:
      * For SSL support, the use of the pyOpenSSL library has been replaced
        with the native 'ssl' module.
diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index 3dc582fbf..ee0805ae6 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -58,29 +58,31 @@  enum OVS_PACKED_ENUM dp_packet_source {
 enum dp_packet_offload_mask {
     /* Value 0 is not used. */
     /* Is the 'rss_hash' valid? */
-    DEF_OL_FLAG(DP_PACKET_OL_RSS_HASH, PKT_RX_RSS_HASH, 0x1),
+    DEF_OL_FLAG(DP_PACKET_OL_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, 0x1),
     /* Is the 'flow_mark' valid? */
-    DEF_OL_FLAG(DP_PACKET_OL_FLOW_MARK, PKT_RX_FDIR_ID, 0x2),
+    DEF_OL_FLAG(DP_PACKET_OL_FLOW_MARK, RTE_MBUF_F_RX_FDIR_ID, 0x2),
     /* Bad L4 checksum in the packet. */
-    DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CKSUM_BAD, PKT_RX_L4_CKSUM_BAD, 0x4),
+    DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CKSUM_BAD, RTE_MBUF_F_RX_L4_CKSUM_BAD, 0x4),
     /* Bad IP checksum in the packet. */
-    DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CKSUM_BAD, PKT_RX_IP_CKSUM_BAD, 0x8),
+    DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CKSUM_BAD, RTE_MBUF_F_RX_IP_CKSUM_BAD, 0x8),
     /* Valid L4 checksum in the packet. */
-    DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CKSUM_GOOD, PKT_RX_L4_CKSUM_GOOD, 0x10),
+    DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CKSUM_GOOD, RTE_MBUF_F_RX_L4_CKSUM_GOOD,
+                0x10),
     /* Valid IP checksum in the packet. */
-    DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CKSUM_GOOD, PKT_RX_IP_CKSUM_GOOD, 0x20),
+    DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CKSUM_GOOD, RTE_MBUF_F_RX_IP_CKSUM_GOOD,
+                0x20),
     /* TCP Segmentation Offload. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_SEG, PKT_TX_TCP_SEG, 0x40),
+    DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_SEG, RTE_MBUF_F_TX_TCP_SEG, 0x40),
     /* Offloaded packet is IPv4. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_IPV4, PKT_TX_IPV4, 0x80),
+    DEF_OL_FLAG(DP_PACKET_OL_TX_IPV4, RTE_MBUF_F_TX_IPV4, 0x80),
     /* Offloaded packet is IPv6. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_IPV6, PKT_TX_IPV6, 0x100),
+    DEF_OL_FLAG(DP_PACKET_OL_TX_IPV6, RTE_MBUF_F_TX_IPV6, 0x100),
     /* Offload TCP checksum. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CKSUM, PKT_TX_TCP_CKSUM, 0x200),
+    DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CKSUM, RTE_MBUF_F_TX_TCP_CKSUM, 0x200),
     /* Offload UDP checksum. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_UDP_CKSUM, PKT_TX_UDP_CKSUM, 0x400),
+    DEF_OL_FLAG(DP_PACKET_OL_TX_UDP_CKSUM, RTE_MBUF_F_TX_UDP_CKSUM, 0x400),
     /* Offload SCTP checksum. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_SCTP_CKSUM, PKT_TX_SCTP_CKSUM, 0x800),
+    DEF_OL_FLAG(DP_PACKET_OL_TX_SCTP_CKSUM, RTE_MBUF_F_TX_SCTP_CKSUM, 0x800),
     /* Adding new field requires adding to DP_PACKET_OL_SUPPORTED_MASK. */
 };
 
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index ca92c947a..d1fd6c766 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -181,7 +181,7 @@  static int vring_state_changed(int vid, uint16_t queue_id, int enable);
 static void destroy_connection(int vid);
 static void vhost_guest_notified(int vid);
 
-static const struct vhost_device_ops virtio_net_device_ops =
+static const struct rte_vhost_device_ops virtio_net_device_ops =
 {
     .new_device =  new_device,
     .destroy_device = destroy_device,
@@ -1279,26 +1279,6 @@  common_construct(struct netdev *netdev, dpdk_port_t port_no,
     return 0;
 }
 
-/* Get the number of OVS interfaces which have the same DPDK
- * rte device (e.g. same pci bus address).
- * FIXME: avoid direct access to DPDK internal array rte_eth_devices.
- */
-static int
-netdev_dpdk_get_num_ports(struct rte_device *device)
-    OVS_REQUIRES(dpdk_mutex)
-{
-    struct netdev_dpdk *dev;
-    int count = 0;
-
-    LIST_FOR_EACH (dev, list_node, &dpdk_list) {
-        if (rte_eth_devices[dev->port_id].device == device
-        && rte_eth_devices[dev->port_id].state != RTE_ETH_DEV_UNUSED) {
-            count++;
-        }
-    }
-    return count;
-}
-
 static int
 vhost_common_construct(struct netdev *netdev)
     OVS_REQUIRES(dpdk_mutex)
@@ -1452,8 +1432,6 @@  static void
 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;
 
     ovs_mutex_lock(&dpdk_mutex);
 
@@ -1461,20 +1439,43 @@  netdev_dpdk_destruct(struct netdev *netdev)
     dev->started = false;
 
     if (dev->attached) {
-        /* Retrieve eth device data before closing it.
-         * FIXME: avoid direct access to DPDK internal array rte_eth_devices.
-         */
-        eth_dev = &rte_eth_devices[dev->port_id];
-        rte_dev = eth_dev->device;
+        bool dpdk_resources_still_used = false;
+        struct rte_eth_dev_info dev_info;
+        dpdk_port_t sibling_port_id;
+
+        /* Check if this netdev has siblings (i.e. shares DPDK resources) among
+         * other OVS netdevs. */
+        RTE_ETH_FOREACH_DEV_SIBLING (sibling_port_id, dev->port_id) {
+            struct netdev_dpdk *sibling;
+
+            /* RTE_ETH_FOREACH_DEV_SIBLING lists dev->port_id as part of the
+             * loop. */
+            if (sibling_port_id == dev->port_id) {
+                continue;
+            }
+            LIST_FOR_EACH (sibling, list_node, &dpdk_list) {
+                if (sibling->port_id != sibling_port_id) {
+                    continue;
+                }
+                dpdk_resources_still_used = true;
+                break;
+            }
+            if (dpdk_resources_still_used) {
+                break;
+            }
+        }
+
+        /* Retrieve eth device data before closing it. */
+        rte_eth_dev_info_get(dev->port_id, &dev_info);
 
         /* Remove the eth device. */
         rte_eth_dev_close(dev->port_id);
 
-        /* Remove this rte device and all its eth devices if all the eth
-         * devices belonging to the rte device are closed.
-         */
-        if (!netdev_dpdk_get_num_ports(rte_dev)) {
-            int ret = rte_dev_remove(rte_dev);
+        /* Remove the rte device if no associated eth device is used by OVS.
+         * Note: any remaining eth devices associated to this rte device are
+         * closed by DPDK ethdev layer. */
+        if (!dpdk_resources_still_used) {
+            int ret = rte_dev_remove(dev_info.device);
 
             if (ret < 0) {
                 VLOG_ERR("Device '%s' can not be detached: %s.",
@@ -2165,14 +2166,14 @@  netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf)
 {
     struct dp_packet *pkt = CONTAINER_OF(mbuf, struct dp_packet, mbuf);
 
-    if (mbuf->ol_flags & PKT_TX_L4_MASK) {
+    if (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) {
         mbuf->l2_len = (char *)dp_packet_l3(pkt) - (char *)dp_packet_eth(pkt);
         mbuf->l3_len = (char *)dp_packet_l4(pkt) - (char *)dp_packet_l3(pkt);
         mbuf->outer_l2_len = 0;
         mbuf->outer_l3_len = 0;
     }
 
-    if (mbuf->ol_flags & PKT_TX_TCP_SEG) {
+    if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_SEG) {
         struct tcp_header *th = dp_packet_l4(pkt);
 
         if (!th) {
@@ -2182,11 +2183,11 @@  netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf)
         }
 
         mbuf->l4_len = TCP_OFFSET(th->tcp_ctl) * 4;
-        mbuf->ol_flags |= PKT_TX_TCP_CKSUM;
+        mbuf->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM;
         mbuf->tso_segsz = dev->mtu - mbuf->l3_len - mbuf->l4_len;
 
-        if (mbuf->ol_flags & PKT_TX_IPV4) {
-            mbuf->ol_flags |= PKT_TX_IP_CKSUM;
+        if (mbuf->ol_flags & RTE_MBUF_F_TX_IPV4) {
+            mbuf->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM;
         }
     }
     return true;
@@ -2533,7 +2534,7 @@  netdev_dpdk_filter_packet_len(struct netdev_dpdk *dev, struct rte_mbuf **pkts,
     for (i = 0; i < pkt_cnt; i++) {
         pkt = pkts[i];
         if (OVS_UNLIKELY((pkt->pkt_len > dev->max_packet_len)
-            && !(pkt->ol_flags & PKT_TX_TCP_SEG))) {
+            && !(pkt->ol_flags & RTE_MBUF_F_TX_TCP_SEG))) {
             VLOG_WARN_RL(&rl, "%s: Too big size %" PRIu32 " "
                          "max_packet_len %d", dev->up.name, pkt->pkt_len,
                          dev->max_packet_len);
@@ -2755,12 +2756,12 @@  dpdk_copy_dp_packet_to_mbuf(struct rte_mempool *mp, struct dp_packet *pkt_orig)
     mbuf_dest->tx_offload = pkt_orig->mbuf.tx_offload;
     mbuf_dest->packet_type = pkt_orig->mbuf.packet_type;
     mbuf_dest->ol_flags |= (pkt_orig->mbuf.ol_flags &
-                            ~(EXT_ATTACHED_MBUF | IND_ATTACHED_MBUF));
+                            ~(RTE_MBUF_F_EXTERNAL | RTE_MBUF_F_INDIRECT));
 
     memcpy(&pkt_dest->l2_pad_size, &pkt_orig->l2_pad_size,
            sizeof(struct dp_packet) - offsetof(struct dp_packet, l2_pad_size));
 
-    if (mbuf_dest->ol_flags & PKT_TX_L4_MASK) {
+    if (mbuf_dest->ol_flags & RTE_MBUF_F_TX_L4_MASK) {
         mbuf_dest->l2_len = (char *)dp_packet_l3(pkt_dest)
                                 - (char *)dp_packet_eth(pkt_dest);
         mbuf_dest->l3_len = (char *)dp_packet_l4(pkt_dest)
@@ -2805,7 +2806,7 @@  dpdk_do_tx_copy(struct netdev *netdev, int qid, struct dp_packet_batch *batch)
         uint32_t size = dp_packet_size(packet);
 
         if (size > dev->max_packet_len
-            && !(packet->mbuf.ol_flags & PKT_TX_TCP_SEG)) {
+            && !(packet->mbuf.ol_flags & RTE_MBUF_F_TX_TCP_SEG)) {
             VLOG_WARN_RL(&rl, "Too big size %u max_packet_len %d", size,
                          dev->max_packet_len);
             mtu_drops++;
@@ -3679,8 +3680,8 @@  netdev_dpdk_get_status(const struct netdev *netdev, struct smap *args)
     ovs_mutex_unlock(&dev->mutex);
     const struct rte_bus *bus;
     const struct rte_pci_device *pci_dev;
-    uint16_t vendor_id = PCI_ANY_ID;
-    uint16_t device_id = PCI_ANY_ID;
+    uint16_t vendor_id = RTE_PCI_ANY_ID;
+    uint16_t device_id = RTE_PCI_ANY_ID;
     bus = rte_bus_find_by_device(dev_info.device);
     if (bus && !strcmp(bus->name, "pci")) {
         pci_dev = RTE_DEV_TO_PCI(dev_info.device);
@@ -3793,12 +3794,12 @@  static void
 netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
                    const char *argv[], void *aux OVS_UNUSED)
 {
-    char *response;
-    dpdk_port_t port_id;
-    struct netdev_dpdk *dev;
-    struct rte_device *rte_dev;
     struct ds used_interfaces = DS_EMPTY_INITIALIZER;
+    struct rte_eth_dev_info dev_info;
+    dpdk_port_t sibling_port_id;
+    dpdk_port_t port_id;
     bool used = false;
+    char *response;
 
     ovs_mutex_lock(&dpdk_mutex);
 
@@ -3808,18 +3809,21 @@  netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
         goto error;
     }
 
-    rte_dev = rte_eth_devices[port_id].device;
     ds_put_format(&used_interfaces,
                   "Device '%s' is being used by the following interfaces:",
                   argv[1]);
 
-    LIST_FOR_EACH (dev, list_node, &dpdk_list) {
-        /* FIXME: avoid direct access to DPDK array rte_eth_devices. */
-        if (rte_eth_devices[dev->port_id].device == rte_dev
-            && rte_eth_devices[dev->port_id].state != RTE_ETH_DEV_UNUSED) {
+    RTE_ETH_FOREACH_DEV_SIBLING (sibling_port_id, port_id) {
+        struct netdev_dpdk *dev;
+
+        LIST_FOR_EACH (dev, list_node, &dpdk_list) {
+            if (dev->port_id != sibling_port_id) {
+                continue;
+            }
             used = true;
             ds_put_format(&used_interfaces, " %s",
                           netdev_get_name(&dev->up));
+            break;
         }
     }
 
@@ -3831,8 +3835,9 @@  netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
     }
     ds_destroy(&used_interfaces);
 
+    rte_eth_dev_info_get(port_id, &dev_info);
     rte_eth_dev_close(port_id);
-    if (rte_dev_remove(rte_dev) < 0) {
+    if (rte_dev_remove(dev_info.device) < 0) {
         response = xasprintf("Device '%s' can not be detached", argv[1]);
         goto error;
     }
@@ -5272,7 +5277,7 @@  netdev_dpdk_rte_flow_query_count(struct netdev *netdev,
                                  struct rte_flow_query_count *query,
                                  struct rte_flow_error *error)
 {
-    struct rte_flow_action_count count = { .shared = 0, .id = 0 };
+    struct rte_flow_action_count count = { .id = 0, };
     const struct rte_flow_action actions[] = {
         {
             .type = RTE_FLOW_ACTION_TYPE_COUNT,