DPDK patches and discussions
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* Re: [dpdk-dev] [PATCH] devtools: move ABI scripts from buildtools
  2019-11-28 13:46 42% [dpdk-dev] [PATCH] devtools: move ABI scripts from buildtools David Marchand
@ 2019-11-28 14:23  4% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-28 14:23 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Neil Horman

28/11/2019 14:46, David Marchand:
> Those scripts are only used by developers and not part of the build
> process.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

I hesitated to accept these scripts in buildtools.
I agree it is better in devtools, and not installed.

Acked-by: Thomas Monjalon <thomas@monjalon.net>




^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/8] doc: update Linux GSG system requirements section
  2019-11-28 14:11  0%     ` Bruce Richardson
@ 2019-11-28 14:22  0%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-28 14:22 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, john.mcnamara

28/11/2019 15:11, Bruce Richardson:
> On Thu, Nov 28, 2019 at 12:51:27PM +0100, Thomas Monjalon wrote:
> > 22/11/2019 17:03, Bruce Richardson:
> > [...]
> > > -*   GNU ``make``.
> > > +*   General development tools including ``make``, and a supported C compiler such as ``gcc`` or ``clang``.
> > 
> > Why referring to make and not meson?
> 
> Because even with meson build we still use make for building kernel
> modules, and this first bullet item is all about getting the basic build
> packages which come from build-essential etc. Make is part of that build
> tools group on distros, meson and ninja are not.

OK

> > > -*   gcc: versions 4.9 or later is recommended for all platforms.
> > > -    On some distributions, some specific compiler flags and linker flags are enabled by
> > > -    default and affect performance (``-fstack-protector``, for example). Please refer to the documentation
> > > -    of your distribution and to ``gcc -dumpspecs``.
> > 
> > I think we need to keep some compiler requirement somewhere.
> > What do you suggest?
> 
> I'm happy to keep this compiler requirements in here. Is 4.9 still
> regularly tested with DPDK to ensure it works? Also, if we put in a GCC
> requirement, do we not also need to put in a clang one? For recent distros
> is this really something most users need to worry about?

It allows us to know which compiler we must support.
And for distributions, it can help.
I think we should have clang version too.

> > > -    .. note::
> > > -
> > > -       x86_x32 ABI is currently supported with distribution packages only on Ubuntu
> > > -       higher than 13.10 or recent Debian distribution. The only supported  compiler is gcc 4.9+.
> > 
> > No note at all about x32?
> > Do we know how it is supported?
> > 
> 
> I'm not sure myself, and I'm also not certain if it is still used. However,
> even if it is used/supported, I'm not sure references belong in a getting
> started guide, which should only cover the basics really.

OK to drop note about x32.

> > > +*   Python, recommended version 3.5+.
> > > +    * Python v3.5+ is needed to build DPDK using meson and ninja
> > 
> > We cannot use meson at all with older Python?
> > 
> 
> Definitly not with python2, and I believe python 3.5 is the minimum
> supported version.

OK

> > > -*   Python, version 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
> > > +    * Python 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
> > 
> > I didn't know about 3.2 for scripts. Any special reason?
> > 
> 
> No idea. It is what was in the doc, so I just left it. Happy to take
> updates to this. When python 2 EOLs next year, we should probably drop all
> support and references to it.

OK

> > > +*   Meson (v0.47.1+) and ninja
> > >  
> > > +    * Recommended to use the latest versions from Python's "pip" repository:
> > > +      ``pip3 install meson ninja``
> > 
> > Why recommending pip? Is 0.47.1 enough?
> 
> It is enough, this was done again in the interests of simplification -
> rather than worry about what versions are in what distro and having the
> user check, it simplifies things if everyone just uses pip, which is why I
> recommend it.

I think we should let users take the responsibility of using their distro
package or pip.
Recommending pip is a little pushy.

> > > -    .. note::
> > > -
> > > -        On systems with NUMA support, `libnuma-dev` (aka `numactl-devel`)
> > > -        is a recommended dependency when `--legacy-mem` switch is used,
> > > -        and a *required* dependency if default memory mode is used.
> > > -        While DPDK will compile and run without `libnuma`
> > > -        even on NUMA-enabled systems,
> > > -        both usability and performance will be degraded.
> > 
> > I think libnuma is worth to be mentioned here as it is an EAL dependency.
> 
> It is mentioned. This just takes out the note about mandatory vs optional
> for different memory systems. After this patch the output still includes in
> the mandatory dependencies section:
> 
> 	Library for handling NUMA (Non Uniform Memory Access).
> 	* numactl-devel in Red Hat/Fedora;
> 	* libnuma-dev in Debian/Ubuntu;
> 
> So again we simplify to just saying to get libnuma rather that having the
> user worry about different memory systems.

OK I missed it.

> > > +**Additional Libraries**
> > > +
> > > +A number of DPDK components, such as libraries and poll-mode drivers (PMDs) have additional dependencies.
> > > +For DPDK builds using meson, the presence or absence of these dependencies will be
> > > +automatically detected enabling or disabling the relevant components appropriately.
> > > +
> > > +For builds using make, these components are disabled in the default configuration and
> > > +need to be enabled manually my changing the relevant setting to "y" in the build configuration file
> > 
> > typo: s/my/by/
> > 
> > > +i.e. the ``.config`` file in the build folder.
> > > +
> > > +In each case, the relevant library development package (``-devel`` or ``-dev``) is needed to build the DPDK components.
> > > +
> > > +For libraries the additional dependencies include:
> > > +
> > > +*   libarchive: for some unit tests using tar to get their resources.
> > > +
> > > +*   jansson: to compile and use the telemetry library.
> > > +
> > > +*   libelf: to compile and use the bpf library.
> > 
> > I think these optional dependencies could go away, thanks to the text
> > you added above and below.
> 
> I'd actually rather keep them here. While we could refer to the programmers
> guide, there are a lot of libraries and only 3 optional dependencies, so
> I'd rather explicitly list them here.
> 
> For drivers, the dependency list would be huge, so I'm just going to refer
> to the PMD guide for that.
> 
> > > +For poll-mode drivers, the additional dependencies for each driver can be
> > > +found in that driver's documentation in the relevant DPDK guide document,
> > > +e.g. Network Interface Controller Drivers Guide
> > 
> > Please use a link here.
> 
> Ok.
> 
> > You could also link the prog guide if talking about libraries.
> > 
> 
> I can add one, but I still think it's worth listing the 3 additional deps.
> :-)

OK, no strong opinion.




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/8] doc: update Linux GSG system requirements section
  2019-11-28 11:51  0%   ` Thomas Monjalon
@ 2019-11-28 14:11  0%     ` Bruce Richardson
  2019-11-28 14:22  0%       ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2019-11-28 14:11 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, john.mcnamara

On Thu, Nov 28, 2019 at 12:51:27PM +0100, Thomas Monjalon wrote:
> 22/11/2019 17:03, Bruce Richardson:
> > Update the system requirements section of the doc to cover builds with
> > meson and ninja. This involves updating the package dependencies to include
> > meson, ninja and python 3.5, and also updating the optional dependencies
> > section to explain that the components are enabled/disabled automatically
> > by meson.
> > 
> > As part of this update, the relevant sections were simplified to keep the
> > document shorter. For mandatory requirements, we can refer to the various
> > distro's development tools package groups rather than requiring gcc, core
> > tools etc. individually. The optional package list was very incomplete, and
> > if complete would duplicate information in the individual driver's guides.
> > Therefore we can simplify it by listing only the library optional
> > requirements and referring users to the driver docs to find details on
> > their dependencies.
> 
> I agree with the intent.
> 

And thanks for the review.

> [...]
> > -*   GNU ``make``.
> > +*   General development tools including ``make``, and a supported C compiler such as ``gcc`` or ``clang``.
> 
> Why referring to make and not meson?

Because even with meson build we still use make for building kernel
modules, and this first bullet item is all about getting the basic build
packages which come from build-essential etc. Make is part of that build
tools group on distros, meson and ninja are not.

> 
> > -*   coreutils: ``cmp``, ``sed``, ``grep``, ``arch``, etc.
> > +    * For Red Hat/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
> > +    * For Ubuntu/Debian systems these can be installed using ``apt install build-essential``
> 
> OK, this is very basic :)

That's the intent. No point in asking the user to get gcc and coreutils
etc. individually when packagers give us a shortcut :-)

> 
> > -*   gcc: versions 4.9 or later is recommended for all platforms.
> > -    On some distributions, some specific compiler flags and linker flags are enabled by
> > -    default and affect performance (``-fstack-protector``, for example). Please refer to the documentation
> > -    of your distribution and to ``gcc -dumpspecs``.
> 
> I think we need to keep some compiler requirement somewhere.
> What do you suggest?

I'm happy to keep this compiler requirements in here. Is 4.9 still
regularly tested with DPDK to ensure it works? Also, if we put in a GCC
requirement, do we not also need to put in a clang one? For recent distros
is this really something most users need to worry about?

> 
> > -*   libc headers, often packaged as ``gcc-multilib`` (``glibc-devel.i686`` / ``libc6-dev-i386``;
> > -    ``glibc-devel.x86_64`` / ``libc6-dev`` for 64-bit compilation on Intel architecture;
> > -    ``glibc-devel.ppc64`` for 64 bit IBM Power architecture;)
> [...]
> > -*   Additional packages required for 32-bit compilation on 64-bit systems are:
> > -    * glibc.i686, libgcc.i686, libstdc++.i686 and glibc-devel.i686 for Intel i686/x86_64;
> > -    * glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;
> 
> OK to drop libc requirements.
> 
> > -    .. note::
> > -
> > -       x86_x32 ABI is currently supported with distribution packages only on Ubuntu
> > -       higher than 13.10 or recent Debian distribution. The only supported  compiler is gcc 4.9+.
> 
> No note at all about x32?
> Do we know how it is supported?
> 

I'm not sure myself, and I'm also not certain if it is still used. However,
even if it is used/supported, I'm not sure references belong in a getting
started guide, which should only cover the basics really.

> > +*   Python, recommended version 3.5+.
> > +    * Python v3.5+ is needed to build DPDK using meson and ninja
> 
> We cannot use meson at all with older Python?
> 

Definitly not with python2, and I believe python 3.5 is the minimum
supported version.

> > -*   Python, version 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
> > +    * Python 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
> 
> I didn't know about 3.2 for scripts. Any special reason?
> 

No idea. It is what was in the doc, so I just left it. Happy to take
updates to this. When python 2 EOLs next year, we should probably drop all
support and references to it.

> > +*   Meson (v0.47.1+) and ninja
> >  
> > +    * Recommended to use the latest versions from Python's "pip" repository:
> > +      ``pip3 install meson ninja``
> 
> Why recommending pip? Is 0.47.1 enough?
> 

It is enough, this was done again in the interests of simplification -
rather than worry about what versions are in what distro and having the
user check, it simplifies things if everyone just uses pip, which is why I
recommend it.

> > -    .. note::
> > -
> > -        On systems with NUMA support, `libnuma-dev` (aka `numactl-devel`)
> > -        is a recommended dependency when `--legacy-mem` switch is used,
> > -        and a *required* dependency if default memory mode is used.
> > -        While DPDK will compile and run without `libnuma`
> > -        even on NUMA-enabled systems,
> > -        both usability and performance will be degraded.
> 
> I think libnuma is worth to be mentioned here as it is an EAL dependency.

It is mentioned. This just takes out the note about mandatory vs optional
for different memory systems. After this patch the output still includes in
the mandatory dependencies section:

	Library for handling NUMA (Non Uniform Memory Access).
	* numactl-devel in Red Hat/Fedora;
	* libnuma-dev in Debian/Ubuntu;

So again we simplify to just saying to get libnuma rather that having the
user worry about different memory systems.

> 
> > +*   Linux kernel headers or sources required to build kernel modules.
> 
> This one is obvious, OK.
> 
> > -*   libpcap headers and libraries (libpcap-devel) to compile and use the libpcap-based poll-mode driver.
> > -    This driver is disabled by default and can be enabled by setting ``CONFIG_RTE_LIBRTE_PMD_PCAP=y`` in the build time config file.
> 
> OK to drop PMD-specific requirement.
> 
> > +**Additional Libraries**
> > +
> > +A number of DPDK components, such as libraries and poll-mode drivers (PMDs) have additional dependencies.
> > +For DPDK builds using meson, the presence or absence of these dependencies will be
> > +automatically detected enabling or disabling the relevant components appropriately.
> > +
> > +For builds using make, these components are disabled in the default configuration and
> > +need to be enabled manually my changing the relevant setting to "y" in the build configuration file
> 
> typo: s/my/by/
> 
> > +i.e. the ``.config`` file in the build folder.
> > +
> > +In each case, the relevant library development package (``-devel`` or ``-dev``) is needed to build the DPDK components.
> > +
> > +For libraries the additional dependencies include:
> > +
> > +*   libarchive: for some unit tests using tar to get their resources.
> > +
> > +*   jansson: to compile and use the telemetry library.
> > +
> > +*   libelf: to compile and use the bpf library.
> 
> I think these optional dependencies could go away, thanks to the text
> you added above and below.
> 

I'd actually rather keep them here. While we could refer to the programmers
guide, there are a lot of libraries and only 3 optional dependencies, so
I'd rather explicitly list them here.

For drivers, the dependency list would be huge, so I'm just going to refer
to the PMD guide for that.

> > +For poll-mode drivers, the additional dependencies for each driver can be
> > +found in that driver's documentation in the relevant DPDK guide document,
> > +e.g. Network Interface Controller Drivers Guide
> 
> Please use a link here.

Ok.

> You could also link the prog guide if talking about libraries.
> 

I can add one, but I still think it's worth listing the 3 additional deps.
:-)

/Bruce

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] devtools: move ABI scripts from buildtools
@ 2019-11-28 13:46 42% David Marchand
  2019-11-28 14:23  4% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-28 13:46 UTC (permalink / raw)
  To: dev; +Cc: Thomas Monjalon, Neil Horman

Those scripts are only used by developers and not part of the build
process.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 MAINTAINERS                                        | 8 ++++----
 {buildtools => devtools}/check-abi-version.sh      | 0
 {buildtools => devtools}/update-abi.sh             | 2 +-
 {buildtools => devtools}/update_version_map_abi.py | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)
 rename {buildtools => devtools}/check-abi-version.sh (100%)
 rename {buildtools => devtools}/update-abi.sh (95%)
 rename {buildtools => devtools}/update_version_map_abi.py (99%)

diff --git a/MAINTAINERS b/MAINTAINERS
index b51059bc2..4395d8df1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -143,13 +143,13 @@ M: Neil Horman <nhorman@tuxdriver.com>
 F: lib/librte_eal/common/include/rte_compat.h
 F: lib/librte_eal/common/include/rte_function_versioning.h
 F: doc/guides/rel_notes/deprecation.rst
-F: devtools/validate-abi.sh
+F: devtools/check-abi-version.sh
 F: devtools/check-symbol-change.sh
-F: buildtools/check-abi-version.sh
+F: devtools/update-abi.sh
+F: devtools/update_version_map_abi.py
+F: devtools/validate-abi.sh
 F: buildtools/check-experimental-syms.sh
 F: buildtools/map-list-symbol.sh
-F: buildtools/update-abi.sh
-F: buildtools/update_version_map_abi.py
 
 Driver information
 M: Neil Horman <nhorman@tuxdriver.com>
diff --git a/buildtools/check-abi-version.sh b/devtools/check-abi-version.sh
similarity index 100%
rename from buildtools/check-abi-version.sh
rename to devtools/check-abi-version.sh
diff --git a/buildtools/update-abi.sh b/devtools/update-abi.sh
similarity index 95%
rename from buildtools/update-abi.sh
rename to devtools/update-abi.sh
index 15bc6feab..b9b859a3e 100755
--- a/buildtools/update-abi.sh
+++ b/devtools/update-abi.sh
@@ -42,5 +42,5 @@ echo "Path to update:" $update_path
 echo $abi_version > $abi_version_file
 
 find $update_path -name  \*version.map -exec \
-      ./buildtools/update_version_map_abi.py {} \
+      devtools/update_version_map_abi.py {} \
       $abi_version \; -print
diff --git a/buildtools/update_version_map_abi.py b/devtools/update_version_map_abi.py
similarity index 99%
rename from buildtools/update_version_map_abi.py
rename to devtools/update_version_map_abi.py
index 6b9aff7a4..616412a1c 100755
--- a/buildtools/update_version_map_abi.py
+++ b/devtools/update_version_map_abi.py
@@ -6,7 +6,7 @@
 A Python program that updates and merges all available stable ABI versions into
 one ABI version, while leaving experimental ABI exactly as it is. The intended
 ABI version is supplied via command-line parameter. This script is to be called
-from the buildtools/update-abi.sh utility.
+from the devtools/update-abi.sh utility.
 """
 
 from __future__ import print_function
-- 
2.23.0


^ permalink raw reply	[relevance 42%]

* Re: [dpdk-dev] [PATCH 1/8] doc: update Linux GSG system requirements section
  2019-11-22 16:03  4% ` [dpdk-dev] [PATCH 1/8] doc: update Linux GSG system requirements section Bruce Richardson
@ 2019-11-28 11:51  0%   ` Thomas Monjalon
  2019-11-28 14:11  0%     ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-28 11:51 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, john.mcnamara

22/11/2019 17:03, Bruce Richardson:
> Update the system requirements section of the doc to cover builds with
> meson and ninja. This involves updating the package dependencies to include
> meson, ninja and python 3.5, and also updating the optional dependencies
> section to explain that the components are enabled/disabled automatically
> by meson.
> 
> As part of this update, the relevant sections were simplified to keep the
> document shorter. For mandatory requirements, we can refer to the various
> distro's development tools package groups rather than requiring gcc, core
> tools etc. individually. The optional package list was very incomplete, and
> if complete would duplicate information in the individual driver's guides.
> Therefore we can simplify it by listing only the library optional
> requirements and referring users to the driver docs to find details on
> their dependencies.

I agree with the intent.

[...]
> -*   GNU ``make``.
> +*   General development tools including ``make``, and a supported C compiler such as ``gcc`` or ``clang``.

Why referring to make and not meson?

> -*   coreutils: ``cmp``, ``sed``, ``grep``, ``arch``, etc.
> +    * For Red Hat/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
> +    * For Ubuntu/Debian systems these can be installed using ``apt install build-essential``

OK, this is very basic :)

> -*   gcc: versions 4.9 or later is recommended for all platforms.
> -    On some distributions, some specific compiler flags and linker flags are enabled by
> -    default and affect performance (``-fstack-protector``, for example). Please refer to the documentation
> -    of your distribution and to ``gcc -dumpspecs``.

I think we need to keep some compiler requirement somewhere.
What do you suggest?

> -*   libc headers, often packaged as ``gcc-multilib`` (``glibc-devel.i686`` / ``libc6-dev-i386``;
> -    ``glibc-devel.x86_64`` / ``libc6-dev`` for 64-bit compilation on Intel architecture;
> -    ``glibc-devel.ppc64`` for 64 bit IBM Power architecture;)
[...]
> -*   Additional packages required for 32-bit compilation on 64-bit systems are:
> -    * glibc.i686, libgcc.i686, libstdc++.i686 and glibc-devel.i686 for Intel i686/x86_64;
> -    * glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;

OK to drop libc requirements.

> -    .. note::
> -
> -       x86_x32 ABI is currently supported with distribution packages only on Ubuntu
> -       higher than 13.10 or recent Debian distribution. The only supported  compiler is gcc 4.9+.

No note at all about x32?
Do we know how it is supported?

> +*   Python, recommended version 3.5+.
> +    * Python v3.5+ is needed to build DPDK using meson and ninja

We cannot use meson at all with older Python?

> -*   Python, version 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
> +    * Python 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.

I didn't know about 3.2 for scripts. Any special reason?

> +*   Meson (v0.47.1+) and ninja
>  
> +    * Recommended to use the latest versions from Python's "pip" repository:
> +      ``pip3 install meson ninja``

Why recommending pip? Is 0.47.1 enough?

> -    .. note::
> -
> -        On systems with NUMA support, `libnuma-dev` (aka `numactl-devel`)
> -        is a recommended dependency when `--legacy-mem` switch is used,
> -        and a *required* dependency if default memory mode is used.
> -        While DPDK will compile and run without `libnuma`
> -        even on NUMA-enabled systems,
> -        both usability and performance will be degraded.

I think libnuma is worth to be mentioned here as it is an EAL dependency.

> +*   Linux kernel headers or sources required to build kernel modules.

This one is obvious, OK.

> -*   libpcap headers and libraries (libpcap-devel) to compile and use the libpcap-based poll-mode driver.
> -    This driver is disabled by default and can be enabled by setting ``CONFIG_RTE_LIBRTE_PMD_PCAP=y`` in the build time config file.

OK to drop PMD-specific requirement.

> +**Additional Libraries**
> +
> +A number of DPDK components, such as libraries and poll-mode drivers (PMDs) have additional dependencies.
> +For DPDK builds using meson, the presence or absence of these dependencies will be
> +automatically detected enabling or disabling the relevant components appropriately.
> +
> +For builds using make, these components are disabled in the default configuration and
> +need to be enabled manually my changing the relevant setting to "y" in the build configuration file

typo: s/my/by/

> +i.e. the ``.config`` file in the build folder.
> +
> +In each case, the relevant library development package (``-devel`` or ``-dev``) is needed to build the DPDK components.
> +
> +For libraries the additional dependencies include:
> +
> +*   libarchive: for some unit tests using tar to get their resources.
> +
> +*   jansson: to compile and use the telemetry library.
> +
> +*   libelf: to compile and use the bpf library.

I think these optional dependencies could go away, thanks to the text
you added above and below.

> +For poll-mode drivers, the additional dependencies for each driver can be
> +found in that driver's documentation in the relevant DPDK guide document,
> +e.g. Network Interface Controller Drivers Guide

Please use a link here.
You could also link the prog guide if talking about libraries.




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] mark experimental variables
  2019-11-26 14:22  0% ` Neil Horman
@ 2019-11-27 20:45  0%   ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-27 20:45 UTC (permalink / raw)
  To: Neil Horman
  Cc: dev, Thomas Monjalon, Andrew Rybchenko, dpdk stable,
	Ray Kinsella, John McNamara, Marko Kovacevic, Qiming Yang,
	Wenzhuo Lu, Declan Doherty, Adrien Mazarguil, Ferruh Yigit,
	Cristian Dumitrescu

On Tue, Nov 26, 2019 at 3:22 PM Neil Horman <nhorman@tuxdriver.com> wrote:
> On Mon, Nov 25, 2019 at 05:13:14PM +0100, David Marchand wrote:
> > So far, we did not pay attention to direct access to variables but they
> > are part of the API/ABI too and should be clearly identified.
> >
> > Introduce a __rte_experimental_var tag and mark existing variables.
> >
> > Fixes: a4bcd61de82d ("buildtools: add script to check experimental API exports")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > ---
> > Quick patch to try to catch experimental variables.
> > Not sure if we could use a single section, so please advise if there is
> > better to do about this.
> >
> I don't see any definition of __rte_experimental_var here, won't the
> preprocessor choke on this when you try to compile without that?

Sorry, not getting your point.
If there is an issue, then it is the same as __rte_experimental.

[snip]

> > diff --git a/lib/librte_eal/common/include/rte_compat.h b/lib/librte_eal/common/include/rte_compat.h
> > index 3eb33784b..3fd05179f 100644
> > --- a/lib/librte_eal/common/include/rte_compat.h
> > +++ b/lib/librte_eal/common/include/rte_compat.h
> > @@ -11,11 +11,16 @@
> >  #define __rte_experimental \
> >  __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
> >  section(".text.experimental")))
> > +#define __rte_experimental_var \
> > +__attribute__((deprecated("Symbol is not yet part of stable ABI"), \
> > +section(".data.experimental")))
> >
> >  #else
> >
> >  #define __rte_experimental \
> >  __attribute__((section(".text.experimental")))
> > +#define __rte_experimental_var \
> > +__attribute__((section(".data.experimental")))
> >
> >  #endif
> >


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 1/1] fbarray: fix duplicated fbarray file in secondary
  2019-11-26 19:40  3%           ` Yasufumi Ogawa
@ 2019-11-27 10:26  3%             ` Burakov, Anatoly
  0 siblings, 0 replies; 200+ results
From: Burakov, Anatoly @ 2019-11-27 10:26 UTC (permalink / raw)
  To: Yasufumi Ogawa, David Marchand
  Cc: Ananyev, Konstantin, dev, dpdk stable, Yasufumi Ogawa

On 26-Nov-19 7:40 PM, Yasufumi Ogawa wrote:
> Hi David,
> 
> Sorry for slow reply.
> 
> On 2019/11/14 21:27, David Marchand wrote:
>> On Thu, Nov 14, 2019 at 12:42 PM Yasufumi Ogawa <yasufum.o@gmail.com> 
>> wrote:
>>>
>>> On 2019/11/14 2:01, Burakov, Anatoly wrote:
>>>> On 13-Nov-19 9:43 PM, yasufum.o@gmail.com wrote:
>>>>> From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
>>>>>
>>>>> In secondary_msl_create_walk(), it creates a file for fbarrays with 
>>>>> its
>>>>> PID for reserving unique name among secondary processes. However, it
>>>>> does not work if several secondaries run as app containers because 
>>>>> each
>>>>> of containerized secondary has PID 1, and failed to reserve unique 
>>>>> name
>>>>> other than first one. To reserve unique name in each of containers, 
>>>>> use
>>>>> hostname in addition to PID.
>>>>>
>>>>> Cc: stable@dpdk.org
>>>>>
>>>>> Signed-off-by: Yasufumi Ogawa <yasufum.o@gmail.com>
>>>>> ---
>>>>>    lib/librte_eal/linux/eal/eal_memalloc.c | 16 +++++++++++++---
>>>>>    1 file changed, 13 insertions(+), 3 deletions(-)
>>>>>
>>>>> diff --git a/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>> b/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>> index af6d0d023..11de6d4d6 100644
>>>>> --- a/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>> +++ b/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>> @@ -1365,6 +1365,12 @@ secondary_msl_create_walk(const struct
>>>>> rte_memseg_list *msl,
>>>>>        struct rte_memseg_list *primary_msl, *local_msl;
>>>>>        char name[PATH_MAX];
>>>>>        int msl_idx, ret;
>>>>> +    char hostname[HOST_NAME_MAX+1] = { 0 };
>>>>> +    /* filename of secondary's fbarray is defined such as
>>>>> +     * "fbarray_memseg-1048576k-0-0_PID_HOSTNAME" and length of PID
>>>>> +     * can be 7 digits maximumly.
>>>>> +     */
>>>>> +    int fbarray_sec_name_len = 32 + 7 + 1 + HOST_NAME_MAX + 1;
>>>>
>>>> What does 32 stand for? Maybe #define both 32 and 7 values?
>>> Hi Anatoly,
>>>
>>> Thank you for your comments! If my understanding is correct, the prefix
>>> "fbarray_memseg-1048576k-0-0_" is 28 digits and it could be larger if
>>> using the size of hugepage or the number of NUMA nodes are larger
>>> possibly. However, I think 32 digits is still enough.
>>>
>>>   > Maybe #define both 32 and 7 values?
>>> Yes. I think it should be better to use #define if this values are
>>> referred several times.
>>
>>
>> We can truncate to RTE_FBARRAY_NAME_LEN in all cases.
>> And iiuc, rte_fbarray_init will refuse any longer name anyway.
> Could I confirm the issue? I've understood that it is failed to validate 
> the name of fbarray in fully_validate() at 
> "lib/librte_eal/common/eal_common_fbarray.c:697".
> 
> static int
> fully_validate(const char *name, unsigned int elt_sz, unsigned int len)
> {
>          if (name == NULL || elt_sz == 0 || len == 0 || len > INT_MAX) {
>                  rte_errno = EINVAL;
>                  return -1;
>          }
> 
>          if (strnlen(name, RTE_FBARRAY_NAME_LEN) == RTE_FBARRAY_NAME_LEN) {
>                  rte_errno = ENAMETOOLONG;
>                  return -1;
>          }
>          return 0;
> }
> 
> I should overwrite the definition of RTE_FBARRAY_NAME_LEN as previous 
> patch in this case, and it causes an ABI breakage, right? If so, I would 
> like to make the change and give up to update stable release.
> 
> Thanks,
> Yasufumi
> 

It seems we're getting into bikeshedding...

We can do this without ABI breakage. You could have just used 
RTE_FBARRAY_NAME_LEN as max fbarray name length for fbarray_sec_name_len 
(i.e. that would include hostname + pid + whatever else there is). The 
name, as David has pointed out, would be truncated to 
RTE_FBARRAY_NAME_LEN anyway (or, more precisely, it will be refused if 
it's longer than that), so this is the most you can have - so you can 
just use that as the maximum.

-- 
Thanks,
Anatoly

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v8 0/1] fbarray: fix duplicated fbarray file in secondary
  2019-11-13 21:43  3% ` [dpdk-dev] [PATCH v7 0/1] " yasufum.o
  @ 2019-11-27  8:48  3%   ` Yasufumi Ogawa
  1 sibling, 0 replies; 200+ results
From: Yasufumi Ogawa @ 2019-11-27  8:48 UTC (permalink / raw)
  To: anatoly.burakov, konstantin.ananyev, david.marchand, dev
  Cc: yasufumi.ogawa.gy, Yasufumi Ogawa

In secondary_msl_create_walk(), it creates a file for fbarrays with its
PID for reserving unique name among secondary processes. However, it
does not work if several secondaries run as app containers because each
of containerized secondary has PID 1, and failed to reserve unique name
other than first one. To reserve unique name in each of containers, use
hostname in addition to PID.

---
v2:
  * fix typo in commit message
v3:
  * add fclose() after if getting hostname with fscan() is failed
v4:
  * Increase the size of proc_id to 33 and add boundary in calling
    fscan()
v5:
  * revise title to reflect the issue
  * use gethostname() instead of getting from `etc/hostname`
  * use HOST_NAME_MAX for size of string for hostname
v6:
  * change to use hostname and pid to cover both of host and container
    cases
  * change RTE_FBARRAY_NAME_LEN to NAME_MAX to reserve enough size for
    filename
v7:
  * discard changing RTE_FBARRAY_NAME_LEN to NAME_MAX to avoid breaking
    ABI
  * introduce int fbarray_sec_name_len instead of RTE_FBARRAY_NAME_LEN
    to define long filename only for secondary process
  * replace the order of postfixes of pid and hostname
v8:
  * change RTE_FBARRAY_NAME_LEN to the maximum size for secondary
  * fix warning of Signed-off-by
---

Yasufumi Ogawa (1):
  fbarray: fix duplicated fbarray file in secondary

 lib/librte_eal/common/include/rte_fbarray.h |  7 ++++++-
 lib/librte_eal/linux/eal/eal_memalloc.c     | 11 ++++++++---
 2 files changed, 14 insertions(+), 4 deletions(-)

-- 
2.17.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: add abi policy changes to release notes
  2019-11-25 10:55  4% ` Mcnamara, John
@ 2019-11-26 22:50  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-26 22:50 UTC (permalink / raw)
  To: Ray Kinsella; +Cc: dev, Mcnamara, John, marko.kovacevic

> > Add some pointers to the releases notes on the changes to the abi policy,
> > the introduction of project-level ABI management and the deprecation of
> > library-level management.
> > 
> > Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
> 
> Acked-by: John McNamara <john.mcnamara@intel.com>

Applied, thanks




^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v7 1/1] fbarray: fix duplicated fbarray file in secondary
  @ 2019-11-26 19:40  3%           ` Yasufumi Ogawa
  2019-11-27 10:26  3%             ` Burakov, Anatoly
  0 siblings, 1 reply; 200+ results
From: Yasufumi Ogawa @ 2019-11-26 19:40 UTC (permalink / raw)
  To: David Marchand
  Cc: Burakov, Anatoly, Ananyev, Konstantin, dev, dpdk stable, Yasufumi Ogawa

Hi David,

Sorry for slow reply.

On 2019/11/14 21:27, David Marchand wrote:
> On Thu, Nov 14, 2019 at 12:42 PM Yasufumi Ogawa <yasufum.o@gmail.com> wrote:
>>
>> On 2019/11/14 2:01, Burakov, Anatoly wrote:
>>> On 13-Nov-19 9:43 PM, yasufum.o@gmail.com wrote:
>>>> From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
>>>>
>>>> In secondary_msl_create_walk(), it creates a file for fbarrays with its
>>>> PID for reserving unique name among secondary processes. However, it
>>>> does not work if several secondaries run as app containers because each
>>>> of containerized secondary has PID 1, and failed to reserve unique name
>>>> other than first one. To reserve unique name in each of containers, use
>>>> hostname in addition to PID.
>>>>
>>>> Cc: stable@dpdk.org
>>>>
>>>> Signed-off-by: Yasufumi Ogawa <yasufum.o@gmail.com>
>>>> ---
>>>>    lib/librte_eal/linux/eal/eal_memalloc.c | 16 +++++++++++++---
>>>>    1 file changed, 13 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/lib/librte_eal/linux/eal/eal_memalloc.c
>>>> b/lib/librte_eal/linux/eal/eal_memalloc.c
>>>> index af6d0d023..11de6d4d6 100644
>>>> --- a/lib/librte_eal/linux/eal/eal_memalloc.c
>>>> +++ b/lib/librte_eal/linux/eal/eal_memalloc.c
>>>> @@ -1365,6 +1365,12 @@ secondary_msl_create_walk(const struct
>>>> rte_memseg_list *msl,
>>>>        struct rte_memseg_list *primary_msl, *local_msl;
>>>>        char name[PATH_MAX];
>>>>        int msl_idx, ret;
>>>> +    char hostname[HOST_NAME_MAX+1] = { 0 };
>>>> +    /* filename of secondary's fbarray is defined such as
>>>> +     * "fbarray_memseg-1048576k-0-0_PID_HOSTNAME" and length of PID
>>>> +     * can be 7 digits maximumly.
>>>> +     */
>>>> +    int fbarray_sec_name_len = 32 + 7 + 1 + HOST_NAME_MAX + 1;
>>>
>>> What does 32 stand for? Maybe #define both 32 and 7 values?
>> Hi Anatoly,
>>
>> Thank you for your comments! If my understanding is correct, the prefix
>> "fbarray_memseg-1048576k-0-0_" is 28 digits and it could be larger if
>> using the size of hugepage or the number of NUMA nodes are larger
>> possibly. However, I think 32 digits is still enough.
>>
>>   > Maybe #define both 32 and 7 values?
>> Yes. I think it should be better to use #define if this values are
>> referred several times.
> 
> 
> We can truncate to RTE_FBARRAY_NAME_LEN in all cases.
> And iiuc, rte_fbarray_init will refuse any longer name anyway.
Could I confirm the issue? I've understood that it is failed to validate 
the name of fbarray in fully_validate() at 
"lib/librte_eal/common/eal_common_fbarray.c:697".

static int
fully_validate(const char *name, unsigned int elt_sz, unsigned int len)
{
         if (name == NULL || elt_sz == 0 || len == 0 || len > INT_MAX) {
                 rte_errno = EINVAL;
                 return -1;
         }

         if (strnlen(name, RTE_FBARRAY_NAME_LEN) == RTE_FBARRAY_NAME_LEN) {
                 rte_errno = ENAMETOOLONG;
                 return -1;
         }
         return 0;
}

I should overwrite the definition of RTE_FBARRAY_NAME_LEN as previous 
patch in this case, and it causes an ABI breakage, right? If so, I would 
like to make the change and give up to update stable release.

Thanks,
Yasufumi

> 
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC PATCH] mark experimental variables
  2019-11-25 16:13 10% [dpdk-dev] [RFC PATCH] mark experimental variables David Marchand
  2019-11-26  9:25  0% ` Ray Kinsella
@ 2019-11-26 14:22  0% ` Neil Horman
  2019-11-27 20:45  0%   ` David Marchand
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2019-11-26 14:22 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, thomas, arybchenko, stable, Ray Kinsella, John McNamara,
	Marko Kovacevic, Qiming Yang, Wenzhuo Lu, Declan Doherty,
	Adrien Mazarguil, Ferruh Yigit, Cristian Dumitrescu

On Mon, Nov 25, 2019 at 05:13:14PM +0100, David Marchand wrote:
> So far, we did not pay attention to direct access to variables but they
> are part of the API/ABI too and should be clearly identified.
> 
> Introduce a __rte_experimental_var tag and mark existing variables.
> 
> Fixes: a4bcd61de82d ("buildtools: add script to check experimental API exports")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Quick patch to try to catch experimental variables.
> Not sure if we could use a single section, so please advise if there is
> better to do about this.
> 
I don't see any definition of __rte_experimental_var here, won't the
preprocessor choke on this when you try to compile without that?

Neil

> ---
>  buildtools/check-experimental-syms.sh      | 17 +++++++++++++++--
>  devtools/checkpatches.sh                   | 14 +++++++++-----
>  doc/guides/contributing/abi_policy.rst     |  7 ++++---
>  drivers/net/ice/rte_pmd_ice.h              |  3 +++
>  lib/librte_cryptodev/rte_crypto_asym.h     |  3 +++
>  lib/librte_eal/common/include/rte_compat.h |  5 +++++
>  lib/librte_ethdev/rte_flow.h               | 17 +++++++++++++++++
>  lib/librte_port/rte_port_eventdev.h        |  5 +++++
>  8 files changed, 61 insertions(+), 10 deletions(-)
> 
> diff --git a/buildtools/check-experimental-syms.sh b/buildtools/check-experimental-syms.sh
> index f3603e5ba..27f7b39f6 100755
> --- a/buildtools/check-experimental-syms.sh
> +++ b/buildtools/check-experimental-syms.sh
> @@ -34,13 +34,26 @@ do
>  		Please add __rte_experimental to the definition of $SYM
>  		END_OF_MESSAGE
>  		ret=1
> +	elif grep -q "\.data.*[[:space:]]$SYM$" $DUMPFILE &&
> +		! grep -q "\.data\.experimental.*[[:space:]]$SYM$" $DUMPFILE
> +	then
> +		cat >&2 <<- END_OF_MESSAGE
> +		$SYM is not flagged as experimental
> +		but is listed in version map
> +		Please add __rte_experimental_var to the definition of $SYM
> +		END_OF_MESSAGE
> +		ret=1
>  	fi
>  done
>  
>  # Filter out symbols suffixed with a . for icc
>  for SYM in `awk '{
> -	if ($2 != "l" && $4 == ".text.experimental" && !($NF ~ /\.$/)) {
> -		print $NF
> +	if ($2 == "l" || $NF ~ /\.$/) {
> +		next;
> +	}
> +	if ($4 == ".text.experimental" ||
> +	    $4 == ".data.experimental") {
> +		print $NF;
>  	}
>  }' $DUMPFILE`
>  do
> diff --git a/devtools/checkpatches.sh b/devtools/checkpatches.sh
> index b16bace92..d3d02b8ce 100755
> --- a/devtools/checkpatches.sh
> +++ b/devtools/checkpatches.sh
> @@ -90,11 +90,15 @@ check_experimental_tags() { # <patch>
>  				"headers ("current_file")";
>  			ret = 1;
>  		}
> -		if ($1 != "+__rte_experimental" || $2 != "") {
> -			print "__rte_experimental must appear alone on the line" \
> -				" immediately preceding the return type of a function."
> -			ret = 1;
> +
> +		if (NF == 1 && ($1 == "+__rte_experimental" ||
> +				$1 == "+__rte_experimental_var")) {
> +			next;
>  		}
> +		print "__rte_experimental or __rte_experimental_var must " \
> +			"appear alone on the line immediately preceding the " \
> +			"return type of a function.";
> +		ret = 1;
>  	}
>  	END {
>  		exit ret;
> @@ -178,7 +182,7 @@ check () { # <patch> <commit> <title>
>  		ret=1
>  	fi
>  
> -	! $verbose || printf '\nChecking __rte_experimental tags:\n'
> +	! $verbose || printf '\nChecking __rte_experimental* tags:\n'
>  	report=$(check_experimental_tags "$tmpinput")
>  	if [ $? -ne 0 ] ; then
>  		$headline_printed || print_headline "$3"
> diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
> index 05ca95980..189ef6491 100644
> --- a/doc/guides/contributing/abi_policy.rst
> +++ b/doc/guides/contributing/abi_policy.rst
> @@ -300,9 +300,10 @@ Note that marking an API as experimental is a multi step process.
>  To mark an API as experimental, the symbols which are desired to be exported
>  must be placed in an EXPERIMENTAL version block in the corresponding libraries'
>  version map script.
> -Secondly, the corresponding prototypes of those exported functions (in the
> -development header files), must be marked with the ``__rte_experimental`` tag
> -(see ``rte_compat.h``).
> +Secondly, the corresponding prototypes of those exported functions (resp.
> +variables) must be marked with the ``__rte_experimental`` (resp.
> +``__rte_experimental_var``) tag in the development header files (see
> +``rte_compat.h``).
>  The DPDK build makefiles perform a check to ensure that the map file and the
>  C code reflect the same list of symbols.
>  This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
> diff --git a/drivers/net/ice/rte_pmd_ice.h b/drivers/net/ice/rte_pmd_ice.h
> index e254db053..dbd5586d4 100644
> --- a/drivers/net/ice/rte_pmd_ice.h
> +++ b/drivers/net/ice/rte_pmd_ice.h
> @@ -15,6 +15,8 @@
>   */
>  
>  #include <stdio.h>
> +
> +#include <rte_compat.h>
>  #include <rte_mbuf.h>
>  #include <rte_mbuf_dyn.h>
>  
> @@ -81,6 +83,7 @@ union rte_net_ice_proto_xtr_metadata {
>  };
>  
>  /* Offset of mbuf dynamic field for protocol extraction data */
> +__rte_experimental_var
>  extern int rte_net_ice_dynfield_proto_xtr_metadata_offs;
>  
>  /* Mask of mbuf dynamic flags for protocol extraction type */
> diff --git a/lib/librte_cryptodev/rte_crypto_asym.h b/lib/librte_cryptodev/rte_crypto_asym.h
> index 0d34ce8df..d4e84910f 100644
> --- a/lib/librte_cryptodev/rte_crypto_asym.h
> +++ b/lib/librte_cryptodev/rte_crypto_asym.h
> @@ -24,6 +24,7 @@ extern "C" {
>  #include <rte_memory.h>
>  #include <rte_mempool.h>
>  #include <rte_common.h>
> +#include <rte_compat.h>
>  
>  #include "rte_crypto_sym.h"
>  
> @@ -37,10 +38,12 @@ typedef struct rte_crypto_param_t {
>  } rte_crypto_param;
>  
>  /** asym xform type name strings */
> +__rte_experimental_var
>  extern const char *
>  rte_crypto_asym_xform_strings[];
>  
>  /** asym operations type name strings */
> +__rte_experimental_var
>  extern const char *
>  rte_crypto_asym_op_strings[];
>  
> diff --git a/lib/librte_eal/common/include/rte_compat.h b/lib/librte_eal/common/include/rte_compat.h
> index 3eb33784b..3fd05179f 100644
> --- a/lib/librte_eal/common/include/rte_compat.h
> +++ b/lib/librte_eal/common/include/rte_compat.h
> @@ -11,11 +11,16 @@
>  #define __rte_experimental \
>  __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
>  section(".text.experimental")))
> +#define __rte_experimental_var \
> +__attribute__((deprecated("Symbol is not yet part of stable ABI"), \
> +section(".data.experimental")))
>  
>  #else
>  
>  #define __rte_experimental \
>  __attribute__((section(".text.experimental")))
> +#define __rte_experimental_var \
> +__attribute__((section(".data.experimental")))
>  
>  #endif
>  
> diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
> index 452d359a1..c8ea71acc 100644
> --- a/lib/librte_ethdev/rte_flow.h
> +++ b/lib/librte_ethdev/rte_flow.h
> @@ -19,6 +19,7 @@
>  
>  #include <rte_arp.h>
>  #include <rte_common.h>
> +#include <rte_compat.h>
>  #include <rte_ether.h>
>  #include <rte_icmp.h>
>  #include <rte_ip.h>
> @@ -2531,9 +2532,11 @@ struct rte_flow_action_set_meta {
>  };
>  
>  /* Mbuf dynamic field offset for metadata. */
> +__rte_experimental_var
>  extern int rte_flow_dynf_metadata_offs;
>  
>  /* Mbuf dynamic field flag mask for metadata. */
> +__rte_experimental_var
>  extern uint64_t rte_flow_dynf_metadata_mask;
>  
>  /* Mbuf dynamic field pointer for metadata. */
> @@ -2548,14 +2551,24 @@ __rte_experimental
>  static inline uint32_t
>  rte_flow_dynf_metadata_get(struct rte_mbuf *m)
>  {
> +#ifdef ALLOW_EXPERIMENTAL_API
>  	return *RTE_FLOW_DYNF_METADATA(m);
> +#else
> +	RTE_SET_USED(m);
> +	return 0;
> +#endif
>  }
>  
>  __rte_experimental
>  static inline void
>  rte_flow_dynf_metadata_set(struct rte_mbuf *m, uint32_t v)
>  {
> +#ifdef ALLOW_EXPERIMENTAL_API
>  	*RTE_FLOW_DYNF_METADATA(m) = v;
> +#else
> +	RTE_SET_USED(m);
> +	RTE_SET_USED(v);
> +#endif
>  }
>  
>  /*
> @@ -2800,7 +2813,11 @@ __rte_experimental
>  static inline int
>  rte_flow_dynf_metadata_avail(void)
>  {
> +#ifdef ALLOW_EXPERIMENTAL_API
>  	return !!rte_flow_dynf_metadata_mask;
> +#else
> +	return 0;
> +#endif
>  }
>  
>  /**
> diff --git a/lib/librte_port/rte_port_eventdev.h b/lib/librte_port/rte_port_eventdev.h
> index acf88f4e9..59246e204 100644
> --- a/lib/librte_port/rte_port_eventdev.h
> +++ b/lib/librte_port/rte_port_eventdev.h
> @@ -25,6 +25,8 @@ extern "C" {
>  **/
>  
>  #include <stdint.h>
> +
> +#include <rte_compat.h>
>  #include <rte_eventdev.h>
>  
>  #include "rte_port.h"
> @@ -39,6 +41,7 @@ struct rte_port_eventdev_reader_params {
>  };
>  
>  /** Eventdev_reader port operations. */
> +__rte_experimental_var
>  extern struct rte_port_in_ops rte_port_eventdev_reader_ops;
>  
>  /** Eventdev_writer port parameters. */
> @@ -63,6 +66,7 @@ struct rte_port_eventdev_writer_params {
>  };
>  
>  /** Eventdev_writer port operations. */
> +__rte_experimental_var
>  extern struct rte_port_out_ops rte_port_eventdev_writer_ops;
>  
>  /** Event_writer_nodrop port parameters. */
> @@ -90,6 +94,7 @@ struct rte_port_eventdev_writer_nodrop_params {
>  };
>  
>  /** Eventdev_writer_nodrop port operations. */
> +__rte_experimental_var
>  extern struct rte_port_out_ops rte_port_eventdev_writer_nodrop_ops;
>  
>  #ifdef __cplusplus
> -- 
> 2.23.0
> 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] mark experimental variables
  2019-11-26  9:25  0% ` Ray Kinsella
@ 2019-11-26 14:15  3%   ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2019-11-26 14:15 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: David Marchand, dev, thomas, arybchenko, stable, John McNamara,
	Marko Kovacevic, Qiming Yang, Wenzhuo Lu, Declan Doherty,
	Adrien Mazarguil, Ferruh Yigit, Cristian Dumitrescu

On Tue, Nov 26, 2019 at 09:25:49AM +0000, Ray Kinsella wrote:
> 
> My 2c is that it feels a little unweildy to have to annotate, every variable declaration.
> and also extern reference with __rte_experimental_var.
> 
> Is there any easier way?
> 
Note, just to be clear, its not every variable, only the ones exposed as global
variable meant to be accessed outside of the library that are not part of a
versioned ABI.

> Other minor comments below. 
> 
> On 25/11/2019 16:13, David Marchand wrote:
> > So far, we did not pay attention to direct access to variables but they
> > are part of the API/ABI too and should be clearly identified.
> > 
> > Introduce a __rte_experimental_var tag and mark existing variables.
> > 
> > Fixes: a4bcd61de82d ("buildtools: add script to check experimental API exports")
> > Cc: stable@dpdk.org
> > 
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > ---
> > Quick patch to try to catch experimental variables.
> > Not sure if we could use a single section, so please advise if there is
> > better to do about this.
> > 
> > ---
> >  buildtools/check-experimental-syms.sh      | 17 +++++++++++++++--
> >  devtools/checkpatches.sh                   | 14 +++++++++-----
> >  doc/guides/contributing/abi_policy.rst     |  7 ++++---
> >  drivers/net/ice/rte_pmd_ice.h              |  3 +++
> >  lib/librte_cryptodev/rte_crypto_asym.h     |  3 +++
> >  lib/librte_eal/common/include/rte_compat.h |  5 +++++
> >  lib/librte_ethdev/rte_flow.h               | 17 +++++++++++++++++
> >  lib/librte_port/rte_port_eventdev.h        |  5 +++++
> >  8 files changed, 61 insertions(+), 10 deletions(-)
> > 
> > diff --git a/buildtools/check-experimental-syms.sh b/buildtools/check-experimental-syms.sh
> > index f3603e5ba..27f7b39f6 100755
> > --- a/buildtools/check-experimental-syms.sh
> > +++ b/buildtools/check-experimental-syms.sh
> > @@ -34,13 +34,26 @@ do
> >  		Please add __rte_experimental to the definition of $SYM
> >  		END_OF_MESSAGE
> >  		ret=1
> > +	elif grep -q "\.data.*[[:space:]]$SYM$" $DUMPFILE &&
> > +		! grep -q "\.data\.experimental.*[[:space:]]$SYM$" $DUMPFILE
> > +	then
> > +		cat >&2 <<- END_OF_MESSAGE
> > +		$SYM is not flagged as experimental
> > +		but is listed in version map
> > +		Please add __rte_experimental_var to the definition of $SYM
> > +		END_OF_MESSAGE
> > +		ret=1
> >  	fi
> >  done
> >  
> >  # Filter out symbols suffixed with a . for icc
> >  for SYM in `awk '{
> > -	if ($2 != "l" && $4 == ".text.experimental" && !($NF ~ /\.$/)) {
> > -		print $NF
> > +	if ($2 == "l" || $NF ~ /\.$/) {
> > +		next;
> > +	}
> > +	if ($4 == ".text.experimental" ||
> > +	    $4 == ".data.experimental") {
> > +		print $NF;
> >  	}
> >  }' $DUMPFILE`
> >  do
> > diff --git a/devtools/checkpatches.sh b/devtools/checkpatches.sh
> > index b16bace92..d3d02b8ce 100755
> > --- a/devtools/checkpatches.sh
> > +++ b/devtools/checkpatches.sh
> > @@ -90,11 +90,15 @@ check_experimental_tags() { # <patch>
> >  				"headers ("current_file")";
> >  			ret = 1;
> >  		}
> > -		if ($1 != "+__rte_experimental" || $2 != "") {
> > -			print "__rte_experimental must appear alone on the line" \
> > -				" immediately preceding the return type of a function."
> > -			ret = 1;
> > +
> > +		if (NF == 1 && ($1 == "+__rte_experimental" ||
> > +				$1 == "+__rte_experimental_var")) {
> > +			next;
> >  		}
> > +		print "__rte_experimental or __rte_experimental_var must " \
> > +			"appear alone on the line immediately preceding the " \
> > +			"return type of a function.";
> 
> or variable?
> 
> > +		ret = 1;
> >  	}
> >  	END {
> >  		exit ret;
> > @@ -178,7 +182,7 @@ check () { # <patch> <commit> <title>
> >  		ret=1
> >  	fi
> >  
> > -	! $verbose || printf '\nChecking __rte_experimental tags:\n'
> > +	! $verbose || printf '\nChecking __rte_experimental* tags:\n'
> >  	report=$(check_experimental_tags "$tmpinput")
> >  	if [ $? -ne 0 ] ; then
> >  		$headline_printed || print_headline "$3"
> > diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
> > index 05ca95980..189ef6491 100644
> > --- a/doc/guides/contributing/abi_policy.rst
> > +++ b/doc/guides/contributing/abi_policy.rst
> > @@ -300,9 +300,10 @@ Note that marking an API as experimental is a multi step process.
> >  To mark an API as experimental, the symbols which are desired to be exported
> >  must be placed in an EXPERIMENTAL version block in the corresponding libraries'
> >  version map script.
> > -Secondly, the corresponding prototypes of those exported functions (in the
> > -development header files), must be marked with the ``__rte_experimental`` tag
> > -(see ``rte_compat.h``).
> > +Secondly, the corresponding prototypes of those exported functions (resp.
> > +variables) must be marked with the ``__rte_experimental`` (resp.
> > +``__rte_experimental_var``) tag in the development header files (see
> > +``rte_compat.h``).
> 
> Suggest simplifying as follows (remove the resp.). 
> 
> Secondly, the corresponding prototypes of those exported functions (or
> variables) must be marked with the ``__rte_experimental`` (or
> ``__rte_experimental_var``) tag in the development header files (see
> ``rte_compat.h``).
> 
> >  The DPDK build makefiles perform a check to ensure that the map file and the
> >  C code reflect the same list of symbols.
> >  This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
> > diff --git a/drivers/net/ice/rte_pmd_ice.h b/drivers/net/ice/rte_pmd_ice.h
> > index e254db053..dbd5586d4 100644
> > --- a/drivers/net/ice/rte_pmd_ice.h
> > +++ b/drivers/net/ice/rte_pmd_ice.h
> > @@ -15,6 +15,8 @@
> >   */
> >  
> >  #include <stdio.h>
> > +
> > +#include <rte_compat.h>
> >  #include <rte_mbuf.h>
> >  #include <rte_mbuf_dyn.h>
> >  
> > @@ -81,6 +83,7 @@ union rte_net_ice_proto_xtr_metadata {
> >  };
> >  
> >  /* Offset of mbuf dynamic field for protocol extraction data */
> > +__rte_experimental_var
> >  extern int rte_net_ice_dynfield_proto_xtr_metadata_offs;
> >  
> >  /* Mask of mbuf dynamic flags for protocol extraction type */
> > diff --git a/lib/librte_cryptodev/rte_crypto_asym.h b/lib/librte_cryptodev/rte_crypto_asym.h
> > index 0d34ce8df..d4e84910f 100644
> > --- a/lib/librte_cryptodev/rte_crypto_asym.h
> > +++ b/lib/librte_cryptodev/rte_crypto_asym.h
> > @@ -24,6 +24,7 @@ extern "C" {
> >  #include <rte_memory.h>
> >  #include <rte_mempool.h>
> >  #include <rte_common.h>
> > +#include <rte_compat.h>
> >  
> >  #include "rte_crypto_sym.h"
> >  
> > @@ -37,10 +38,12 @@ typedef struct rte_crypto_param_t {
> >  } rte_crypto_param;
> >  
> >  /** asym xform type name strings */
> > +__rte_experimental_var
> >  extern const char *
> >  rte_crypto_asym_xform_strings[];
> >  
> >  /** asym operations type name strings */
> > +__rte_experimental_var
> >  extern const char *
> >  rte_crypto_asym_op_strings[];
> >  
> > diff --git a/lib/librte_eal/common/include/rte_compat.h b/lib/librte_eal/common/include/rte_compat.h
> > index 3eb33784b..3fd05179f 100644
> > --- a/lib/librte_eal/common/include/rte_compat.h
> > +++ b/lib/librte_eal/common/include/rte_compat.h
> > @@ -11,11 +11,16 @@
> >  #define __rte_experimental \
> >  __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
> >  section(".text.experimental")))
> > +#define __rte_experimental_var \
> > +__attribute__((deprecated("Symbol is not yet part of stable ABI"), \
> > +section(".data.experimental")))
> >  
> >  #else
> >  
> >  #define __rte_experimental \
> >  __attribute__((section(".text.experimental")))
> > +#define __rte_experimental_var \
> > +__attribute__((section(".data.experimental")))
> >  
> >  #endif
> >  
> > diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
> > index 452d359a1..c8ea71acc 100644
> > --- a/lib/librte_ethdev/rte_flow.h
> > +++ b/lib/librte_ethdev/rte_flow.h
> > @@ -19,6 +19,7 @@
> >  
> >  #include <rte_arp.h>
> >  #include <rte_common.h>
> > +#include <rte_compat.h>
> >  #include <rte_ether.h>
> >  #include <rte_icmp.h>
> >  #include <rte_ip.h>
> > @@ -2531,9 +2532,11 @@ struct rte_flow_action_set_meta {
> >  };
> >  
> >  /* Mbuf dynamic field offset for metadata. */
> > +__rte_experimental_var
> >  extern int rte_flow_dynf_metadata_offs;
> >  
> >  /* Mbuf dynamic field flag mask for metadata. */
> > +__rte_experimental_var
> >  extern uint64_t rte_flow_dynf_metadata_mask;
> >  
> >  /* Mbuf dynamic field pointer for metadata. */
> > @@ -2548,14 +2551,24 @@ __rte_experimental
> >  static inline uint32_t
> >  rte_flow_dynf_metadata_get(struct rte_mbuf *m)
> >  {
> > +#ifdef ALLOW_EXPERIMENTAL_API
> >  	return *RTE_FLOW_DYNF_METADATA(m);
> > +#else
> > +	RTE_SET_USED(m);
> > +	return 0;
> > +#endif
> >  }
> >  
> >  __rte_experimental
> >  static inline void
> >  rte_flow_dynf_metadata_set(struct rte_mbuf *m, uint32_t v)
> >  {
> > +#ifdef ALLOW_EXPERIMENTAL_API
> >  	*RTE_FLOW_DYNF_METADATA(m) = v;
> > +#else
> > +	RTE_SET_USED(m);
> > +	RTE_SET_USED(v);
> > +#endif
> >  }
> >  
> >  /*
> > @@ -2800,7 +2813,11 @@ __rte_experimental
> >  static inline int
> >  rte_flow_dynf_metadata_avail(void)
> >  {
> > +#ifdef ALLOW_EXPERIMENTAL_API
> >  	return !!rte_flow_dynf_metadata_mask;
> > +#else
> > +	return 0;
> > +#endif
> >  }
> >  
> >  /**
> > diff --git a/lib/librte_port/rte_port_eventdev.h b/lib/librte_port/rte_port_eventdev.h
> > index acf88f4e9..59246e204 100644
> > --- a/lib/librte_port/rte_port_eventdev.h
> > +++ b/lib/librte_port/rte_port_eventdev.h
> > @@ -25,6 +25,8 @@ extern "C" {
> >  **/
> >  
> >  #include <stdint.h>
> > +
> > +#include <rte_compat.h>
> >  #include <rte_eventdev.h>
> >  
> >  #include "rte_port.h"
> > @@ -39,6 +41,7 @@ struct rte_port_eventdev_reader_params {
> >  };
> >  
> >  /** Eventdev_reader port operations. */
> > +__rte_experimental_var
> >  extern struct rte_port_in_ops rte_port_eventdev_reader_ops;
> >  
> >  /** Eventdev_writer port parameters. */
> > @@ -63,6 +66,7 @@ struct rte_port_eventdev_writer_params {
> >  };
> >  
> >  /** Eventdev_writer port operations. */
> > +__rte_experimental_var
> >  extern struct rte_port_out_ops rte_port_eventdev_writer_ops;
> >  
> >  /** Event_writer_nodrop port parameters. */
> > @@ -90,6 +94,7 @@ struct rte_port_eventdev_writer_nodrop_params {
> >  };
> >  
> >  /** Eventdev_writer_nodrop port operations. */
> > +__rte_experimental_var
> >  extern struct rte_port_out_ops rte_port_eventdev_writer_nodrop_ops;
> >  
> >  #ifdef __cplusplus
> > 
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC PATCH] mark experimental variables
  2019-11-25 16:13 10% [dpdk-dev] [RFC PATCH] mark experimental variables David Marchand
@ 2019-11-26  9:25  0% ` Ray Kinsella
  2019-11-26 14:15  3%   ` Neil Horman
  2019-11-26 14:22  0% ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Ray Kinsella @ 2019-11-26  9:25 UTC (permalink / raw)
  To: David Marchand, nhorman, dev
  Cc: thomas, arybchenko, stable, John McNamara, Marko Kovacevic,
	Qiming Yang, Wenzhuo Lu, Declan Doherty, Adrien Mazarguil,
	Ferruh Yigit, Cristian Dumitrescu


My 2c is that it feels a little unweildy to have to annotate, every variable declaration.
and also extern reference with __rte_experimental_var.

Is there any easier way?

Other minor comments below. 

On 25/11/2019 16:13, David Marchand wrote:
> So far, we did not pay attention to direct access to variables but they
> are part of the API/ABI too and should be clearly identified.
> 
> Introduce a __rte_experimental_var tag and mark existing variables.
> 
> Fixes: a4bcd61de82d ("buildtools: add script to check experimental API exports")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Quick patch to try to catch experimental variables.
> Not sure if we could use a single section, so please advise if there is
> better to do about this.
> 
> ---
>  buildtools/check-experimental-syms.sh      | 17 +++++++++++++++--
>  devtools/checkpatches.sh                   | 14 +++++++++-----
>  doc/guides/contributing/abi_policy.rst     |  7 ++++---
>  drivers/net/ice/rte_pmd_ice.h              |  3 +++
>  lib/librte_cryptodev/rte_crypto_asym.h     |  3 +++
>  lib/librte_eal/common/include/rte_compat.h |  5 +++++
>  lib/librte_ethdev/rte_flow.h               | 17 +++++++++++++++++
>  lib/librte_port/rte_port_eventdev.h        |  5 +++++
>  8 files changed, 61 insertions(+), 10 deletions(-)
> 
> diff --git a/buildtools/check-experimental-syms.sh b/buildtools/check-experimental-syms.sh
> index f3603e5ba..27f7b39f6 100755
> --- a/buildtools/check-experimental-syms.sh
> +++ b/buildtools/check-experimental-syms.sh
> @@ -34,13 +34,26 @@ do
>  		Please add __rte_experimental to the definition of $SYM
>  		END_OF_MESSAGE
>  		ret=1
> +	elif grep -q "\.data.*[[:space:]]$SYM$" $DUMPFILE &&
> +		! grep -q "\.data\.experimental.*[[:space:]]$SYM$" $DUMPFILE
> +	then
> +		cat >&2 <<- END_OF_MESSAGE
> +		$SYM is not flagged as experimental
> +		but is listed in version map
> +		Please add __rte_experimental_var to the definition of $SYM
> +		END_OF_MESSAGE
> +		ret=1
>  	fi
>  done
>  
>  # Filter out symbols suffixed with a . for icc
>  for SYM in `awk '{
> -	if ($2 != "l" && $4 == ".text.experimental" && !($NF ~ /\.$/)) {
> -		print $NF
> +	if ($2 == "l" || $NF ~ /\.$/) {
> +		next;
> +	}
> +	if ($4 == ".text.experimental" ||
> +	    $4 == ".data.experimental") {
> +		print $NF;
>  	}
>  }' $DUMPFILE`
>  do
> diff --git a/devtools/checkpatches.sh b/devtools/checkpatches.sh
> index b16bace92..d3d02b8ce 100755
> --- a/devtools/checkpatches.sh
> +++ b/devtools/checkpatches.sh
> @@ -90,11 +90,15 @@ check_experimental_tags() { # <patch>
>  				"headers ("current_file")";
>  			ret = 1;
>  		}
> -		if ($1 != "+__rte_experimental" || $2 != "") {
> -			print "__rte_experimental must appear alone on the line" \
> -				" immediately preceding the return type of a function."
> -			ret = 1;
> +
> +		if (NF == 1 && ($1 == "+__rte_experimental" ||
> +				$1 == "+__rte_experimental_var")) {
> +			next;
>  		}
> +		print "__rte_experimental or __rte_experimental_var must " \
> +			"appear alone on the line immediately preceding the " \
> +			"return type of a function.";

or variable?

> +		ret = 1;
>  	}
>  	END {
>  		exit ret;
> @@ -178,7 +182,7 @@ check () { # <patch> <commit> <title>
>  		ret=1
>  	fi
>  
> -	! $verbose || printf '\nChecking __rte_experimental tags:\n'
> +	! $verbose || printf '\nChecking __rte_experimental* tags:\n'
>  	report=$(check_experimental_tags "$tmpinput")
>  	if [ $? -ne 0 ] ; then
>  		$headline_printed || print_headline "$3"
> diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
> index 05ca95980..189ef6491 100644
> --- a/doc/guides/contributing/abi_policy.rst
> +++ b/doc/guides/contributing/abi_policy.rst
> @@ -300,9 +300,10 @@ Note that marking an API as experimental is a multi step process.
>  To mark an API as experimental, the symbols which are desired to be exported
>  must be placed in an EXPERIMENTAL version block in the corresponding libraries'
>  version map script.
> -Secondly, the corresponding prototypes of those exported functions (in the
> -development header files), must be marked with the ``__rte_experimental`` tag
> -(see ``rte_compat.h``).
> +Secondly, the corresponding prototypes of those exported functions (resp.
> +variables) must be marked with the ``__rte_experimental`` (resp.
> +``__rte_experimental_var``) tag in the development header files (see
> +``rte_compat.h``).

Suggest simplifying as follows (remove the resp.). 

Secondly, the corresponding prototypes of those exported functions (or
variables) must be marked with the ``__rte_experimental`` (or
``__rte_experimental_var``) tag in the development header files (see
``rte_compat.h``).

>  The DPDK build makefiles perform a check to ensure that the map file and the
>  C code reflect the same list of symbols.
>  This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
> diff --git a/drivers/net/ice/rte_pmd_ice.h b/drivers/net/ice/rte_pmd_ice.h
> index e254db053..dbd5586d4 100644
> --- a/drivers/net/ice/rte_pmd_ice.h
> +++ b/drivers/net/ice/rte_pmd_ice.h
> @@ -15,6 +15,8 @@
>   */
>  
>  #include <stdio.h>
> +
> +#include <rte_compat.h>
>  #include <rte_mbuf.h>
>  #include <rte_mbuf_dyn.h>
>  
> @@ -81,6 +83,7 @@ union rte_net_ice_proto_xtr_metadata {
>  };
>  
>  /* Offset of mbuf dynamic field for protocol extraction data */
> +__rte_experimental_var
>  extern int rte_net_ice_dynfield_proto_xtr_metadata_offs;
>  
>  /* Mask of mbuf dynamic flags for protocol extraction type */
> diff --git a/lib/librte_cryptodev/rte_crypto_asym.h b/lib/librte_cryptodev/rte_crypto_asym.h
> index 0d34ce8df..d4e84910f 100644
> --- a/lib/librte_cryptodev/rte_crypto_asym.h
> +++ b/lib/librte_cryptodev/rte_crypto_asym.h
> @@ -24,6 +24,7 @@ extern "C" {
>  #include <rte_memory.h>
>  #include <rte_mempool.h>
>  #include <rte_common.h>
> +#include <rte_compat.h>
>  
>  #include "rte_crypto_sym.h"
>  
> @@ -37,10 +38,12 @@ typedef struct rte_crypto_param_t {
>  } rte_crypto_param;
>  
>  /** asym xform type name strings */
> +__rte_experimental_var
>  extern const char *
>  rte_crypto_asym_xform_strings[];
>  
>  /** asym operations type name strings */
> +__rte_experimental_var
>  extern const char *
>  rte_crypto_asym_op_strings[];
>  
> diff --git a/lib/librte_eal/common/include/rte_compat.h b/lib/librte_eal/common/include/rte_compat.h
> index 3eb33784b..3fd05179f 100644
> --- a/lib/librte_eal/common/include/rte_compat.h
> +++ b/lib/librte_eal/common/include/rte_compat.h
> @@ -11,11 +11,16 @@
>  #define __rte_experimental \
>  __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
>  section(".text.experimental")))
> +#define __rte_experimental_var \
> +__attribute__((deprecated("Symbol is not yet part of stable ABI"), \
> +section(".data.experimental")))
>  
>  #else
>  
>  #define __rte_experimental \
>  __attribute__((section(".text.experimental")))
> +#define __rte_experimental_var \
> +__attribute__((section(".data.experimental")))
>  
>  #endif
>  
> diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
> index 452d359a1..c8ea71acc 100644
> --- a/lib/librte_ethdev/rte_flow.h
> +++ b/lib/librte_ethdev/rte_flow.h
> @@ -19,6 +19,7 @@
>  
>  #include <rte_arp.h>
>  #include <rte_common.h>
> +#include <rte_compat.h>
>  #include <rte_ether.h>
>  #include <rte_icmp.h>
>  #include <rte_ip.h>
> @@ -2531,9 +2532,11 @@ struct rte_flow_action_set_meta {
>  };
>  
>  /* Mbuf dynamic field offset for metadata. */
> +__rte_experimental_var
>  extern int rte_flow_dynf_metadata_offs;
>  
>  /* Mbuf dynamic field flag mask for metadata. */
> +__rte_experimental_var
>  extern uint64_t rte_flow_dynf_metadata_mask;
>  
>  /* Mbuf dynamic field pointer for metadata. */
> @@ -2548,14 +2551,24 @@ __rte_experimental
>  static inline uint32_t
>  rte_flow_dynf_metadata_get(struct rte_mbuf *m)
>  {
> +#ifdef ALLOW_EXPERIMENTAL_API
>  	return *RTE_FLOW_DYNF_METADATA(m);
> +#else
> +	RTE_SET_USED(m);
> +	return 0;
> +#endif
>  }
>  
>  __rte_experimental
>  static inline void
>  rte_flow_dynf_metadata_set(struct rte_mbuf *m, uint32_t v)
>  {
> +#ifdef ALLOW_EXPERIMENTAL_API
>  	*RTE_FLOW_DYNF_METADATA(m) = v;
> +#else
> +	RTE_SET_USED(m);
> +	RTE_SET_USED(v);
> +#endif
>  }
>  
>  /*
> @@ -2800,7 +2813,11 @@ __rte_experimental
>  static inline int
>  rte_flow_dynf_metadata_avail(void)
>  {
> +#ifdef ALLOW_EXPERIMENTAL_API
>  	return !!rte_flow_dynf_metadata_mask;
> +#else
> +	return 0;
> +#endif
>  }
>  
>  /**
> diff --git a/lib/librte_port/rte_port_eventdev.h b/lib/librte_port/rte_port_eventdev.h
> index acf88f4e9..59246e204 100644
> --- a/lib/librte_port/rte_port_eventdev.h
> +++ b/lib/librte_port/rte_port_eventdev.h
> @@ -25,6 +25,8 @@ extern "C" {
>  **/
>  
>  #include <stdint.h>
> +
> +#include <rte_compat.h>
>  #include <rte_eventdev.h>
>  
>  #include "rte_port.h"
> @@ -39,6 +41,7 @@ struct rte_port_eventdev_reader_params {
>  };
>  
>  /** Eventdev_reader port operations. */
> +__rte_experimental_var
>  extern struct rte_port_in_ops rte_port_eventdev_reader_ops;
>  
>  /** Eventdev_writer port parameters. */
> @@ -63,6 +66,7 @@ struct rte_port_eventdev_writer_params {
>  };
>  
>  /** Eventdev_writer port operations. */
> +__rte_experimental_var
>  extern struct rte_port_out_ops rte_port_eventdev_writer_ops;
>  
>  /** Event_writer_nodrop port parameters. */
> @@ -90,6 +94,7 @@ struct rte_port_eventdev_writer_nodrop_params {
>  };
>  
>  /** Eventdev_writer_nodrop port operations. */
> +__rte_experimental_var
>  extern struct rte_port_out_ops rte_port_eventdev_writer_nodrop_ops;
>  
>  #ifdef __cplusplus
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4] mbuf: extend pktmbuf pool private structure
  2019-11-25 10:27  0%       ` Olivier Matz
@ 2019-11-25 21:42  0%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-25 21:42 UTC (permalink / raw)
  To: Shahaf Shuler; +Cc: dev, Olivier Matz

25/11/2019 11:27, Olivier Matz:
> On Mon, Nov 25, 2019 at 10:21:32AM +0000, Shahaf Shuler wrote:
> > With the API and ABI freeze ahead, it will be good to reserve
> > some bits on the private structure for future use.
> > 
> > Otherwise we will potentially need to maintain two different
> > private structure during 2020 period.
> > 
> > There is already one use case for those reserved bits[1]
> > 
> > The reserved field should be set to 0 by the user.
> > 
> > [1]
> > https://patches.dpdk.org/patch/63077/
> > 
> > Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> 
> Acked-by: Olivier Matz <olivier.matz@6wind.com>

Applied, thanks



^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [RFC PATCH] mark experimental variables
@ 2019-11-25 16:13 10% David Marchand
  2019-11-26  9:25  0% ` Ray Kinsella
  2019-11-26 14:22  0% ` Neil Horman
  0 siblings, 2 replies; 200+ results
From: David Marchand @ 2019-11-25 16:13 UTC (permalink / raw)
  To: nhorman, dev
  Cc: thomas, arybchenko, stable, Ray Kinsella, John McNamara,
	Marko Kovacevic, Qiming Yang, Wenzhuo Lu, Declan Doherty,
	Adrien Mazarguil, Ferruh Yigit, Cristian Dumitrescu

So far, we did not pay attention to direct access to variables but they
are part of the API/ABI too and should be clearly identified.

Introduce a __rte_experimental_var tag and mark existing variables.

Fixes: a4bcd61de82d ("buildtools: add script to check experimental API exports")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Quick patch to try to catch experimental variables.
Not sure if we could use a single section, so please advise if there is
better to do about this.

---
 buildtools/check-experimental-syms.sh      | 17 +++++++++++++++--
 devtools/checkpatches.sh                   | 14 +++++++++-----
 doc/guides/contributing/abi_policy.rst     |  7 ++++---
 drivers/net/ice/rte_pmd_ice.h              |  3 +++
 lib/librte_cryptodev/rte_crypto_asym.h     |  3 +++
 lib/librte_eal/common/include/rte_compat.h |  5 +++++
 lib/librte_ethdev/rte_flow.h               | 17 +++++++++++++++++
 lib/librte_port/rte_port_eventdev.h        |  5 +++++
 8 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/buildtools/check-experimental-syms.sh b/buildtools/check-experimental-syms.sh
index f3603e5ba..27f7b39f6 100755
--- a/buildtools/check-experimental-syms.sh
+++ b/buildtools/check-experimental-syms.sh
@@ -34,13 +34,26 @@ do
 		Please add __rte_experimental to the definition of $SYM
 		END_OF_MESSAGE
 		ret=1
+	elif grep -q "\.data.*[[:space:]]$SYM$" $DUMPFILE &&
+		! grep -q "\.data\.experimental.*[[:space:]]$SYM$" $DUMPFILE
+	then
+		cat >&2 <<- END_OF_MESSAGE
+		$SYM is not flagged as experimental
+		but is listed in version map
+		Please add __rte_experimental_var to the definition of $SYM
+		END_OF_MESSAGE
+		ret=1
 	fi
 done
 
 # Filter out symbols suffixed with a . for icc
 for SYM in `awk '{
-	if ($2 != "l" && $4 == ".text.experimental" && !($NF ~ /\.$/)) {
-		print $NF
+	if ($2 == "l" || $NF ~ /\.$/) {
+		next;
+	}
+	if ($4 == ".text.experimental" ||
+	    $4 == ".data.experimental") {
+		print $NF;
 	}
 }' $DUMPFILE`
 do
diff --git a/devtools/checkpatches.sh b/devtools/checkpatches.sh
index b16bace92..d3d02b8ce 100755
--- a/devtools/checkpatches.sh
+++ b/devtools/checkpatches.sh
@@ -90,11 +90,15 @@ check_experimental_tags() { # <patch>
 				"headers ("current_file")";
 			ret = 1;
 		}
-		if ($1 != "+__rte_experimental" || $2 != "") {
-			print "__rte_experimental must appear alone on the line" \
-				" immediately preceding the return type of a function."
-			ret = 1;
+
+		if (NF == 1 && ($1 == "+__rte_experimental" ||
+				$1 == "+__rte_experimental_var")) {
+			next;
 		}
+		print "__rte_experimental or __rte_experimental_var must " \
+			"appear alone on the line immediately preceding the " \
+			"return type of a function.";
+		ret = 1;
 	}
 	END {
 		exit ret;
@@ -178,7 +182,7 @@ check () { # <patch> <commit> <title>
 		ret=1
 	fi
 
-	! $verbose || printf '\nChecking __rte_experimental tags:\n'
+	! $verbose || printf '\nChecking __rte_experimental* tags:\n'
 	report=$(check_experimental_tags "$tmpinput")
 	if [ $? -ne 0 ] ; then
 		$headline_printed || print_headline "$3"
diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index 05ca95980..189ef6491 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -300,9 +300,10 @@ Note that marking an API as experimental is a multi step process.
 To mark an API as experimental, the symbols which are desired to be exported
 must be placed in an EXPERIMENTAL version block in the corresponding libraries'
 version map script.
-Secondly, the corresponding prototypes of those exported functions (in the
-development header files), must be marked with the ``__rte_experimental`` tag
-(see ``rte_compat.h``).
+Secondly, the corresponding prototypes of those exported functions (resp.
+variables) must be marked with the ``__rte_experimental`` (resp.
+``__rte_experimental_var``) tag in the development header files (see
+``rte_compat.h``).
 The DPDK build makefiles perform a check to ensure that the map file and the
 C code reflect the same list of symbols.
 This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
diff --git a/drivers/net/ice/rte_pmd_ice.h b/drivers/net/ice/rte_pmd_ice.h
index e254db053..dbd5586d4 100644
--- a/drivers/net/ice/rte_pmd_ice.h
+++ b/drivers/net/ice/rte_pmd_ice.h
@@ -15,6 +15,8 @@
  */
 
 #include <stdio.h>
+
+#include <rte_compat.h>
 #include <rte_mbuf.h>
 #include <rte_mbuf_dyn.h>
 
@@ -81,6 +83,7 @@ union rte_net_ice_proto_xtr_metadata {
 };
 
 /* Offset of mbuf dynamic field for protocol extraction data */
+__rte_experimental_var
 extern int rte_net_ice_dynfield_proto_xtr_metadata_offs;
 
 /* Mask of mbuf dynamic flags for protocol extraction type */
diff --git a/lib/librte_cryptodev/rte_crypto_asym.h b/lib/librte_cryptodev/rte_crypto_asym.h
index 0d34ce8df..d4e84910f 100644
--- a/lib/librte_cryptodev/rte_crypto_asym.h
+++ b/lib/librte_cryptodev/rte_crypto_asym.h
@@ -24,6 +24,7 @@ extern "C" {
 #include <rte_memory.h>
 #include <rte_mempool.h>
 #include <rte_common.h>
+#include <rte_compat.h>
 
 #include "rte_crypto_sym.h"
 
@@ -37,10 +38,12 @@ typedef struct rte_crypto_param_t {
 } rte_crypto_param;
 
 /** asym xform type name strings */
+__rte_experimental_var
 extern const char *
 rte_crypto_asym_xform_strings[];
 
 /** asym operations type name strings */
+__rte_experimental_var
 extern const char *
 rte_crypto_asym_op_strings[];
 
diff --git a/lib/librte_eal/common/include/rte_compat.h b/lib/librte_eal/common/include/rte_compat.h
index 3eb33784b..3fd05179f 100644
--- a/lib/librte_eal/common/include/rte_compat.h
+++ b/lib/librte_eal/common/include/rte_compat.h
@@ -11,11 +11,16 @@
 #define __rte_experimental \
 __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
 section(".text.experimental")))
+#define __rte_experimental_var \
+__attribute__((deprecated("Symbol is not yet part of stable ABI"), \
+section(".data.experimental")))
 
 #else
 
 #define __rte_experimental \
 __attribute__((section(".text.experimental")))
+#define __rte_experimental_var \
+__attribute__((section(".data.experimental")))
 
 #endif
 
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 452d359a1..c8ea71acc 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -19,6 +19,7 @@
 
 #include <rte_arp.h>
 #include <rte_common.h>
+#include <rte_compat.h>
 #include <rte_ether.h>
 #include <rte_icmp.h>
 #include <rte_ip.h>
@@ -2531,9 +2532,11 @@ struct rte_flow_action_set_meta {
 };
 
 /* Mbuf dynamic field offset for metadata. */
+__rte_experimental_var
 extern int rte_flow_dynf_metadata_offs;
 
 /* Mbuf dynamic field flag mask for metadata. */
+__rte_experimental_var
 extern uint64_t rte_flow_dynf_metadata_mask;
 
 /* Mbuf dynamic field pointer for metadata. */
@@ -2548,14 +2551,24 @@ __rte_experimental
 static inline uint32_t
 rte_flow_dynf_metadata_get(struct rte_mbuf *m)
 {
+#ifdef ALLOW_EXPERIMENTAL_API
 	return *RTE_FLOW_DYNF_METADATA(m);
+#else
+	RTE_SET_USED(m);
+	return 0;
+#endif
 }
 
 __rte_experimental
 static inline void
 rte_flow_dynf_metadata_set(struct rte_mbuf *m, uint32_t v)
 {
+#ifdef ALLOW_EXPERIMENTAL_API
 	*RTE_FLOW_DYNF_METADATA(m) = v;
+#else
+	RTE_SET_USED(m);
+	RTE_SET_USED(v);
+#endif
 }
 
 /*
@@ -2800,7 +2813,11 @@ __rte_experimental
 static inline int
 rte_flow_dynf_metadata_avail(void)
 {
+#ifdef ALLOW_EXPERIMENTAL_API
 	return !!rte_flow_dynf_metadata_mask;
+#else
+	return 0;
+#endif
 }
 
 /**
diff --git a/lib/librte_port/rte_port_eventdev.h b/lib/librte_port/rte_port_eventdev.h
index acf88f4e9..59246e204 100644
--- a/lib/librte_port/rte_port_eventdev.h
+++ b/lib/librte_port/rte_port_eventdev.h
@@ -25,6 +25,8 @@ extern "C" {
 **/
 
 #include <stdint.h>
+
+#include <rte_compat.h>
 #include <rte_eventdev.h>
 
 #include "rte_port.h"
@@ -39,6 +41,7 @@ struct rte_port_eventdev_reader_params {
 };
 
 /** Eventdev_reader port operations. */
+__rte_experimental_var
 extern struct rte_port_in_ops rte_port_eventdev_reader_ops;
 
 /** Eventdev_writer port parameters. */
@@ -63,6 +66,7 @@ struct rte_port_eventdev_writer_params {
 };
 
 /** Eventdev_writer port operations. */
+__rte_experimental_var
 extern struct rte_port_out_ops rte_port_eventdev_writer_ops;
 
 /** Event_writer_nodrop port parameters. */
@@ -90,6 +94,7 @@ struct rte_port_eventdev_writer_nodrop_params {
 };
 
 /** Eventdev_writer_nodrop port operations. */
+__rte_experimental_var
 extern struct rte_port_out_ops rte_port_eventdev_writer_nodrop_ops;
 
 #ifdef __cplusplus
-- 
2.23.0


^ permalink raw reply	[relevance 10%]

* [dpdk-dev] [PATCH v2 1/8] doc: update Linux GSG system requirements section
  @ 2019-11-25 14:55  4%   ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2019-11-25 14:55 UTC (permalink / raw)
  To: john.mcnamara; +Cc: dev, anatoly.burakov, Bruce Richardson

Update the system requirements section of the doc to cover builds with
meson and ninja. This involves updating the package dependencies to include
meson, ninja and python 3.5, and also updating the optional dependencies
section to explain that the components are enabled/disabled automatically
by meson.

As part of this update, the relevant sections were simplified to keep the
document shorter. For mandatory requirements, we can refer to the various
distro's development tools package groups rather than requiring gcc, core
tools etc. individually. The optional package list was very incomplete, and
if complete would duplicate information in the individual driver's guides.
Therefore we can simplify it by listing only the library optional
requirements and referring users to the driver docs to find details on
their dependencies.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/linux_gsg/sys_reqs.rst | 64 +++++++++++++++----------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index d2359058b..e18f43116 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -37,32 +37,22 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   GNU ``make``.
+*   General development tools including ``make``, and a supported C compiler such as ``gcc`` or ``clang``.
 
-*   coreutils: ``cmp``, ``sed``, ``grep``, ``arch``, etc.
+    * For Red Hat/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
 
-*   gcc: versions 4.9 or later is recommended for all platforms.
-    On some distributions, some specific compiler flags and linker flags are enabled by
-    default and affect performance (``-fstack-protector``, for example). Please refer to the documentation
-    of your distribution and to ``gcc -dumpspecs``.
+    * For Ubuntu/Debian systems these can be installed using ``apt install build-essential``
 
-*   libc headers, often packaged as ``gcc-multilib`` (``glibc-devel.i686`` / ``libc6-dev-i386``;
-    ``glibc-devel.x86_64`` / ``libc6-dev`` for 64-bit compilation on Intel architecture;
-    ``glibc-devel.ppc64`` for 64 bit IBM Power architecture;)
+*   Python, recommended version 3.5+.
 
-*   Linux kernel headers or sources required to build kernel modules. (kernel - devel.x86_64;
-    kernel - devel.ppc64)
+    * Python v3.5+ is needed to build DPDK using meson and ninja
 
-*   Additional packages required for 32-bit compilation on 64-bit systems are:
+    * Python 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
 
-    * glibc.i686, libgcc.i686, libstdc++.i686 and glibc-devel.i686 for Intel i686/x86_64;
+*   Meson (v0.47.1+) and ninja
 
-    * glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;
-
-    .. note::
-
-       x86_x32 ABI is currently supported with distribution packages only on Ubuntu
-       higher than 13.10 or recent Debian distribution. The only supported  compiler is gcc 4.9+.
+    * Recommended to use the latest versions from Python's "pip" repository:
+      ``pip3 install meson ninja``
 
 *   Library for handling NUMA (Non Uniform Memory Access).
 
@@ -70,16 +60,7 @@ Compilation of the DPDK
 
     * libnuma-dev in Debian/Ubuntu;
 
-    .. note::
-
-        On systems with NUMA support, `libnuma-dev` (aka `numactl-devel`)
-        is a recommended dependency when `--legacy-mem` switch is used,
-        and a *required* dependency if default memory mode is used.
-        While DPDK will compile and run without `libnuma`
-        even on NUMA-enabled systems,
-        both usability and performance will be degraded.
-
-*   Python, version 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
+*   Linux kernel headers or sources required to build kernel modules.
 
 .. note::
 
@@ -96,10 +77,29 @@ Compilation of the DPDK
     which allows users to take leading edge advantage of IBM's latest POWER hardware features on Linux. To install
     it, see the IBM official installation document.
 
-*   libpcap headers and libraries (libpcap-devel) to compile and use the libpcap-based poll-mode driver.
-    This driver is disabled by default and can be enabled by setting ``CONFIG_RTE_LIBRTE_PMD_PCAP=y`` in the build time config file.
+**Additional Libraries**
+
+A number of DPDK components, such as libraries and poll-mode drivers (PMDs) have additional dependencies.
+For DPDK builds using meson, the presence or absence of these dependencies will be
+automatically detected enabling or disabling the relevant components appropriately.
+
+For builds using make, these components are disabled in the default configuration and
+need to be enabled manually my changing the relevant setting to "y" in the build configuration file
+i.e. the ``.config`` file in the build folder.
+
+In each case, the relevant library development package (``-devel`` or ``-dev``) is needed to build the DPDK components.
+
+For libraries the additional dependencies include:
+
+*   libarchive: for some unit tests using tar to get their resources.
+
+*   jansson: to compile and use the telemetry library.
+
+*   libelf: to compile and use the bpf library.
 
-*   libarchive headers and library are needed for some unit tests using tar to get their resources.
+For poll-mode drivers, the additional dependencies for each driver can be
+found in that driver's documentation in the relevant DPDK guide document,
+e.g. Network Interface Controller Drivers Guide
 
 
 Running DPDK Applications
-- 
2.21.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] build: fix windows build failure for 19.11
  2019-11-25 13:58  0%   ` David Marchand
@ 2019-11-25 14:16  3%     ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-25 14:16 UTC (permalink / raw)
  To: Pallavi Kadam
  Cc: dev, Thomas Monjalon, ranjit.menon, Bruce Richardson, Burakov, Anatoly

Confirmed author with Bruce offlist.

Applied with commitlog proposed by Bruce:

While most windows apps can handle both "\" and "/" as path separators,
"more" is treating the "/" as the start of a command-line flag in this
case, causing errors.

Fixes: cba806e07d6f ("build: change ABI versioning to global")

> > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
> > > Tested-by: Pallavi Kadam <pallavi.kadam@intel.com>
> > Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>

Thanks.


--
David Marchand


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] build: fix windows build failure for 19.11
  2019-11-25 13:05  0% ` Burakov, Anatoly
@ 2019-11-25 13:58  0%   ` David Marchand
  2019-11-25 14:16  3%     ` David Marchand
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-25 13:58 UTC (permalink / raw)
  To: Burakov, Anatoly, Bruce Richardson, Pallavi Kadam
  Cc: dev, Thomas Monjalon, ranjit.menon

On Mon, Nov 25, 2019 at 2:06 PM Burakov, Anatoly
<anatoly.burakov@intel.com> wrote:
>
> On 23-Nov-19 2:59 AM, Pallavi Kadam wrote:
> > This patch fixes Windows build failure caused due to
> > 'config: change ABI versioning to global' patch.
> > This patch can be merged in 19.11 release.
> >
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
> > Tested-by: Pallavi Kadam <pallavi.kadam@intel.com>
> > ---
>
> Missing Fixes: tag
>
> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>

Who is the author of this patch?
If Pallavi authored it, we are missing a sob.

Can you just clarify this?
Then I can fix the commitlog and apply this patch.



-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] build: fix windows build failure for 19.11
  2019-11-23  2:59  3% [dpdk-dev] [PATCH] build: fix windows build failure for 19.11 Pallavi Kadam
  2019-11-25  9:59  0% ` Bruce Richardson
@ 2019-11-25 13:05  0% ` Burakov, Anatoly
  2019-11-25 13:58  0%   ` David Marchand
  1 sibling, 1 reply; 200+ results
From: Burakov, Anatoly @ 2019-11-25 13:05 UTC (permalink / raw)
  To: Pallavi Kadam, dev, thomas; +Cc: bruce.richardson, ranjit.menon

On 23-Nov-19 2:59 AM, Pallavi Kadam wrote:
> This patch fixes Windows build failure caused due to
> 'config: change ABI versioning to global' patch.
> This patch can be merged in 19.11 release.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
> Tested-by: Pallavi Kadam <pallavi.kadam@intel.com>
> ---

Missing Fixes: tag

Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>

-- 
Thanks,
Anatoly

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v1] doc: update release notes for 19.11
@ 2019-11-25 12:38  3% John McNamara
  0 siblings, 0 replies; 200+ results
From: John McNamara @ 2019-11-25 12:38 UTC (permalink / raw)
  To: dev; +Cc: thomas, John McNamara

Fix grammar, spelling and formatting of DPDK 19.11 release notes.

Signed-off-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_19_11.rst | 148 +++++++++++++++++----------------
 1 file changed, 78 insertions(+), 70 deletions(-)

diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index 48c80e5..0a24c25 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -56,57 +56,59 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
-* **FreeBSD now supports `--base-virtaddr` EAL option.**
+* **Added support for --base-virtaddr EAL option to FreeBSD.**
 
-  FreeBSD version now also supports setting base virtual address for mapping
-  pages and resources into its address space.
+  The FreeBSD version of DPDK now also supports setting base virtual address
+  for mapping pages and resources into its address space.
 
 * **Added Lock-free Stack for aarch64.**
 
-  The lock-free stack implementation is enabled for aarch64 platforms.
+  Enabled the lock-free stack implementation for aarch64 platforms.
 
-* **Changed mempool allocation behaviour.**
+* **Changed mempool allocation behavior.**
 
-  Objects are no longer across pages by default.
-  It may consume more memory when using small memory pages.
+  Changed the mempool allocation behaviour so that objects no longer cross
+  pages by default. Note, this may consume more memory when using small memory
+  pages.
 
-* **Added support of dynamic fields and flags in mbuf.**
+* **Added support for dynamic fields and flags in mbuf.**
 
   This new feature adds the ability to dynamically register some room
   for a field or a flag in the mbuf structure. This is typically used
   for specific offload features, where adding a static field or flag
   in the mbuf is not justified.
 
-* **Added hairpin queue.**
+* **Added support for hairpin queues.**
 
-  On supported NICs, we can now setup haipin queue which will offload packets
-  from the wire, backto the wire.
+  On supported NICs, we can now setup hairpin queues which will offload packets
+  from the wire, back to the wire.
 
 * **Added flow tag in rte_flow.**
 
-  SET_TAG action and TAG item have been added to support transient flow tag.
+  The ``SET_TAG`` action and ``TAG`` item have been added to support transient
+  flow tag.
 
 * **Extended metadata support in rte_flow.**
 
-  Flow metadata is extended to both Rx and Tx.
+  Flow metadata has been extended to both Rx and Tx.
 
   * Tx metadata can also be set by SET_META action of rte_flow.
-  * Rx metadata is delivered to host via a dynamic field of ``rte_mbuf`` with
-    PKT_RX_DYNF_METADATA.
+  * Rx metadata is delivered to the host via a dynamic field of ``rte_mbuf``
+    with ``PKT_RX_DYNF_METADATA``.
 
-* **Added ethdev API to set supported packet types**
+* **Added ethdev API to set supported packet types.**
 
-  * Added new API ``rte_eth_dev_set_ptypes`` that allows an application to
-    inform PMD about reduced range of packet types to handle.
-  * This scheme will allow PMDs to avoid lookup to internal ptype table on Rx
-    and thereby improve Rx performance if application wishes do so.
+  * Added new API ``rte_eth_dev_set_ptypes`` which allows an application to
+    inform a PMD about a reduced range of packet types to handle.
+  * This scheme will allow PMDs to avoid lookup of internal ptype table on Rx
+    and thereby improve Rx performance if the application wishes to do so.
 
-* **Added Rx offload flag to enable or disable RSS update**
+* **Added Rx offload flag to enable or disable RSS update.**
 
-  * Added new Rx offload flag `DEV_RX_OFFLOAD_RSS_HASH` which can be used to
-    enable/disable PMDs write to `rte_mbuf::hash::rss`.
-  * PMDs notify the validity of `rte_mbuf::hash:rss` to the application
-    by enabling `PKT_RX_RSS_HASH ` flag in `rte_mbuf::ol_flags`.
+  * Added new Rx offload flag ``DEV_RX_OFFLOAD_RSS_HASH`` which can be used to
+    enable/disable PMDs write to ``rte_mbuf::hash::rss``.
+  * PMDs notify the validity of ``rte_mbuf::hash:rss`` to the application
+    by enabling ``PKT_RX_RSS_HASH`` flag in ``rte_mbuf::ol_flags``.
 
 * **Updated the enic driver.**
 
@@ -116,7 +118,7 @@ New Features
 * **Added Hisilicon hns3 PMD.**
 
   Added the new ``hns3`` net driver for the inbuilt Hisilicon Network
-  Subsystem 3(HNS3) network engine found in the Hisilicon Kunpeng 920 SoC.
+  Subsystem 3 (HNS3) network engine found in the Hisilicon Kunpeng 920 SoC.
   See the :doc:`../nics/hns3` guide for more details on this new driver.
 
 * **Added NXP PFE PMD.**
@@ -144,11 +146,11 @@ New Features
 
   Added support for the ``RTE_ETH_DEV_CLOSE_REMOVE`` flag.
 
-* **Added RX/TX packet burst mode get API.**
+* **Added Rx/Tx packet burst mode "get" API.**
 
   Added two new functions ``rte_eth_rx_burst_mode_get`` and
   ``rte_eth_tx_burst_mode_get`` that allow an application
-  to retrieve the mode information about RX/TX packet burst
+  to retrieve the mode information about Rx/Tx packet burst
   such as Scalar or Vector, and Vector technology like AVX2.
 
 * **Updated the Intel ice driver.**
@@ -169,8 +171,9 @@ New Features
 
 * **Added cryptodev asymmetric session-less operation.**
 
-  Added session-less option to cryptodev asymmetric structure. It works the same
-  way as symmetric crypto, corresponding xform is used directly by the crypto op.
+  Added a session-less option to the cryptodev asymmetric structure. It works
+  the same way as symmetric crypto, and the corresponding transform is used
+  directly by the crypto operation.
 
 * **Updated the Huawei hinic driver.**
 
@@ -199,29 +202,31 @@ New Features
   Updated the AF_XDP PMD. The new features include:
 
   * Enabled zero copy between application mempools and UMEM by enabling the
-    XDP_UMEM_UNALIGNED_CHUNKS UMEM flag.
+    ``XDP_UMEM_UNALIGNED_CHUNKS UMEM`` flag.
 
 * **Added Marvell NITROX symmetric crypto PMD.**
 
   Added a symmetric crypto PMD for Marvell NITROX V security processor.
-  See the :doc:`../cryptodevs/nitrox` guide for more details on this new
+  See the :doc:`../cryptodevs/nitrox` guide for more details on this new PMD.
 
 * **Added asymmetric support to Marvell OCTEON TX crypto PMD.**
 
-  Added support for asymmetric operations in Marvell OCTEON TX cypto PMD.
+  Added support for asymmetric operations to Marvell OCTEON TX crypto PMD.
   Supports RSA and modexp operations.
 
-* **Added Marvell OCTEON TX2 crypto PMD**
+* **Added Marvell OCTEON TX2 crypto PMD.**
 
-  Added a new PMD driver for h/w crypto offload block on ``OCTEON TX2`` SoC.
+  Added a new PMD driver for hardware crypto offload block on ``OCTEON TX2``
+  SoC.
 
   See :doc:`../cryptodevs/octeontx2` for more details
 
 * **Updated NXP crypto PMDs for PDCP support.**
 
-  PDCP support is added to DPAA_SEC and DPAA2_SEC PMDs using rte_security APIs.
-  Support is added for all sequence number sizes for control and user plane.
-  Test and test-crypto-perf applications are updated for unit testing.
+  Added PDCP support to the DPAA_SEC and DPAA2_SEC PMDs using rte_security
+  APIs.  Support has been added for all sequence number sizes for control and
+  user plane.  Test and test-crypto-perf applications have been updated for
+  unit testing.
 
 * **Updated the AESNI-MB PMD.**
 
@@ -230,7 +235,7 @@ New Features
 * **Updated the AESNI-GCM PMD.**
 
   * Added support for intel-ipsec-mb version 0.53.
-  * Supported in-place chained mbufs on AES-GCM algorithm.
+  * Added support for in-place chained mbufs with AES-GCM algorithm.
 
 * **Enabled Single Pass GCM acceleration on QAT GEN3.**
 
@@ -242,7 +247,8 @@ New Features
 * **Updated the Intel QuickAssist Technology (QAT) asymmetric crypto PMD.**
 
   * Added support for asymmetric session-less operations.
-  * Added support for RSA algorithm with pair (n, d) private key representation.
+  * Added support for RSA algorithm with pair ``(n, d)`` private key
+    representation.
   * Added support for RSA algorithm with quintuple private key representation.
 
 * **Updated the Intel QuickAssist Technology (QAT) compression PMD.**
@@ -252,19 +258,19 @@ New Features
 
 * **Added external buffers support for dpdk-test-compress-perf tool.**
 
-  Added a command line option to dpdk-test-compress-perf tool to allocate
-  and use memory zones as external buffers instead of keeping the data directly
-  in mbuf areas.
+  Added a command line option to the ``dpdk-test-compress-perf`` tool to
+  allocate and use memory zones as external buffers instead of keeping the
+  data directly in mbuf areas.
 
 * **Updated the IPSec library.**
 
-  * Added SA Database API to ``librte_ipsec``. A new test-sad application is also
-    introduced to evaluate and perform custom functional and performance tests
-    for IPsec SAD implementation.
+  * Added Security Associations (SA) Database API to ``librte_ipsec``. A new
+    test-sad application has also been introduced to evaluate and perform
+    custom functional and performance tests for an IPsec SAD implementation.
 
   * Support fragmented packets in inline crypto processing mode with fallback
-    ``lookaside-none`` session. Corresponding changes are also added in IPsec
-    Security Gateway application.
+    ``lookaside-none`` session. Corresponding changes are also added in the
+    IPsec Security Gateway application.
 
 * **Introduced FIFO for NTB PMD.**
 
@@ -278,20 +284,21 @@ New Features
 
 * **Added RIB and FIB (Routing/Forwarding Information Base) libraries.**
 
-  RIB and FIB can replace the LPM (Longest Prefix Match) library
-  with better control plane (RIB) performance.
-  The data plane (FIB) can be extended with new algorithms.
+  Added Routing and Forwarding Information Base (RIB/FIB) libraries. RIB and
+  FIB can replace the LPM (Longest Prefix Match) library with better control
+  plane (RIB) performance. The data plane (FIB) can be extended with new
+  algorithms.
 
-* **Updated testpmd.**
+* **Updated testpmd with a command for ptypes.**
 
   * Added a console command to testpmd app, ``show port (port_id) ptypes`` which
     gives ability to print port supported ptypes in different protocol layers.
   * Packet type detection disabled by default for the supported PMDs.
 
-* **Added new example l2fwd-event application.**
+* **Added new l2fwd-event sample application.**
 
-  Added an example application `l2fwd-event` that adds event device support to
-  traditional l2fwd example. It demonstrates usage of poll and event mode IO
+  Added an example application ``l2fwd-event`` that adds event device support to
+  the traditional l2fwd example. It demonstrates usage of poll and event mode IO
   mechanism under a single application.
 
 * **Added build support for Link Time Optimization.**
@@ -299,20 +306,20 @@ New Features
   LTO is an optimization technique used by the compiler to perform whole
   program analysis and optimization at link time.  In order to do that
   compilers store their internal representation of the source code that
-  the linker uses at the final stage of compilation process.
+  the linker uses at the final stage of the compilation process.
 
   See :doc:`../prog_guide/lto` for more information:
 
 * **Added IOVA as VA support for KNI.**
 
-  * Added IOVA = VA support for KNI, KNI can operate in IOVA = VA mode when
-    `iova-mode=va` EAL option is passed to the application or when bus IOVA
+  * Added IOVA = VA support for KNI. KNI can operate in IOVA = VA mode when
+    ``iova-mode=va`` EAL option is passed to the application or when bus IOVA
     scheme is selected as RTE_IOVA_VA. This mode only works on Linux Kernel
-    versions above 4.9.0.
+    versions >= 4.9.0.
 
   * Due to IOVA to KVA address translations, based on the KNI use case there
     can be a performance impact. For mitigation, forcing IOVA to PA via EAL
-    "--iova-mode=pa" option can be used, IOVA_DC bus iommu scheme can also
+    ``--iova-mode=pa`` option can be used, IOVA_DC bus iommu scheme can also
     result in IOVA as PA.
 
 
@@ -333,8 +340,8 @@ Removed Items
     port config all crc-strip|scatter|rx-cksum|rx-timestamp|
                     hw-vlan|hw-vlan-filter|hw-vlan-strip|hw-vlan-extend on|off
 
-  The testpmd commands set that can be used instead
-  in order to enable or disable Rx offloading on all Rx queues of a port is::
+  The testpmd command set that can be used instead in order to enable or
+  disable Rx offloading on all Rx queues of a port is::
 
     port config <port_id> rx_offload crc_strip|scatter|
                                      ipv4_cksum|udp_cksum|tcp_cksum|timestamp|
@@ -430,20 +437,21 @@ API Changes
   If the intent is to iterate over ports, ``RTE_ETH_FOREACH_*`` macros
   are better port iterators.
 
-* ethdev: RTE_FLOW_ITEM_TYPE_META data endianness altered to host one.
+* ethdev: ``RTE_FLOW_ITEM_TYPE_META`` data endianness altered to host one.
   Due to the new dynamic metadata field in mbuf is host-endian either, there
-  is the minor compatibility issue for applications in case of 32-bit values
+  is a minor compatibility issue for applications in case of 32-bit values
   supported.
 
-* ethdev: the tx_metadata mbuf field is moved to dymanic one.
-  PKT_TX_METADATA flag is replaced with PKT_TX_DYNF_METADATA.
-  DEV_TX_OFFLOAD_MATCH_METADATA offload flag is removed, now metadata
+* ethdev: the tx_metadata mbuf field is moved to dynamic one.
+  ``PKT_TX_METADATA`` flag is replaced with ``PKT_TX_DYNF_METADATA``.
+  ``DEV_TX_OFFLOAD_MATCH_METADATA`` offload flag is removed, now metadata
   support in PMD is engaged on dynamic field registration.
 
 * event: The function ``rte_event_eth_tx_adapter_enqueue`` takes an additional
   input as ``flags``. Flag ``RTE_EVENT_ETH_TX_ADAPTER_ENQUEUE_SAME_DEST`` which
   has been introduced in this release is used when used when all the packets
-  enqueued in the tx adapter are destined for the same Ethernet port & Tx queue.
+  enqueued in the Tx adapter are destined for the same Ethernet port ans Tx
+  queue.
 
 * sched: The pipe nodes configuration parameters such as number of pipes,
   pipe queue sizes, pipe profiles, etc., are moved from port level structure
@@ -472,9 +480,9 @@ ABI Changes
   align the Ethernet header on receive and all known encapsulations
   preserve the alignment of the header.
 
-* security: The field ``replay_win_sz`` has been moved from ipsec library
+* security: The field ``replay_win_sz`` has been moved from the ipsec library
   based ``rte_ipsec_sa_prm`` structure to security library based structure
-  ``rte_security_ipsec_xform``, which specify the Anti replay window size
+  ``rte_security_ipsec_xform``, which specify the anti-replay window size
   to enable sequence replay attack handling.
 
 * ipsec: The field ``replay_win_sz`` has been removed from the structure
-- 
2.7.5


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2 3/3] ethdev: improve flow mark Rx offload deprecation notice
  2019-11-25 10:44  4%           ` Jerin Jacob
@ 2019-11-25 11:39  0%             ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-25 11:39 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: Andrew Rybchenko, Ferruh Yigit, Pavan Nikhilesh, Neil Horman,
	John McNamara, Marko Kovacevic, dpdk-dev, Ori Kam,
	David Marchand, Olivier Matz, Ananyev, Konstantin

25/11/2019 11:44, Jerin Jacob:
> On Sun, Nov 24, 2019 at 3:12 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> >
> > 23/11/2019 10:42, Jerin Jacob:
> > > On Sat, Nov 23, 2019 at 3:58 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> > > > 22/11/2019 12:53, Andrew Rybchenko:
> > > > > On 11/22/19 2:15 PM, Thomas Monjalon wrote:
> > > > > > 22/11/2019 11:12, Andrew Rybchenko:
> > > > > >> On 11/22/19 1:01 AM, Thomas Monjalon wrote:
> > > > > >>> 19/11/2019 13:12, Andrew Rybchenko:
> > > > > >>>> The deprecation notice is required since it adds more requirements
> > > > > >>>> when RTE flow mark and flag actions may be used and require
> > > > > >>>> changes in applications.
> > > > > >>> I am still not sure what is the best solution here.
> > > > > >>> I continued to think about it in this thread:
> > > > > >>>   http://mails.dpdk.org/archives/dev/2019-November/151960.html
> > > > > >>>
> > > > > >>> I think we cannot require any application change until 20.11
> > > > > >>> in order to keep API (and behaviour) compatibility.
> > > > > >> Expected, but still very disappointing.
> > > > > >>
> > > > > >> The feature is implemented by Pavan (@ Marvell), supported by me,
> > > > > >> used by Qi (@ Intel), looks better than alternatives from application
> > > > > >> developer point of view [1] and finally postponed for 1 year without really
> > > > > >> strong motivation.
> > > > > >
> > > > > > I see different valuable point of views. This is enough motivation.
> > > > >
> > > > > It looks like I miss it in previous discussion, I would be thankful if
> > > > > you give me links to read or hints how to find.
> > > >
> > > > http://mails.dpdk.org/archives/dev/2019-November/150793.html
> > > >
> > > > > Introducing new types of controls would make configuration more and
> > > > > more complex. I think that many different types of control would
> > > > > over-complicate it. May be it is unavoidable, but it should be clear
> > > > > why the problem cannot be solved using existing types of controls
> > > > > (e.g. offloads).
> > > >
> > > > The offload control is used as an effective configuration for now.
> > > > The features which are configured with DEV_RX_OFFLOAD_*
> > > > do not need any other API to be used.
> > > > Extending DEV_RX_OFFLOAD_* bits for enabling features which
> > > > must be configured via other API anyway, is possible.
> > > > The real problem is that features in DEV_RX_OFFLOAD_* are supposed
> > > > to be disabled by default. If we add some opt-in features here,
> > > > we cannot enable them by default for API compatibility and do the
> > > > right thing by default.
> > > >
> > > > Choosing DEV_RX_OFFLOAD_* bits or rte_eth_dev_opt* functions is a detail.
> > > > The real decision is to change the API for using all these features.
> > > > Can we keep all features available by default (opt-out)?
> > >
> > > IMO, *rte_eth_dev_opt* has following problems
> > >
> > > 1) It is not multi-process friendly. If we are changing the Rx/Tx
> > > function pointer, based on
> > > the selected offload, then, using *rte_eth_dev_opt* scheme won't
> > > really work(if the new API
> > > called after the secondary process launch)
> >
> > Yes it must be used before launching the secondary process.
> > It is the same as DEV_RX_OFFLOAD_* config.
> 
> Yes. rte_eth_dev_opt_* has another dimension to enable and disable as API.
> So, we need to document, opt-in -> start() -> opt-out case won't work
> in multi process
> case.
> 
> >
> > > 2) If we are taking rte_eth_dev_opt path then by default feature has
> > > to be enabled to
> > > not break the functional ABI. That scheme won't scale if as when we
> > > keep adding the new features.
> > > It is always easy for the application to define "what it wants" vs
> > > "what it does not want"
> >
> > Yes, opt-in may look more natural than opt-out.
> > But opt-in makes the default more complex, and changes the API.
> >
> > > 3) Defining the device state after the reconfigure operation.
> > >
> > > IMO, if any operation is connected to fastpath it is better to use
> > > DEV_RX_OFFLOAD_ like
> > > this feature where enable or disable PMDs from updating
> > > ``rte_mbuf::hash::fdir`` so that if possible
> > > we can use different Rx function pointer if possible(Hence it can work
> > > with the multi-process case case)
> >
> > I reply to 2 and 3 together.
> >
> > We decided that offloads must be disabled by default.
> > This is what we have in 19.11:
> >         - Some offloads are enabled before start with DEV_?X_OFFLOAD_*
> >         - Some offloads are enabled with functions at any time
> >
> > For the second type of offloads, you want to know, before start,
> > whether it will be used or not.
> > If adding the second type of offloads (like rte_flow ones)
> > to DEV_?X_OFFLOAD_*, it means it must be enabled 2 times:
> >         - before start with offload bits
> >         - later with more precise functions
> >
> > I would like to avoid changing the default behaviour,
> > which is to enable an offload only one time.
> > That's why I think this second category of offloads should
> > offer opt-out (global disabling), so it will continue
> > to work by default if they are configured.
> >
> > I hope you understand the difference between the two categories.
> 
> I understand the difference. The only point of "difference in opinion" is
> the default behavior of the feature/offload. If it is in RX_OFFLOAD scheme then
> by default it is disabled. opt_* scheme makes this new feature/offload
> enabled default to avoid changing the default behavior.

OK, this is where we disagree.
I am for keeping what we agreed this year: all offloads are disabled by default.
But I am against the need for double enablement.
The offloads which are enabled with a specific function should not need
to be also enabled (opt-in) before start.

> It is good to avoid functional ABI change. But bad as,
> 1) New API starts bloating the ethdev API.

In general, I want to clean-up the ethdev API during next year.

> 2) It is diffcult for application guys to figure out what are features need to
> be disabled to performance as he/she does not know, for the given release,
> the enabled features.

Yes this is a good point.

> Item (1) is a trade-off between elegance vs ABI compatibility. No
> strong opinion on this.
> 
> To fix the item (2), Can we get have an API in ethdev to get enabled
> features so that
> the application can probe and disable if required?

We can think about something like that.
Note that there is also a need to better advertise all capabilities.

> For example, rte_eth_dev_set_ptypes() comes in same category, By default,
> ptype parsing is enabled. I think, we can have a general interface to
> "probe" the by default enabled features
> and disable it if required. Not scattered API for each feature.

This is an issue. The packet type parsing should be disabled by default.

> The above scheme fixe my concerns.
> 
> Thoughts?




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] doc: add abi policy changes to release notes
  2019-11-18 13:15 22% [dpdk-dev] [PATCH] doc: add abi policy changes to release notes Ray Kinsella
@ 2019-11-25 10:55  4% ` Mcnamara, John
  2019-11-26 22:50  4%   ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Mcnamara, John @ 2019-11-25 10:55 UTC (permalink / raw)
  To: Ray Kinsella, dev; +Cc: marko.kovacevic



> -----Original Message-----
> From: Ray Kinsella <mdr@ashroe.eu>
> Sent: Monday, November 18, 2019 1:15 PM
> To: dev@dpdk.org
> Cc: Mcnamara, John <john.mcnamara@intel.com>; marko.kovacevic@intel.co;
> Ray Kinsella <mdr@ashroe.eu>
> Subject: [PATCH] doc: add abi policy changes to release notes
> 
> Add some pointers to the releases notes on the changes to the abi policy,
> the introduction of project-level ABI management and the deprecation of
> library-level management.
> 
> Signed-off-by: Ray Kinsella <mdr@ashroe.eu>


Acked-by: John McNamara <john.mcnamara@intel.com>


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2 3/3] ethdev: improve flow mark Rx offload deprecation notice
  2019-11-23 18:12  0%         ` Thomas Monjalon
@ 2019-11-25 10:44  4%           ` Jerin Jacob
  2019-11-25 11:39  0%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2019-11-25 10:44 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Andrew Rybchenko, Ferruh Yigit, Pavan Nikhilesh, Neil Horman,
	John McNamara, Marko Kovacevic, dpdk-dev, Ori Kam,
	David Marchand, Olivier Matz, Ananyev, Konstantin

On Sun, Nov 24, 2019 at 3:12 AM Thomas Monjalon <thomas@monjalon.net> wrote:
>
> 23/11/2019 10:42, Jerin Jacob:
> > On Sat, Nov 23, 2019 at 3:58 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> > > 22/11/2019 12:53, Andrew Rybchenko:
> > > > On 11/22/19 2:15 PM, Thomas Monjalon wrote:
> > > > > 22/11/2019 11:12, Andrew Rybchenko:
> > > > >> On 11/22/19 1:01 AM, Thomas Monjalon wrote:
> > > > >>> 19/11/2019 13:12, Andrew Rybchenko:
> > > > >>>> The deprecation notice is required since it adds more requirements
> > > > >>>> when RTE flow mark and flag actions may be used and require
> > > > >>>> changes in applications.
> > > > >>> I am still not sure what is the best solution here.
> > > > >>> I continued to think about it in this thread:
> > > > >>>   http://mails.dpdk.org/archives/dev/2019-November/151960.html
> > > > >>>
> > > > >>> I think we cannot require any application change until 20.11
> > > > >>> in order to keep API (and behaviour) compatibility.
> > > > >> Expected, but still very disappointing.
> > > > >>
> > > > >> The feature is implemented by Pavan (@ Marvell), supported by me,
> > > > >> used by Qi (@ Intel), looks better than alternatives from application
> > > > >> developer point of view [1] and finally postponed for 1 year without really
> > > > >> strong motivation.
> > > > >
> > > > > I see different valuable point of views. This is enough motivation.
> > > >
> > > > It looks like I miss it in previous discussion, I would be thankful if
> > > > you give me links to read or hints how to find.
> > >
> > > http://mails.dpdk.org/archives/dev/2019-November/150793.html
> > >
> > > > Introducing new types of controls would make configuration more and
> > > > more complex. I think that many different types of control would
> > > > over-complicate it. May be it is unavoidable, but it should be clear
> > > > why the problem cannot be solved using existing types of controls
> > > > (e.g. offloads).
> > >
> > > The offload control is used as an effective configuration for now.
> > > The features which are configured with DEV_RX_OFFLOAD_*
> > > do not need any other API to be used.
> > > Extending DEV_RX_OFFLOAD_* bits for enabling features which
> > > must be configured via other API anyway, is possible.
> > > The real problem is that features in DEV_RX_OFFLOAD_* are supposed
> > > to be disabled by default. If we add some opt-in features here,
> > > we cannot enable them by default for API compatibility and do the
> > > right thing by default.
> > >
> > > Choosing DEV_RX_OFFLOAD_* bits or rte_eth_dev_opt* functions is a detail.
> > > The real decision is to change the API for using all these features.
> > > Can we keep all features available by default (opt-out)?
> >
> > IMO, *rte_eth_dev_opt* has following problems
> >
> > 1) It is not multi-process friendly. If we are changing the Rx/Tx
> > function pointer, based on
> > the selected offload, then, using *rte_eth_dev_opt* scheme won't
> > really work(if the new API
> > called after the secondary process launch)
>
> Yes it must be used before launching the secondary process.
> It is the same as DEV_RX_OFFLOAD_* config.

Yes. rte_eth_dev_opt_* has another dimension to enable and disable as API.
So, we need to document, opt-in -> start() -> opt-out case won't work
in multi process
case.

>
> > 2) If we are taking rte_eth_dev_opt path then by default feature has
> > to be enabled to
> > not break the functional ABI. That scheme won't scale if as when we
> > keep adding the new features.
> > It is always easy for the application to define "what it wants" vs
> > "what it does not want"
>
> Yes, opt-in may look more natural than opt-out.
> But opt-in makes the default more complex, and changes the API.
>
> > 3) Defining the device state after the reconfigure operation.
> >
> > IMO, if any operation is connected to fastpath it is better to use
> > DEV_RX_OFFLOAD_ like
> > this feature where enable or disable PMDs from updating
> > ``rte_mbuf::hash::fdir`` so that if possible
> > we can use different Rx function pointer if possible(Hence it can work
> > with the multi-process case case)
>
> I reply to 2 and 3 together.
>
> We decided that offloads must be disabled by default.
> This is what we have in 19.11:
>         - Some offloads are enabled before start with DEV_?X_OFFLOAD_*
>         - Some offloads are enabled with functions at any time
>
> For the second type of offloads, you want to know, before start,
> whether it will be used or not.
> If adding the second type of offloads (like rte_flow ones)
> to DEV_?X_OFFLOAD_*, it means it must be enabled 2 times:
>         - before start with offload bits
>         - later with more precise functions
>
> I would like to avoid changing the default behaviour,
> which is to enable an offload only one time.
> That's why I think this second category of offloads should
> offer opt-out (global disabling), so it will continue
> to work by default if they are configured.
>
> I hope you understand the difference between the two categories.

I understand the difference. The only point of "difference in opinion" is
the default behavior of the feature/offload. If it is in RX_OFFLOAD scheme then
by default it is disabled. opt_* scheme makes this new feature/offload
enabled default to avoid changing the default behavior.

It is good to avoid functional ABI change. But bad as,
1) New API starts bloating the ethdev API.
2) It is diffcult for application guys to figure out what are features need to
be disabled to performance as he/she does not know, for the given release,
the enabled features.

Item (1) is a trade-off between elegance vs ABI compatibility. No
strong opinion on this.

To fix the item (2), Can we get have an API in ethdev to get enabled
features so that
the application can probe and disable if required?

For example, rte_eth_dev_set_ptypes() comes in same category, By default,
ptype parsing is enabled. I think, we can have a general interface to
"probe" the by default enabled features
and disable it if required. Not scattered API for each feature.
The above scheme fixe my concerns.

Thoughts?

> For now, it looks I failed to explain it clearly enough.

No, the explanation is very clear.


>
>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4] mbuf: extend pktmbuf pool private structure
  2019-11-25 10:21  3%     ` [dpdk-dev] [PATCH v4] " Shahaf Shuler
@ 2019-11-25 10:27  0%       ` Olivier Matz
  2019-11-25 21:42  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Olivier Matz @ 2019-11-25 10:27 UTC (permalink / raw)
  To: Shahaf Shuler; +Cc: dev, Thomas Monjalon

On Mon, Nov 25, 2019 at 10:21:32AM +0000, Shahaf Shuler wrote:
> With the API and ABI freeze ahead, it will be good to reserve
> some bits on the private structure for future use.
> 
> Otherwise we will potentially need to maintain two different
> private structure during 2020 period.
> 
> There is already one use case for those reserved bits[1]
> 
> The reserved field should be set to 0 by the user.
> 
> [1]
> https://patches.dpdk.org/patch/63077/
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>

Acked-by: Olivier Matz <olivier.matz@6wind.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4] mbuf: extend pktmbuf pool private structure
  2019-11-24  5:53  3%   ` [dpdk-dev] [PATCH v3] " Shahaf Shuler
  2019-11-25  8:12  0%     ` Olivier Matz
@ 2019-11-25 10:21  3%     ` Shahaf Shuler
  2019-11-25 10:27  0%       ` Olivier Matz
  1 sibling, 1 reply; 200+ results
From: Shahaf Shuler @ 2019-11-25 10:21 UTC (permalink / raw)
  To: dev, Thomas Monjalon, olivier.matz

With the API and ABI freeze ahead, it will be good to reserve
some bits on the private structure for future use.

Otherwise we will potentially need to maintain two different
private structure during 2020 period.

There is already one use case for those reserved bits[1]

The reserved field should be set to 0 by the user.

[1]
https://patches.dpdk.org/patch/63077/

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
On v4:
 - added note to release notes

On v3:
 - use memset to zero the entire private struct
 - validate flags is set to 0 also on ntb example

On v2:
 - rename new field to flags
 - add extra validation in code that flags = 0
---
 doc/guides/rel_notes/release_19_11.rst | 7 +++++++
 examples/ntb/ntb_fwd.c                 | 1 +
 lib/librte_mbuf/rte_mbuf.c             | 4 +++-
 lib/librte_mbuf/rte_mbuf.h             | 1 +
 4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index c0045a91ff..b8c4d35b4d 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -65,6 +65,13 @@ New Features
 
   The lock-free stack implementation is enabled for aarch64 platforms.
 
+* **Extended pktmbuf mempool private structure.**
+
+  rte_pktmbuf_pool_private structure was extended to include flags field
+  for future compatibility.
+  As per 19.11 release this field is reserved and should be set to 0
+  by the user.
+
 * **Changed mempool allocation behaviour.**
 
   Objects are no longer across pages by default.
diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c
index edce77ecdc..c914256dd4 100644
--- a/examples/ntb/ntb_fwd.c
+++ b/examples/ntb/ntb_fwd.c
@@ -1256,6 +1256,7 @@ ntb_mbuf_pool_create(uint16_t mbuf_seg_size, uint32_t nb_mbuf,
 	if (mp == NULL)
 		return NULL;
 
+	memset(&mbp_priv, 0, sizeof(mbp_priv));
 	mbp_priv.mbuf_data_room_size = mbuf_seg_size;
 	mbp_priv.mbuf_priv_size = 0;
 	rte_pktmbuf_pool_init(mp, &mbp_priv);
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 35df1c4c38..8fa7f49645 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -49,7 +49,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
 	/* if no structure is provided, assume no mbuf private area */
 	user_mbp_priv = opaque_arg;
 	if (user_mbp_priv == NULL) {
-		default_mbp_priv.mbuf_priv_size = 0;
+		memset(&default_mbp_priv, 0, sizeof(default_mbp_priv));
 		if (mp->elt_size > sizeof(struct rte_mbuf))
 			roomsz = mp->elt_size - sizeof(struct rte_mbuf);
 		else
@@ -61,6 +61,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
 	RTE_ASSERT(mp->elt_size >= sizeof(struct rte_mbuf) +
 		user_mbp_priv->mbuf_data_room_size +
 		user_mbp_priv->mbuf_priv_size);
+	RTE_ASSERT(user_mbp_priv->flags == 0);
 
 	mbp_priv = rte_mempool_get_priv(mp);
 	memcpy(mbp_priv, user_mbp_priv, sizeof(*mbp_priv));
@@ -126,6 +127,7 @@ rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
 	}
 	elt_size = sizeof(struct rte_mbuf) + (unsigned)priv_size +
 		(unsigned)data_room_size;
+	memset(&mbp_priv, 0, sizeof(mbp_priv));
 	mbp_priv.mbuf_data_room_size = data_room_size;
 	mbp_priv.mbuf_priv_size = priv_size;
 
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 92d81972ab..219b110b76 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -303,6 +303,7 @@ rte_mbuf_to_priv(struct rte_mbuf *m)
 struct rte_pktmbuf_pool_private {
 	uint16_t mbuf_data_room_size; /**< Size of data space in each mbuf. */
 	uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf. */
+	uint32_t flags; /**< reserved for future use. */
 };
 
 #ifdef RTE_LIBRTE_MBUF_DEBUG
-- 
2.12.0


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] build: fix windows build failure for 19.11
  2019-11-23  2:59  3% [dpdk-dev] [PATCH] build: fix windows build failure for 19.11 Pallavi Kadam
@ 2019-11-25  9:59  0% ` Bruce Richardson
  2019-11-25 13:05  0% ` Burakov, Anatoly
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2019-11-25  9:59 UTC (permalink / raw)
  To: Pallavi Kadam; +Cc: dev, thomas, ranjit.menon

On Fri, Nov 22, 2019 at 06:59:59PM -0800, Pallavi Kadam wrote:
> This patch fixes Windows build failure caused due to
> 'config: change ABI versioning to global' patch.

Underlying reason is:
"While most windows apps can handle both "\" and "/" as path separators,
"more" is treating the "/" as the start of a command-line flag in this
case, causing errors.

> This patch can be merged in 19.11 release.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
> Tested-by: Pallavi Kadam <pallavi.kadam@intel.com>
> ---



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3] mbuf: extend pktmbuf pool private structure
  2019-11-24  5:53  3%   ` [dpdk-dev] [PATCH v3] " Shahaf Shuler
@ 2019-11-25  8:12  0%     ` Olivier Matz
  2019-11-25 10:21  3%     ` [dpdk-dev] [PATCH v4] " Shahaf Shuler
  1 sibling, 0 replies; 200+ results
From: Olivier Matz @ 2019-11-25  8:12 UTC (permalink / raw)
  To: Shahaf Shuler; +Cc: dev, Thomas Monjalon

On Sun, Nov 24, 2019 at 05:53:46AM +0000, Shahaf Shuler wrote:
> With the API and ABI freeze ahead, it will be good to reserve
> some bits on the private structure for future use.
> 
> Otherwise we will potentially need to maintain two different
> private structure during 2020 period.
> 
> There is already one use case for those reserved bits[1]
> 
> The reserved field should be set to 0 by the user.
> 
> [1]
> https://patches.dpdk.org/patch/63077/
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>

An entry in the release note explaining the structure extension may help
the users to anticipate, so they are notified before triggering the
assert.

Then,
Acked-by: Olivier Matz <olivier.matz@6wind.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3] mbuf: extend pktmbuf pool private structure
  2019-11-21 12:28  3% ` [dpdk-dev] [PATCH v2] " Shahaf Shuler
  2019-11-21 14:31  0%   ` Olivier Matz
@ 2019-11-24  5:53  3%   ` Shahaf Shuler
  2019-11-25  8:12  0%     ` Olivier Matz
  2019-11-25 10:21  3%     ` [dpdk-dev] [PATCH v4] " Shahaf Shuler
  1 sibling, 2 replies; 200+ results
From: Shahaf Shuler @ 2019-11-24  5:53 UTC (permalink / raw)
  To: dev, Thomas Monjalon, olivier.matz

With the API and ABI freeze ahead, it will be good to reserve
some bits on the private structure for future use.

Otherwise we will potentially need to maintain two different
private structure during 2020 period.

There is already one use case for those reserved bits[1]

The reserved field should be set to 0 by the user.

[1]
https://patches.dpdk.org/patch/63077/

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
On v3:
 - use memset to zero the entire private struct
 - validate flags is set to 0 also on ntb example

On v2:
 - rename new field to flags
 - add extra validation in code that flags = 0
---
 examples/ntb/ntb_fwd.c     | 1 +
 lib/librte_mbuf/rte_mbuf.c | 4 +++-
 lib/librte_mbuf/rte_mbuf.h | 1 +
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c
index edce77ecdc..c914256dd4 100644
--- a/examples/ntb/ntb_fwd.c
+++ b/examples/ntb/ntb_fwd.c
@@ -1256,6 +1256,7 @@ ntb_mbuf_pool_create(uint16_t mbuf_seg_size, uint32_t nb_mbuf,
 	if (mp == NULL)
 		return NULL;
 
+	memset(&mbp_priv, 0, sizeof(mbp_priv));
 	mbp_priv.mbuf_data_room_size = mbuf_seg_size;
 	mbp_priv.mbuf_priv_size = 0;
 	rte_pktmbuf_pool_init(mp, &mbp_priv);
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 35df1c4c38..8fa7f49645 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -49,7 +49,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
 	/* if no structure is provided, assume no mbuf private area */
 	user_mbp_priv = opaque_arg;
 	if (user_mbp_priv == NULL) {
-		default_mbp_priv.mbuf_priv_size = 0;
+		memset(&default_mbp_priv, 0, sizeof(default_mbp_priv));
 		if (mp->elt_size > sizeof(struct rte_mbuf))
 			roomsz = mp->elt_size - sizeof(struct rte_mbuf);
 		else
@@ -61,6 +61,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
 	RTE_ASSERT(mp->elt_size >= sizeof(struct rte_mbuf) +
 		user_mbp_priv->mbuf_data_room_size +
 		user_mbp_priv->mbuf_priv_size);
+	RTE_ASSERT(user_mbp_priv->flags == 0);
 
 	mbp_priv = rte_mempool_get_priv(mp);
 	memcpy(mbp_priv, user_mbp_priv, sizeof(*mbp_priv));
@@ -126,6 +127,7 @@ rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
 	}
 	elt_size = sizeof(struct rte_mbuf) + (unsigned)priv_size +
 		(unsigned)data_room_size;
+	memset(&mbp_priv, 0, sizeof(mbp_priv));
 	mbp_priv.mbuf_data_room_size = data_room_size;
 	mbp_priv.mbuf_priv_size = priv_size;
 
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 92d81972ab..219b110b76 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -303,6 +303,7 @@ rte_mbuf_to_priv(struct rte_mbuf *m)
 struct rte_pktmbuf_pool_private {
 	uint16_t mbuf_data_room_size; /**< Size of data space in each mbuf. */
 	uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf. */
+	uint32_t flags; /**< reserved for future use. */
 };
 
 #ifdef RTE_LIBRTE_MBUF_DEBUG
-- 
2.12.0


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2 3/3] ethdev: improve flow mark Rx offload deprecation notice
  2019-11-23  9:42  3%       ` Jerin Jacob
@ 2019-11-23 18:12  0%         ` Thomas Monjalon
  2019-11-25 10:44  4%           ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-23 18:12 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: Andrew Rybchenko, Ferruh Yigit, Pavan Nikhilesh, Neil Horman,
	John McNamara, Marko Kovacevic, dpdk-dev, Ori Kam,
	David Marchand, Olivier Matz, Ananyev, Konstantin

23/11/2019 10:42, Jerin Jacob:
> On Sat, Nov 23, 2019 at 3:58 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> > 22/11/2019 12:53, Andrew Rybchenko:
> > > On 11/22/19 2:15 PM, Thomas Monjalon wrote:
> > > > 22/11/2019 11:12, Andrew Rybchenko:
> > > >> On 11/22/19 1:01 AM, Thomas Monjalon wrote:
> > > >>> 19/11/2019 13:12, Andrew Rybchenko:
> > > >>>> The deprecation notice is required since it adds more requirements
> > > >>>> when RTE flow mark and flag actions may be used and require
> > > >>>> changes in applications.
> > > >>> I am still not sure what is the best solution here.
> > > >>> I continued to think about it in this thread:
> > > >>>   http://mails.dpdk.org/archives/dev/2019-November/151960.html
> > > >>>
> > > >>> I think we cannot require any application change until 20.11
> > > >>> in order to keep API (and behaviour) compatibility.
> > > >> Expected, but still very disappointing.
> > > >>
> > > >> The feature is implemented by Pavan (@ Marvell), supported by me,
> > > >> used by Qi (@ Intel), looks better than alternatives from application
> > > >> developer point of view [1] and finally postponed for 1 year without really
> > > >> strong motivation.
> > > >
> > > > I see different valuable point of views. This is enough motivation.
> > >
> > > It looks like I miss it in previous discussion, I would be thankful if
> > > you give me links to read or hints how to find.
> >
> > http://mails.dpdk.org/archives/dev/2019-November/150793.html
> >
> > > Introducing new types of controls would make configuration more and
> > > more complex. I think that many different types of control would
> > > over-complicate it. May be it is unavoidable, but it should be clear
> > > why the problem cannot be solved using existing types of controls
> > > (e.g. offloads).
> >
> > The offload control is used as an effective configuration for now.
> > The features which are configured with DEV_RX_OFFLOAD_*
> > do not need any other API to be used.
> > Extending DEV_RX_OFFLOAD_* bits for enabling features which
> > must be configured via other API anyway, is possible.
> > The real problem is that features in DEV_RX_OFFLOAD_* are supposed
> > to be disabled by default. If we add some opt-in features here,
> > we cannot enable them by default for API compatibility and do the
> > right thing by default.
> >
> > Choosing DEV_RX_OFFLOAD_* bits or rte_eth_dev_opt* functions is a detail.
> > The real decision is to change the API for using all these features.
> > Can we keep all features available by default (opt-out)?
> 
> IMO, *rte_eth_dev_opt* has following problems
> 
> 1) It is not multi-process friendly. If we are changing the Rx/Tx
> function pointer, based on
> the selected offload, then, using *rte_eth_dev_opt* scheme won't
> really work(if the new API
> called after the secondary process launch)

Yes it must be used before launching the secondary process.
It is the same as DEV_RX_OFFLOAD_* config.

> 2) If we are taking rte_eth_dev_opt path then by default feature has
> to be enabled to
> not break the functional ABI. That scheme won't scale if as when we
> keep adding the new features.
> It is always easy for the application to define "what it wants" vs
> "what it does not want"

Yes, opt-in may look more natural than opt-out.
But opt-in makes the default more complex, and changes the API.

> 3) Defining the device state after the reconfigure operation.
> 
> IMO, if any operation is connected to fastpath it is better to use
> DEV_RX_OFFLOAD_ like
> this feature where enable or disable PMDs from updating
> ``rte_mbuf::hash::fdir`` so that if possible
> we can use different Rx function pointer if possible(Hence it can work
> with the multi-process case case)

I reply to 2 and 3 together.

We decided that offloads must be disabled by default.
This is what we have in 19.11:
	- Some offloads are enabled before start with DEV_?X_OFFLOAD_*
	- Some offloads are enabled with functions at any time

For the second type of offloads, you want to know, before start,
whether it will be used or not.
If adding the second type of offloads (like rte_flow ones)
to DEV_?X_OFFLOAD_*, it means it must be enabled 2 times:
	- before start with offload bits
	- later with more precise functions

I would like to avoid changing the default behaviour,
which is to enable an offload only one time.
That's why I think this second category of offloads should
offer opt-out (global disabling), so it will continue
to work by default if they are configured.

I hope you understand the difference between the two categories.
For now, it looks I failed to explain it clearly enough.



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 3/3] ethdev: improve flow mark Rx offload deprecation notice
  @ 2019-11-23  9:42  3%       ` Jerin Jacob
  2019-11-23 18:12  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2019-11-23  9:42 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Andrew Rybchenko, Ferruh Yigit, Pavan Nikhilesh, Neil Horman,
	John McNamara, Marko Kovacevic, dpdk-dev, Ori Kam,
	David Marchand, Olivier Matz, Ananyev, Konstantin

On Sat, Nov 23, 2019 at 3:58 AM Thomas Monjalon <thomas@monjalon.net> wrote:
>
> 22/11/2019 12:53, Andrew Rybchenko:
> > On 11/22/19 2:15 PM, Thomas Monjalon wrote:
> > > 22/11/2019 11:12, Andrew Rybchenko:
> > >> On 11/22/19 1:01 AM, Thomas Monjalon wrote:
> > >>> 19/11/2019 13:12, Andrew Rybchenko:
> > >>>> The deprecation notice is required since it adds more requirements
> > >>>> when RTE flow mark and flag actions may be used and require
> > >>>> changes in applications.
> > >>> I am still not sure what is the best solution here.
> > >>> I continued to think about it in this thread:
> > >>>   http://mails.dpdk.org/archives/dev/2019-November/151960.html
> > >>>
> > >>> I think we cannot require any application change until 20.11
> > >>> in order to keep API (and behaviour) compatibility.
> > >> Expected, but still very disappointing.
> > >>
> > >> The feature is implemented by Pavan (@ Marvell), supported by me,
> > >> used by Qi (@ Intel), looks better than alternatives from application
> > >> developer point of view [1] and finally postponed for 1 year without really
> > >> strong motivation.
> > >
> > > I see different valuable point of views. This is enough motivation.
> >
> > It looks like I miss it in previous discussion, I would be thankful if
> > you give me links to read or hints how to find.
>
> http://mails.dpdk.org/archives/dev/2019-November/150793.html
>
> > Introducing new types of controls would make configuration more and
> > more complex. I think that many different types of control would
> > over-complicate it. May be it is unavoidable, but it should be clear
> > why the problem cannot be solved using existing types of controls
> > (e.g. offloads).
>
> The offload control is used as an effective configuration for now.
> The features which are configured with DEV_RX_OFFLOAD_*
> do not need any other API to be used.
> Extending DEV_RX_OFFLOAD_* bits for enabling features which
> must be configured via other API anyway, is possible.
> The real problem is that features in DEV_RX_OFFLOAD_* are supposed
> to be disabled by default. If we add some opt-in features here,
> we cannot enable them by default for API compatibility and do the
> right thing by default.
>
> Choosing DEV_RX_OFFLOAD_* bits or rte_eth_dev_opt* functions is a detail.
> The real decision is to change the API for using all these features.
> Can we keep all features available by default (opt-out)?

IMO, *rte_eth_dev_opt* has following problems

1) It is not multi-process friendly. If we are changing the Rx/Tx
function pointer, based on
the selected offload, then, using *rte_eth_dev_opt* scheme won't
really work(if the new API
called after the secondary process launch)

2) If we are taking rte_eth_dev_opt path then by default feature has
to be enabled to
not break the functional ABI. That scheme won't scale if as when we
keep adding the new features.
It is always easy for the application to define "what it wants" vs
"what it does not want"

3) Defining the device state after the reconfigure operation.

IMO, if any operation is connected to fastpath it is better to use
DEV_RX_OFFLOAD_ like
this feature where enable or disable PMDs from updating
``rte_mbuf::hash::fdir`` so that if possible
we can use different Rx function pointer if possible(Hence it can work
with the multi-process case case)

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] build: fix windows build failure for 19.11
@ 2019-11-23  2:59  3% Pallavi Kadam
  2019-11-25  9:59  0% ` Bruce Richardson
  2019-11-25 13:05  0% ` Burakov, Anatoly
  0 siblings, 2 replies; 200+ results
From: Pallavi Kadam @ 2019-11-23  2:59 UTC (permalink / raw)
  To: dev, thomas; +Cc: bruce.richardson, ranjit.menon, pallavi.kadam

This patch fixes Windows build failure caused due to
'config: change ABI versioning to global' patch.
This patch can be merged in 19.11 release.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
Tested-by: Pallavi Kadam <pallavi.kadam@intel.com>
---
 config/meson.build | 2 +-
 meson.build        | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/config/meson.build b/config/meson.build
index 3ffb73ab9..364a8d739 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -19,7 +19,7 @@ endforeach
 pver = meson.project_version().split('.')
 major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
 abi_version = run_command(find_program('cat', 'more'),
-	files('../ABI_VERSION')).stdout().strip()
+	abi_version_file).stdout().strip()
 # experimental libraries are versioned as 0.majorminor versions, e.g. 0.201
 ever = abi_version.split('.')
 experimental_abi_version = '0.@0@@1@'.format(ever.get(0), ever.get(1))
diff --git a/meson.build b/meson.build
index c5a3dda26..b7ae9c8d9 100644
--- a/meson.build
+++ b/meson.build
@@ -22,6 +22,7 @@ dpdk_extra_ldflags = []
 dpdk_app_link_libraries = []
 dpdk_libs_disabled = []
 dpdk_drvs_disabled = []
+abi_version_file = files('ABI_VERSION')
 
 # configure the build, and make sure configs here and in config folder are
 # able to be included in any file. We also store a global array of include dirs
-- 
2.18.0.windows.1


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 1/8] doc: update Linux GSG system requirements section
  @ 2019-11-22 16:03  4% ` Bruce Richardson
  2019-11-28 11:51  0%   ` Thomas Monjalon
    1 sibling, 1 reply; 200+ results
From: Bruce Richardson @ 2019-11-22 16:03 UTC (permalink / raw)
  To: john.mcnamara; +Cc: dev, Bruce Richardson

Update the system requirements section of the doc to cover builds with
meson and ninja. This involves updating the package dependencies to include
meson, ninja and python 3.5, and also updating the optional dependencies
section to explain that the components are enabled/disabled automatically
by meson.

As part of this update, the relevant sections were simplified to keep the
document shorter. For mandatory requirements, we can refer to the various
distro's development tools package groups rather than requiring gcc, core
tools etc. individually. The optional package list was very incomplete, and
if complete would duplicate information in the individual driver's guides.
Therefore we can simplify it by listing only the library optional
requirements and referring users to the driver docs to find details on
their dependencies.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/linux_gsg/sys_reqs.rst | 64 +++++++++++++++----------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index d2359058b..c0b696069 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -37,32 +37,22 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   GNU ``make``.
+*   General development tools including ``make``, and a supported C compiler such as ``gcc`` or ``clang``.
 
-*   coreutils: ``cmp``, ``sed``, ``grep``, ``arch``, etc.
+    * For Red Hat/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
 
-*   gcc: versions 4.9 or later is recommended for all platforms.
-    On some distributions, some specific compiler flags and linker flags are enabled by
-    default and affect performance (``-fstack-protector``, for example). Please refer to the documentation
-    of your distribution and to ``gcc -dumpspecs``.
+    * For Ubuntu/Debian systems these can be installed using ``apt install build-essential``
 
-*   libc headers, often packaged as ``gcc-multilib`` (``glibc-devel.i686`` / ``libc6-dev-i386``;
-    ``glibc-devel.x86_64`` / ``libc6-dev`` for 64-bit compilation on Intel architecture;
-    ``glibc-devel.ppc64`` for 64 bit IBM Power architecture;)
+*   Python, recommended version 3.5+.
 
-*   Linux kernel headers or sources required to build kernel modules. (kernel - devel.x86_64;
-    kernel - devel.ppc64)
+    * Python v3.5+ is needed to build DPDK using meson and ninja
 
-*   Additional packages required for 32-bit compilation on 64-bit systems are:
+    * Python 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
 
-    * glibc.i686, libgcc.i686, libstdc++.i686 and glibc-devel.i686 for Intel i686/x86_64;
+*   Meson (v0.47.1+) and ninja
 
-    * glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;
-
-    .. note::
-
-       x86_x32 ABI is currently supported with distribution packages only on Ubuntu
-       higher than 13.10 or recent Debian distribution. The only supported  compiler is gcc 4.9+.
+    * Recommended to use the latest versions from Python's "pip" repository:
+      ``pip3 install meson ninja``
 
 *   Library for handling NUMA (Non Uniform Memory Access).
 
@@ -70,16 +60,7 @@ Compilation of the DPDK
 
     * libnuma-dev in Debian/Ubuntu;
 
-    .. note::
-
-        On systems with NUMA support, `libnuma-dev` (aka `numactl-devel`)
-        is a recommended dependency when `--legacy-mem` switch is used,
-        and a *required* dependency if default memory mode is used.
-        While DPDK will compile and run without `libnuma`
-        even on NUMA-enabled systems,
-        both usability and performance will be degraded.
-
-*   Python, version 2.7+ or 3.2+, to use various helper scripts included in the DPDK package.
+*   Linux kernel headers or sources required to build kernel modules.
 
 .. note::
 
@@ -96,10 +77,29 @@ Compilation of the DPDK
     which allows users to take leading edge advantage of IBM's latest POWER hardware features on Linux. To install
     it, see the IBM official installation document.
 
-*   libpcap headers and libraries (libpcap-devel) to compile and use the libpcap-based poll-mode driver.
-    This driver is disabled by default and can be enabled by setting ``CONFIG_RTE_LIBRTE_PMD_PCAP=y`` in the build time config file.
+**Additional Libraries**
+
+A number of DPDK components, such as libraries and poll-mode drivers (PMDs) have additional dependencies.
+For DPDK builds using meson, the presence or absence of these dependencies will be
+automatically detected enabling or disabling the relevant components appropriately.
+
+For builds using make, these components are disabled in the default configuration and
+need to be enabled manually my changing the relevant setting to "y" in the build configuration file
+i.e. the ``.config`` file in the build folder.
+
+In each case, the relevant library development package (``-devel`` or ``-dev``) is needed to build the DPDK components.
+
+For libraries the additional dependencies include:
+
+*   libarchive: for some unit tests using tar to get their resources.
+
+*   jansson: to compile and use the telemetry library.
+
+*   libelf: to compile and use the bpf library.
 
-*   libarchive headers and library are needed for some unit tests using tar to get their resources.
+For poll-mode drivers, the additional dependencies for each driver can be
+found in that driver's documentation in the relevant DPDK guide document,
+e.g. Network Interface Controller Drivers Guide
 
 
 Running DPDK Applications
-- 
2.21.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 00/12] Implement the new ABI policy and add helper scripts
  2019-11-20 20:17  4%         ` Thomas Monjalon
  2019-11-20 22:13  4%           ` David Marchand
@ 2019-11-21 13:24  4%           ` Kinsella, Ray
  1 sibling, 0 replies; 200+ results
From: Kinsella, Ray @ 2019-11-21 13:24 UTC (permalink / raw)
  To: Thomas Monjalon, Burakov, Anatoly
  Cc: dev, Mcnamara, John, Richardson, Bruce, david.marchand



> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Wednesday 20 November 2019 20:18
> To: Burakov, Anatoly <anatoly.burakov@intel.com>
> Cc: dev@dpdk.org; Mcnamara, John <john.mcnamara@intel.com>; Kinsella,
> Ray <ray.kinsella@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>; david.marchand@redhat.com
> Subject: Re: [dpdk-dev] [PATCH v8 00/12] Implement the new ABI policy
> and add helper scripts
> 
> 20/11/2019 18:23, Anatoly Burakov:
> > This patchset prepares the codebase for the new ABI policy and adds a
> > few helper scripts.
> >
> >  379 files changed, 1172 insertions(+), 3409 deletions(-)

[rk] +1
> Thanks for the great work Anatoly
> 
> Acked-by: Thomas Monjalon <thomas@monjalon.net>
> 


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0
  2019-11-19 21:50  7%       ` David Marchand
@ 2019-11-22  7:07  4%         ` Sachin Saxena
  0 siblings, 0 replies; 200+ results
From: Sachin Saxena @ 2019-11-22  7:07 UTC (permalink / raw)
  To: David Marchand, Anatoly Burakov, Thomas Monjalon
  Cc: dev, Hemant Agrawal, Stephen Hemminger, Mcnamara, John, Kinsella,
	Ray, Bruce Richardson

> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Wednesday, November 20, 2019 3:20 AM
> To: Anatoly Burakov <anatoly.burakov@intel.com>; Thomas Monjalon
> <thomas@monjalon.net>
> Cc: dev <dev@dpdk.org>; Hemant Agrawal <hemant.agrawal@nxp.com>;
> Sachin Saxena <sachin.saxena@nxp.com>; Stephen Hemminger
> <sthemmin@microsoft.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Kinsella, Ray <ray.kinsella@intel.com>; Bruce
> Richardson <bruce.richardson@intel.com>
> Subject: Re: [PATCH v7 09/10] build: change ABI version to 20.0
> Importance: High
> 
> Reduced the Cc: list.
> 
> On Fri, Nov 8, 2019 at 5:26 PM Anatoly Burakov
> <anatoly.burakov@intel.com> wrote:
> >
> > From: Pawel Modrak <pawelx.modrak@intel.com>
> >
> > Merge all vesions in linker version script files to DPDK_20.0.
> >
> > This commit was generated by running the following command:
> >
> > :~/DPDK$ buildtools/update-abi.sh 20.0
> >
> 
> I inspected the changes.
> I caught just 3 oddities.
> The first two were reported in the patches on timer and lpm.
> 
> The last one is in the dpaa bus driver:
> 
> > diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map
> > b/drivers/bus/dpaa/rte_bus_dpaa_version.map
> > index cf428a54dc..e6ca4361e0 100644
> > --- a/drivers/bus/dpaa/rte_bus_dpaa_version.map
> > +++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map
> > -DPDK_18.08 {
> > -       global:
> > -
> > -       fman_if_get_sg_enable;
> > -       fman_if_set_sg;
> > -
> > -} DPDK_18.02;
> > -
> > -DPDK_18.11 {
> > -       global:
> > -
> > -       bman_thread_irq;
> > -       fman_if_get_sg_enable;
> > -       fman_if_set_sg;
> > -       qman_clear_irq;
> > -
> > -       qman_irqsource_add;
> > -       qman_irqsource_remove;
> >         qman_thread_fd;
> >         qman_thread_irq;
> > -
> 
> Here, we had fman_if_get_sg_enable and fman_if_set_sg in 18.08 and
> 18.11 sections, but no symbols for 18.08 were in the code.
> I'd say this is fine, as there was no ABI change between 18.08 and
> 18.11 on them.
> 
[Sachin Saxena]  Yes, we are also fine with this.

> 
> The rest of the series looks good to me.
> Thanks Anatoly.
> 
> 
> --
> David Marchand


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] mbuf: extend pktmbuf pool private structure
  2019-11-21 12:28  3% ` [dpdk-dev] [PATCH v2] " Shahaf Shuler
@ 2019-11-21 14:31  0%   ` Olivier Matz
  2019-11-24  5:53  3%   ` [dpdk-dev] [PATCH v3] " Shahaf Shuler
  1 sibling, 0 replies; 200+ results
From: Olivier Matz @ 2019-11-21 14:31 UTC (permalink / raw)
  To: Shahaf Shuler; +Cc: Thomas Monjalon, dev

On Thu, Nov 21, 2019 at 12:28:18PM +0000, Shahaf Shuler wrote:
> With the API and ABI freeze ahead, it will be good to reserve
> some bits on the private structure for future use.
> 
> Otherwise we will potentially need to maintain two different
> private structure during 2020 period.
> 
> There is already one use case for those reserved bits[1]
> 
> The reserved field should be set to 0 by the user.
> 
> [1]
> https://patches.dpdk.org/patch/63077/
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> ---
> On v2:
>  - rename new field to flags
>  - add extra validation in code that flags = 0
> 
> ---
>  lib/librte_mbuf/rte_mbuf.c | 10 +++++++---
>  lib/librte_mbuf/rte_mbuf.h |  1 +
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
> index 35df1c4c38..bd64c55fe6 100644
> --- a/lib/librte_mbuf/rte_mbuf.c
> +++ b/lib/librte_mbuf/rte_mbuf.c
> @@ -50,6 +50,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
>  	user_mbp_priv = opaque_arg;
>  	if (user_mbp_priv == NULL) {
>  		default_mbp_priv.mbuf_priv_size = 0;
> +		default_mbp_priv.flags = 0;
>  		if (mp->elt_size > sizeof(struct rte_mbuf))
>  			roomsz = mp->elt_size - sizeof(struct rte_mbuf);
>  		else
> @@ -61,6 +62,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
>  	RTE_ASSERT(mp->elt_size >= sizeof(struct rte_mbuf) +
>  		user_mbp_priv->mbuf_data_room_size +
>  		user_mbp_priv->mbuf_priv_size);
> +	RTE_ASSERT(user_mbp_priv->flags == 0);
>  
>  	mbp_priv = rte_mempool_get_priv(mp);
>  	memcpy(mbp_priv, user_mbp_priv, sizeof(*mbp_priv));
> @@ -113,7 +115,11 @@ rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
>  	int socket_id, const char *ops_name)
>  {
>  	struct rte_mempool *mp;
> -	struct rte_pktmbuf_pool_private mbp_priv;
> +	struct rte_pktmbuf_pool_private mbp_priv = {
> +		.mbuf_data_room_size = data_room_size,
> +		.mbuf_priv_size = priv_size,
> +		.flags = 0,
> +	};
>  	const char *mp_ops_name = ops_name;
>  	unsigned elt_size;
>  	int ret;
> @@ -126,8 +132,6 @@ rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
>  	}
>  	elt_size = sizeof(struct rte_mbuf) + (unsigned)priv_size +
>  		(unsigned)data_room_size;
> -	mbp_priv.mbuf_data_room_size = data_room_size;
> -	mbp_priv.mbuf_priv_size = priv_size;
>  
>  	mp = rte_mempool_create_empty(name, n, elt_size, cache_size,
>  		 sizeof(struct rte_pktmbuf_pool_private), socket_id, 0);
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index 92d81972ab..219b110b76 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -303,6 +303,7 @@ rte_mbuf_to_priv(struct rte_mbuf *m)
>  struct rte_pktmbuf_pool_private {
>  	uint16_t mbuf_data_room_size; /**< Size of data space in each mbuf. */
>  	uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf. */
> +	uint32_t flags; /**< reserved for future use. */
>  };
>  
>  #ifdef RTE_LIBRTE_MBUF_DEBUG
> -- 
> 2.12.0
> 

Sorry I missed the last version in my previous mail.

I think in examples/ntb/ntb_fwd.c:ntb_mbuf_pool_create() should be
updated too. To me, it looks slightly better to not name "flags"
explicitly (ie. use a memset instead), to avoid doing the same
change again in the future.

Thanks,
Olivier

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 11/12] build: change ABI version to 20.0
  2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 11/12] build: change ABI version to 20.0 Anatoly Burakov
@ 2019-11-20 20:47  3%         ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-20 20:47 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Pawel Modrak, Nicolas Chautru, Hemant Agrawal,
	Sachin Saxena, Rosen Xu, Stephen Hemminger, Anoob Joseph,
	Tomasz Duszynski, Liron Himi, Jerin Jacob, Nithin Dabilpuram,
	Vamsi Attunuru, Lee Daly, Fiona Trahe, Ashish Gupta, Sunila Sahu,
	Declan Doherty, Pablo de Lara, Gagandeep Singh, Ravi Kumar,
	Akhil Goyal, Michael Shamis, Nagadheeraj Rottela,
	Srikanth Jampala, Ankur Dwivedi, Fan Zhang, Jay Zhou,
	Nipun Gupta, Mattias Rönnblom, Pavan Nikhilesh, Liang Ma,
	Peter Mccarthy, Harry van Haaren, Artem V. Andreev,
	Andrew Rybchenko, Olivier Matz, Gage Eads, John W. Linville,
	Xiaolong Ye, Qi Zhang, Shepard Siegel, Ed Czeck, John Miller,
	Igor Russkikh, Pavel Belous, Allain Legacy, Matt Peters,
	Rasesh Mody, Shahed Shaikh, Ajit Khaparde, Somnath Kotur,
	Chas Williams, Rahul Lakkireddy, Wenzhuo Lu, Marcin Wojtas,
	Michal Krawczyk, Guy Tzalik, Evgeny Schemeilin, Igor Chauskin,
	John Daley, Hyong Youb Kim, Gaetan Rivet, Xiao Wang, Ziyang Xuan,
	Xiaoyun Wang, Guoyang Zhou, Wei Hu (Xavier), Min Hu (Connor),
	Yisen Zhuang, Beilei Xing, Jingjing Wu, Qiming Yang,
	Konstantin Ananyev, Ferruh Yigit, Shijith Thotton,
	Srisivasubramanian Srinivasan, Jakub Grajciar, Matan Azrad,
	Shahaf Shuler, Viacheslav Ovsiienko, Zyta Szpak,
	K. Y. Srinivasan, Haiyang Zhang, Rastislav Cernay, Jan Remes,
	Alejandro Lucero, Tetsuya Mukawa, Kiran Kumar K,
	Bruce Richardson, Jasvinder Singh, Cristian Dumitrescu,
	Keith Wiles, Maciej Czekaj, Maxime Coquelin, Tiwei Bie,
	Zhihong Wang, Yong Wang, Tianfei zhang, Xiaoyun Li, Satha Rao,
	Shreyansh Jain, David Hunt, Byron Marohn, Yipeng Wang,
	Thomas Monjalon, Jiayu Hu, Sameh Gobriel, Reshma Pattan,
	Vladimir Medvedkin, Robert Sanford, Erik Gabriel Carrillo,
	Mcnamara, John, Kinsella, Ray

On Wed, Nov 20, 2019 at 6:25 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> From: Pawel Modrak <pawelx.modrak@intel.com>
>
> Merge all vesions in linker version script files to DPDK_20.0.
>
> This commit was generated by running the following command:
>
> :~/DPDK$ buildtools/update-abi.sh 20.0

Updated map files for i40e and ipn3ke, following rebase on next-net merge.


-- 
David Marchand


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2] mbuf: extend pktmbuf pool private structure
  2019-11-18 10:02  3% [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure Shahaf Shuler
  2019-11-18 16:12  0% ` Stephen Hemminger
  @ 2019-11-21 12:28  3% ` Shahaf Shuler
  2019-11-21 14:31  0%   ` Olivier Matz
  2019-11-24  5:53  3%   ` [dpdk-dev] [PATCH v3] " Shahaf Shuler
  2 siblings, 2 replies; 200+ results
From: Shahaf Shuler @ 2019-11-21 12:28 UTC (permalink / raw)
  To: olivier.matz, Thomas Monjalon, dev

With the API and ABI freeze ahead, it will be good to reserve
some bits on the private structure for future use.

Otherwise we will potentially need to maintain two different
private structure during 2020 period.

There is already one use case for those reserved bits[1]

The reserved field should be set to 0 by the user.

[1]
https://patches.dpdk.org/patch/63077/

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
On v2:
 - rename new field to flags
 - add extra validation in code that flags = 0

---
 lib/librte_mbuf/rte_mbuf.c | 10 +++++++---
 lib/librte_mbuf/rte_mbuf.h |  1 +
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 35df1c4c38..bd64c55fe6 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -50,6 +50,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
 	user_mbp_priv = opaque_arg;
 	if (user_mbp_priv == NULL) {
 		default_mbp_priv.mbuf_priv_size = 0;
+		default_mbp_priv.flags = 0;
 		if (mp->elt_size > sizeof(struct rte_mbuf))
 			roomsz = mp->elt_size - sizeof(struct rte_mbuf);
 		else
@@ -61,6 +62,7 @@ rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
 	RTE_ASSERT(mp->elt_size >= sizeof(struct rte_mbuf) +
 		user_mbp_priv->mbuf_data_room_size +
 		user_mbp_priv->mbuf_priv_size);
+	RTE_ASSERT(user_mbp_priv->flags == 0);
 
 	mbp_priv = rte_mempool_get_priv(mp);
 	memcpy(mbp_priv, user_mbp_priv, sizeof(*mbp_priv));
@@ -113,7 +115,11 @@ rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
 	int socket_id, const char *ops_name)
 {
 	struct rte_mempool *mp;
-	struct rte_pktmbuf_pool_private mbp_priv;
+	struct rte_pktmbuf_pool_private mbp_priv = {
+		.mbuf_data_room_size = data_room_size,
+		.mbuf_priv_size = priv_size,
+		.flags = 0,
+	};
 	const char *mp_ops_name = ops_name;
 	unsigned elt_size;
 	int ret;
@@ -126,8 +132,6 @@ rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
 	}
 	elt_size = sizeof(struct rte_mbuf) + (unsigned)priv_size +
 		(unsigned)data_room_size;
-	mbp_priv.mbuf_data_room_size = data_room_size;
-	mbp_priv.mbuf_priv_size = priv_size;
 
 	mp = rte_mempool_create_empty(name, n, elt_size, cache_size,
 		 sizeof(struct rte_pktmbuf_pool_private), socket_id, 0);
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 92d81972ab..219b110b76 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -303,6 +303,7 @@ rte_mbuf_to_priv(struct rte_mbuf *m)
 struct rte_pktmbuf_pool_private {
 	uint16_t mbuf_data_room_size; /**< Size of data space in each mbuf. */
 	uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf. */
+	uint32_t flags; /**< reserved for future use. */
 };
 
 #ifdef RTE_LIBRTE_MBUF_DEBUG
-- 
2.12.0


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] DPDK Release Status Meeting 21/11/2019
@ 2019-11-21 10:28  3% Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2019-11-21 10:28 UTC (permalink / raw)
  To: dpdk-dev; +Cc: Thomas Monjalon

Minutes 21 November 2019
------------------------

Agenda:
* Release Dates
* RC3 Status
* Subtrees
* OvS
* Opens

Participants:
* Arm
* Debian/Microsoft
* Intel
* Marvell
* Mellanox
* NXP
* Red Hat


Release Dates
-------------

* v19.11 dates:
  * RC3	is released on Wednesday 20 November
    * https://mails.dpdk.org/archives/announce/2019-November/000302.html
  * RC4				Tuesday 26 November
  * Release			Wednesday 27 November

* Dates for 20.02 :
  * Proposal/V1:		Friday 6 December 2019
  * Integration/Merge/RC1:	Wednesday 15 January 2020
  * Release:			Friday 14 February 2020


RC3 Status
----------

* Intel validation not reported any critical issue
  Only one Windows build issue and driver issue reported


Subtrees
--------

* main
  * Mostly good
  * Tooling for ABI checks will be reviewed
  * Need to get documentation patches after this point
  * Windows patches in backlog deferred to next release
  * WFE can spend more time to become more generic

* next-net
  * No big backlog, will get fixes after rc3 phase
  * There are ethdev deprecation notices waiting for review

* next-net-crypto
  * What to do with armv8 crypto PMD in this release needs to be clarified.

* next-net-eventdev
  * There will be a set of patches after rc3, Jerin will send pull request

* next-net-virtio
  * No more patch planned for release, except fixes
  * There is one in backlog will be directly merged to next-net

* next-net-intel
  * Already merged some fixes after rc3, more to come
  * Only fixes will be merged after this point

* next-net-mlx
  * Expecting more bug fixes after rc3

* LTS
  * CVE related releases done last week
    * https://mails.dpdk.org/archives/announce/2019-November/000300.html
  * Release announcements
    19.08.2: https://mails.dpdk.org/archives/announce/2019-November/000299.html
    18.11.5: https://mails.dpdk.org/archives/announce/2019-November/000298.html
    16.11.11: https://mails.dpdk.org/archives/announce/2019-November/000297.html
    17.11.9: https://mails.dpdk.org/archives/announce/2019-November/000296.html


OvS
---

* 2.13 integration validating DPDK19.11-rc3
  There are some regressions under investigation
* Discussing to more to 19.11 in next release or not
  Good to get more DPDK19.11 testing from other vendors



DPDK Release Status Meetings
============================

The DPDK Release Status Meeting is intended for DPDK Committers to discuss
the status of the master tree and sub-trees, and for project managers to
track progress or milestone dates.

The meeting occurs on Thursdays at 8:30 UTC. If you wish to attend just
send an email to "John McNamara <john.mcnamara@intel.com>" for the invite.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v8 00/12] Implement the new ABI policy and add helper scripts
  2019-11-20 22:13  4%           ` David Marchand
@ 2019-11-21 10:22  4%             ` Burakov, Anatoly
  0 siblings, 0 replies; 200+ results
From: Burakov, Anatoly @ 2019-11-21 10:22 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Mcnamara, John, Kinsella, Ray, Bruce Richardson, Thomas Monjalon

On 20-Nov-19 10:13 PM, David Marchand wrote:
> On Wed, Nov 20, 2019 at 9:17 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>>
>> 20/11/2019 18:23, Anatoly Burakov:
>>> This patchset prepares the codebase for the new ABI policy and
>>> adds a few helper scripts.
>>>
>>>   379 files changed, 1172 insertions(+), 3409 deletions(-)
>>
>> Thanks for the great work Anatoly
>>
>> Acked-by: Thomas Monjalon <thomas@monjalon.net>
> 
> Added some entropy for external libraries using make, rebased on a
> (non-|) compiling master, fixed some typos (that codespell found) and
> added the new scripts in MAINTAINERS.
> And with this, we are done :-).
> 
> Applied, thanks.
> 

Thanks everyone for their help in getting this over the line!

-- 
Thanks,
Anatoly

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [dpdk-announce] release candidate 19.11-rc3
@ 2019-11-21  0:19  3% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-21  0:19 UTC (permalink / raw)
  To: announce

A new DPDK release candidate is ready for testing:
	https://git.dpdk.org/dpdk/tag/?id=v19.11-rc3
142 patches were integrated.

The release notes so far:
	http://doc.dpdk.org/guides/rel_notes/release_19_11.html
It should be completed with a list of tested hardware.

Highlights of 19.11-rc3:
	- new ABI versioning
	- KNI with VA

The -rc4 should include only some bug fixes, doc and tooling.
This next milestone is expected to be released on Tuesday 26th.

There are some open bugs to check in bugzilla:
	https://bugs.dpdk.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=IN_PROGRESS&product=DPDK
Please hurry up to do the last checks and bug fixes,
in order to have DPDK 19.11 out during the next week.
You may share some release validation results
by replying to this message (at dev@dpdk.org).

If you are preparing the next release cycle, please send your v1 patches
before the 20.02 proposal deadline, which will happen on December 6th.
It is also time to build an estimated roadmap for the next cycles.

Thank you everyone



^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v8 00/12] Implement the new ABI policy and add helper scripts
  2019-11-20 20:17  4%         ` Thomas Monjalon
@ 2019-11-20 22:13  4%           ` David Marchand
  2019-11-21 10:22  4%             ` Burakov, Anatoly
  2019-11-21 13:24  4%           ` Kinsella, Ray
  1 sibling, 1 reply; 200+ results
From: David Marchand @ 2019-11-20 22:13 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Mcnamara, John, Kinsella, Ray, Bruce Richardson, Thomas Monjalon

On Wed, Nov 20, 2019 at 9:17 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>
> 20/11/2019 18:23, Anatoly Burakov:
> > This patchset prepares the codebase for the new ABI policy and
> > adds a few helper scripts.
> >
> >  379 files changed, 1172 insertions(+), 3409 deletions(-)
>
> Thanks for the great work Anatoly
>
> Acked-by: Thomas Monjalon <thomas@monjalon.net>

Added some entropy for external libraries using make, rebased on a
(non-|) compiling master, fixed some typos (that codespell found) and
added the new scripts in MAINTAINERS.
And with this, we are done :-).

Applied, thanks.


-- 
David Marchand


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global
  2019-11-20 19:51  4%         ` David Marchand
@ 2019-11-20 22:01  9%           ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-20 22:01 UTC (permalink / raw)
  To: Anatoly Burakov; +Cc: dev, Thomas Monjalon

On Wed, Nov 20, 2019 at 8:51 PM David Marchand
<david.marchand@redhat.com> wrote:
>
> On Wed, Nov 20, 2019 at 6:23 PM Anatoly Burakov
> <anatoly.burakov@intel.com> wrote:
> >
> > From: Marcin Baran <marcinx.baran@intel.com>
> >
> > As per new ABI policy [1], all of the libraries are now versioned using
> > one global ABI version. Stable libraries use the MAJOR.MINOR ABI
> > version for their shared objects, while experimental libraries
> > use the 0.MAJORMINOR convention for their versioning.
> > Experimental library versioning is managed globally. Changes in this
> > patch implement the necessary steps to enable that.
>
> The next patch just removes the config entry CONFIG_RTE_MAJOR_ABI
> while this patch entirely removes its usage.
> I squashed patch 2 in patch 1 and added its commitlog here.
>
> >
> > [1] https://doc.dpdk.org/guides/contributing/abi_policy.html
> >
> > Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
> > Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> > Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> > Acked-by: Bruce Richardson <bruce.richardson@intel.com>
>
> [snip]
>
> > diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> > index 4df8849a08..3b318a5306 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -11,20 +11,16 @@ EXTLIB_BUILD ?= n
> >  # VPATH contains at least SRCDIR
> >  VPATH += $(SRCDIR)
> >
> > -ifneq ($(CONFIG_RTE_MAJOR_ABI),)
> > -ifneq ($(LIBABIVER),)
> > -LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
> > -endif
> > +ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
> > +LIBABIVER := $(shell cat $(RTE_SRCDIR)/ABI_VERSION)
> > +else
> > +# EXPERIMENTAL ABI is versioned as 0.major+minor, e.g. 0.201 for 20.1 ABI
> > +LIBABIVER := 0.$(shell cat $(RTE_SRCDIR)/ABI_VERSION | td -d '.')
>
> s/td/tr/
>
> Will fix while applying.

On this part again, for ethtool example library, this triggers a
warning since ABI_VERSION does not exist in this example source
directory.

diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 94a80e024..655a1b143 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -13,7 +13,7 @@ VPATH += $(SRCDIR)

 ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
 LIBABIVER := $(shell cat $(RTE_SRCDIR)/ABI_VERSION)
-else
+else ifeq ($(LIBABIVER),)
 # EXPERIMENTAL ABI is versioned as 0.major+minor, e.g. 0.201 for 20.1 ABI
 LIBABIVER := 0.$(shell cat $(RTE_SRCDIR)/ABI_VERSION | tr -d '.')
 endif

In the patch removing LIBABIVER, I let examples/ethtool/lib/Makefile untouched.
With this, an external library manages its ABI version.


-- 
David Marchand


^ permalink raw reply	[relevance 9%]

* Re: [dpdk-dev] [PATCH v8 00/12] Implement the new ABI policy and add helper scripts
  2019-11-20 17:23  7%       ` [dpdk-dev] [PATCH v8 00/12] " Anatoly Burakov
@ 2019-11-20 20:17  4%         ` Thomas Monjalon
  2019-11-20 22:13  4%           ` David Marchand
  2019-11-21 13:24  4%           ` Kinsella, Ray
  0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2019-11-20 20:17 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, john.mcnamara, ray.kinsella, bruce.richardson, david.marchand

20/11/2019 18:23, Anatoly Burakov:
> This patchset prepares the codebase for the new ABI policy and
> adds a few helper scripts.
> 
>  379 files changed, 1172 insertions(+), 3409 deletions(-)

Thanks for the great work Anatoly

Acked-by: Thomas Monjalon <thomas@monjalon.net>



^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 04/12] buildtools: add script for updating symbols abi version
  2019-11-20 17:23 16%       ` [dpdk-dev] [PATCH v8 04/12] buildtools: add script for updating symbols abi version Anatoly Burakov
@ 2019-11-20 20:05  7%         ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-20 20:05 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Pawel Modrak, Mcnamara, John, Kinsella, Ray,
	Bruce Richardson, Thomas Monjalon

On Wed, Nov 20, 2019 at 6:24 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
> diff --git a/buildtools/update_version_map_abi.py b/buildtools/update_version_map_abi.py
> new file mode 100755
> index 0000000000..87fed54653
> --- /dev/null
> +++ b/buildtools/update_version_map_abi.py
> @@ -0,0 +1,175 @@
> +#!/usr/bin/env python
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright(c) 2019 Intel Corporation
> +
> +"""
> +A Python program that updates and merges all available stable ABI versions into
> +one ABI version, while leaving experimental ABI exactly as it is. The intended
> +ABI version is supplied via command-line parameter. This script is to be called
> +from the buildtools/update_abi.sh utility.

update-abi.sh

Will fix while applying.


-- 
David Marchand


^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global Anatoly Burakov
@ 2019-11-20 19:51  4%         ` David Marchand
  2019-11-20 22:01  9%           ` David Marchand
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-20 19:51 UTC (permalink / raw)
  To: Anatoly Burakov; +Cc: dev, Thomas Monjalon

On Wed, Nov 20, 2019 at 6:23 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> From: Marcin Baran <marcinx.baran@intel.com>
>
> As per new ABI policy [1], all of the libraries are now versioned using
> one global ABI version. Stable libraries use the MAJOR.MINOR ABI
> version for their shared objects, while experimental libraries
> use the 0.MAJORMINOR convention for their versioning.
> Experimental library versioning is managed globally. Changes in this
> patch implement the necessary steps to enable that.

The next patch just removes the config entry CONFIG_RTE_MAJOR_ABI
while this patch entirely removes its usage.
I squashed patch 2 in patch 1 and added its commitlog here.

>
> [1] https://doc.dpdk.org/guides/contributing/abi_policy.html
>
> Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>

[snip]

> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> index 4df8849a08..3b318a5306 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -11,20 +11,16 @@ EXTLIB_BUILD ?= n
>  # VPATH contains at least SRCDIR
>  VPATH += $(SRCDIR)
>
> -ifneq ($(CONFIG_RTE_MAJOR_ABI),)
> -ifneq ($(LIBABIVER),)
> -LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
> -endif
> +ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
> +LIBABIVER := $(shell cat $(RTE_SRCDIR)/ABI_VERSION)
> +else
> +# EXPERIMENTAL ABI is versioned as 0.major+minor, e.g. 0.201 for 20.1 ABI
> +LIBABIVER := 0.$(shell cat $(RTE_SRCDIR)/ABI_VERSION | td -d '.')

s/td/tr/

Will fix while applying.

-- 
David Marchand


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v8 11/12] build: change ABI version to 20.0
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (10 preceding siblings ...)
  2019-11-20 17:23  3%       ` [dpdk-dev] [PATCH v8 10/12] drivers/octeontx: add missing public symbol Anatoly Burakov
@ 2019-11-20 17:23  2%       ` Anatoly Burakov
  2019-11-20 20:47  3%         ` David Marchand
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 12/12] buildtools: add ABI versioning check script Anatoly Burakov
  12 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Pawel Modrak, Nicolas Chautru, Hemant Agrawal, Sachin Saxena,
	Rosen Xu, Stephen Hemminger, Anoob Joseph, Tomasz Duszynski,
	Liron Himi, Jerin Jacob, Nithin Dabilpuram, Vamsi Attunuru,
	Lee Daly, Fiona Trahe, Ashish Gupta, Sunila Sahu, Declan Doherty,
	Pablo de Lara, Gagandeep Singh, Ravi Kumar, Akhil Goyal,
	Michael Shamis, Nagadheeraj Rottela, Srikanth Jampala,
	Ankur Dwivedi, Fan Zhang, Jay Zhou, Nipun Gupta,
	Mattias Rönnblom, Pavan Nikhilesh, Liang Ma, Peter Mccarthy,
	Harry van Haaren, Artem V. Andreev, Andrew Rybchenko,
	Olivier Matz, Gage Eads, John W. Linville, Xiaolong Ye, Qi Zhang,
	Shepard Siegel, Ed Czeck, John Miller, Igor Russkikh,
	Pavel Belous, Allain Legacy, Matt Peters, Rasesh Mody,
	Shahed Shaikh, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Rahul Lakkireddy, Wenzhuo Lu, Marcin Wojtas, Michal Krawczyk,
	Guy Tzalik, Evgeny Schemeilin, Igor Chauskin, John Daley,
	Hyong Youb Kim, Gaetan Rivet, Xiao Wang, Ziyang Xuan,
	Xiaoyun Wang, Guoyang Zhou, Wei Hu (Xavier), Min Hu (Connor),
	Yisen Zhuang, Beilei Xing, Jingjing Wu, Qiming Yang,
	Konstantin Ananyev, Ferruh Yigit, Shijith Thotton,
	Srisivasubramanian Srinivasan, Jakub Grajciar, Matan Azrad,
	Shahaf Shuler, Viacheslav Ovsiienko, Zyta Szpak,
	K. Y. Srinivasan, Haiyang Zhang, Rastislav Cernay, Jan Remes,
	Alejandro Lucero, Tetsuya Mukawa, Kiran Kumar K,
	Bruce Richardson, Jasvinder Singh, Cristian Dumitrescu,
	Keith Wiles, Maciej Czekaj, Maxime Coquelin, Tiwei Bie,
	Zhihong Wang, Yong Wang, Tianfei zhang, Xiaoyun Li, Satha Rao,
	Shreyansh Jain, David Hunt, Byron Marohn, Yipeng Wang,
	Thomas Monjalon, Jiayu Hu, Sameh Gobriel, Reshma Pattan,
	Vladimir Medvedkin, Robert Sanford, Erik Gabriel Carrillo,
	john.mcnamara, ray.kinsella, david.marchand

From: Pawel Modrak <pawelx.modrak@intel.com>

Merge all vesions in linker version script files to DPDK_20.0.

This commit was generated by running the following command:

:~/DPDK$ buildtools/update-abi.sh 20.0

Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 .../rte_pmd_bbdev_fpga_lte_fec_version.map    |   8 +-
 .../null/rte_pmd_bbdev_null_version.map       |   2 +-
 .../rte_pmd_bbdev_turbo_sw_version.map        |   2 +-
 drivers/bus/dpaa/rte_bus_dpaa_version.map     | 113 +++---
 drivers/bus/fslmc/rte_bus_fslmc_version.map   | 154 ++++-----
 drivers/bus/ifpga/rte_bus_ifpga_version.map   |  14 +-
 drivers/bus/pci/rte_bus_pci_version.map       |   2 +-
 drivers/bus/vdev/rte_bus_vdev_version.map     |  12 +-
 drivers/bus/vmbus/rte_bus_vmbus_version.map   |  12 +-
 drivers/common/cpt/rte_common_cpt_version.map |   9 +-
 .../common/dpaax/rte_common_dpaax_version.map |  14 +-
 .../common/mvep/rte_common_mvep_version.map   |   6 +-
 .../octeontx/rte_common_octeontx_version.map  |   6 +-
 .../rte_common_octeontx2_version.map          |  16 +-
 .../compress/isal/rte_pmd_isal_version.map    |   2 +-
 .../rte_pmd_octeontx_compress_version.map     |   2 +-
 drivers/compress/qat/rte_pmd_qat_version.map  |   2 +-
 .../compress/zlib/rte_pmd_zlib_version.map    |   2 +-
 .../aesni_gcm/rte_pmd_aesni_gcm_version.map   |   2 +-
 .../aesni_mb/rte_pmd_aesni_mb_version.map     |   2 +-
 .../crypto/armv8/rte_pmd_armv8_version.map    |   2 +-
 .../caam_jr/rte_pmd_caam_jr_version.map       |   3 +-
 drivers/crypto/ccp/rte_pmd_ccp_version.map    |   3 +-
 .../dpaa2_sec/rte_pmd_dpaa2_sec_version.map   |  10 +-
 .../dpaa_sec/rte_pmd_dpaa_sec_version.map     |  10 +-
 .../crypto/kasumi/rte_pmd_kasumi_version.map  |   2 +-
 .../crypto/mvsam/rte_pmd_mvsam_version.map    |   2 +-
 .../crypto/nitrox/rte_pmd_nitrox_version.map  |   2 +-
 .../null/rte_pmd_null_crypto_version.map      |   2 +-
 .../rte_pmd_octeontx_crypto_version.map       |   3 +-
 .../rte_pmd_octeontx2_crypto_version.map      |   3 +-
 .../openssl/rte_pmd_openssl_version.map       |   2 +-
 .../rte_pmd_crypto_scheduler_version.map      |  19 +-
 .../crypto/snow3g/rte_pmd_snow3g_version.map  |   2 +-
 .../virtio/rte_pmd_virtio_crypto_version.map  |   2 +-
 drivers/crypto/zuc/rte_pmd_zuc_version.map    |   2 +-
 .../event/dpaa/rte_pmd_dpaa_event_version.map |   3 +-
 .../dpaa2/rte_pmd_dpaa2_event_version.map     |   2 +-
 .../event/dsw/rte_pmd_dsw_event_version.map   |   2 +-
 .../rte_pmd_octeontx_event_version.map        |   2 +-
 .../rte_pmd_octeontx2_event_version.map       |   3 +-
 .../event/opdl/rte_pmd_opdl_event_version.map |   2 +-
 .../rte_pmd_skeleton_event_version.map        |   3 +-
 drivers/event/sw/rte_pmd_sw_event_version.map |   2 +-
 .../bucket/rte_mempool_bucket_version.map     |   3 +-
 .../mempool/dpaa/rte_mempool_dpaa_version.map |   2 +-
 .../dpaa2/rte_mempool_dpaa2_version.map       |  12 +-
 .../octeontx/rte_mempool_octeontx_version.map |   2 +-
 .../rte_mempool_octeontx2_version.map         |   4 +-
 .../mempool/ring/rte_mempool_ring_version.map |   3 +-
 .../stack/rte_mempool_stack_version.map       |   3 +-
 .../af_packet/rte_pmd_af_packet_version.map   |   3 +-
 drivers/net/af_xdp/rte_pmd_af_xdp_version.map |   2 +-
 drivers/net/ark/rte_pmd_ark_version.map       |   5 +-
 .../net/atlantic/rte_pmd_atlantic_version.map |   4 +-
 drivers/net/avp/rte_pmd_avp_version.map       |   2 +-
 drivers/net/axgbe/rte_pmd_axgbe_version.map   |   2 +-
 drivers/net/bnx2x/rte_pmd_bnx2x_version.map   |   3 +-
 drivers/net/bnxt/rte_pmd_bnxt_version.map     |   4 +-
 drivers/net/bonding/rte_pmd_bond_version.map  |  47 +--
 drivers/net/cxgbe/rte_pmd_cxgbe_version.map   |   3 +-
 drivers/net/dpaa/rte_pmd_dpaa_version.map     |  11 +-
 drivers/net/dpaa2/rte_pmd_dpaa2_version.map   |  12 +-
 drivers/net/e1000/rte_pmd_e1000_version.map   |   3 +-
 drivers/net/ena/rte_pmd_ena_version.map       |   3 +-
 drivers/net/enetc/rte_pmd_enetc_version.map   |   3 +-
 drivers/net/enic/rte_pmd_enic_version.map     |   3 +-
 .../net/failsafe/rte_pmd_failsafe_version.map |   3 +-
 drivers/net/fm10k/rte_pmd_fm10k_version.map   |   3 +-
 drivers/net/hinic/rte_pmd_hinic_version.map   |   3 +-
 drivers/net/hns3/rte_pmd_hns3_version.map     |   4 +-
 drivers/net/i40e/rte_pmd_i40e_version.map     |  65 +---
 drivers/net/iavf/rte_pmd_iavf_version.map     |   3 +-
 drivers/net/ice/rte_pmd_ice_version.map       |   3 +-
 drivers/net/ifc/rte_pmd_ifc_version.map       |   3 +-
 drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map |   3 +-
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map   |  62 ++--
 drivers/net/kni/rte_pmd_kni_version.map       |   3 +-
 .../net/liquidio/rte_pmd_liquidio_version.map |   3 +-
 drivers/net/memif/rte_pmd_memif_version.map   |   5 +-
 drivers/net/mlx4/rte_pmd_mlx4_version.map     |   3 +-
 drivers/net/mlx5/rte_pmd_mlx5_version.map     |   2 +-
 drivers/net/mvneta/rte_pmd_mvneta_version.map |   2 +-
 drivers/net/mvpp2/rte_pmd_mvpp2_version.map   |   2 +-
 drivers/net/netvsc/rte_pmd_netvsc_version.map |   4 +-
 drivers/net/nfb/rte_pmd_nfb_version.map       |   3 +-
 drivers/net/nfp/rte_pmd_nfp_version.map       |   2 +-
 drivers/net/null/rte_pmd_null_version.map     |   3 +-
 .../net/octeontx/rte_pmd_octeontx_version.map |  10 +-
 .../octeontx2/rte_pmd_octeontx2_version.map   |   3 +-
 drivers/net/pcap/rte_pmd_pcap_version.map     |   3 +-
 drivers/net/pfe/rte_pmd_pfe_version.map       |   3 +-
 drivers/net/qede/rte_pmd_qede_version.map     |   3 +-
 drivers/net/ring/rte_pmd_ring_version.map     |  10 +-
 drivers/net/sfc/rte_pmd_sfc_version.map       |   3 +-
 .../net/softnic/rte_pmd_softnic_version.map   |   2 +-
 .../net/szedata2/rte_pmd_szedata2_version.map |   2 +-
 drivers/net/tap/rte_pmd_tap_version.map       |   3 +-
 .../net/thunderx/rte_pmd_thunderx_version.map |   3 +-
 .../rte_pmd_vdev_netvsc_version.map           |   3 +-
 drivers/net/vhost/rte_pmd_vhost_version.map   |  11 +-
 drivers/net/virtio/rte_pmd_virtio_version.map |   3 +-
 .../net/vmxnet3/rte_pmd_vmxnet3_version.map   |   3 +-
 .../rte_rawdev_dpaa2_cmdif_version.map        |   3 +-
 .../rte_rawdev_dpaa2_qdma_version.map         |   4 +-
 .../raw/ifpga/rte_rawdev_ifpga_version.map    |   3 +-
 drivers/raw/ioat/rte_rawdev_ioat_version.map  |   3 +-
 drivers/raw/ntb/rte_rawdev_ntb_version.map    |   5 +-
 .../rte_rawdev_octeontx2_dma_version.map      |   3 +-
 .../skeleton/rte_rawdev_skeleton_version.map  |   3 +-
 lib/librte_acl/rte_acl_version.map            |   2 +-
 .../rte_bitratestats_version.map              |   2 +-
 lib/librte_cfgfile/rte_cfgfile_version.map    |  34 +-
 lib/librte_cmdline/rte_cmdline_version.map    |  10 +-
 .../rte_cryptodev_version.map                 | 102 ++----
 .../rte_distributor_version.map               |   4 +-
 lib/librte_eal/rte_eal_version.map            | 324 ++++++------------
 lib/librte_efd/rte_efd_version.map            |   2 +-
 lib/librte_ethdev/rte_ethdev_version.map      | 160 +++------
 lib/librte_eventdev/rte_eventdev_version.map  | 130 +++----
 lib/librte_gro/rte_gro_version.map            |   2 +-
 lib/librte_gso/rte_gso_version.map            |   2 +-
 lib/librte_hash/rte_hash_version.map          |  43 +--
 lib/librte_ip_frag/rte_ip_frag_version.map    |  10 +-
 lib/librte_jobstats/rte_jobstats_version.map  |  10 +-
 lib/librte_kni/rte_kni_version.map            |   2 +-
 lib/librte_kvargs/rte_kvargs_version.map      |   4 +-
 .../rte_latencystats_version.map              |   2 +-
 lib/librte_lpm/rte_lpm_version.map            |  32 +-
 lib/librte_mbuf/rte_mbuf_version.map          |  49 +--
 lib/librte_member/rte_member_version.map      |   2 +-
 lib/librte_mempool/rte_mempool_version.map    |  44 +--
 lib/librte_meter/rte_meter_version.map        |  13 +-
 lib/librte_metrics/rte_metrics_version.map    |   2 +-
 lib/librte_net/rte_net_version.map            |  23 +-
 lib/librte_pci/rte_pci_version.map            |   2 +-
 lib/librte_pdump/rte_pdump_version.map        |   2 +-
 lib/librte_pipeline/rte_pipeline_version.map  |  36 +-
 lib/librte_port/rte_port_version.map          |  64 +---
 lib/librte_power/rte_power_version.map        |  24 +-
 lib/librte_rawdev/rte_rawdev_version.map      |   4 +-
 lib/librte_reorder/rte_reorder_version.map    |   8 +-
 lib/librte_ring/rte_ring_version.map          |  10 +-
 lib/librte_sched/rte_sched_version.map        |  14 +-
 lib/librte_security/rte_security_version.map  |   2 +-
 lib/librte_table/rte_table_version.map        |   2 +-
 lib/librte_timer/rte_timer_version.map        |  21 +-
 lib/librte_vhost/rte_vhost_version.map        |  52 +--
 148 files changed, 707 insertions(+), 1426 deletions(-)

diff --git a/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map b/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
index f64b0f9c27..6bcea2cc7f 100644
--- a/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
+++ b/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
@@ -1,10 +1,10 @@
-DPDK_19.08 {
-    local: *;
+DPDK_20.0 {
+	local: *;
 };
 
 EXPERIMENTAL {
-    global:
+	global:
 
-    fpga_lte_fec_configure;
+	fpga_lte_fec_configure;
 
 };
diff --git a/drivers/baseband/null/rte_pmd_bbdev_null_version.map b/drivers/baseband/null/rte_pmd_bbdev_null_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/baseband/null/rte_pmd_bbdev_null_version.map
+++ b/drivers/baseband/null/rte_pmd_bbdev_null_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map b/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
+++ b/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map
index cf428a54dc..e6ca4361e0 100644
--- a/drivers/bus/dpaa/rte_bus_dpaa_version.map
+++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	bman_acquire;
@@ -7,123 +7,90 @@ DPDK_17.11 {
 	bman_new_pool;
 	bman_query_free_buffers;
 	bman_release;
+	bman_thread_irq;
+	dpaa_logtype_eventdev;
 	dpaa_logtype_mempool;
 	dpaa_logtype_pmd;
 	dpaa_netcfg;
+	dpaa_svr_family;
 	fman_ccsr_map_fd;
 	fman_dealloc_bufs_mask_hi;
 	fman_dealloc_bufs_mask_lo;
 	fman_if_add_mac_addr;
 	fman_if_clear_mac_addr;
 	fman_if_disable_rx;
-	fman_if_enable_rx;
 	fman_if_discard_rx_errors;
-	fman_if_get_fc_threshold;
+	fman_if_enable_rx;
 	fman_if_get_fc_quanta;
+	fman_if_get_fc_threshold;
 	fman_if_get_fdoff;
+	fman_if_get_sg_enable;
 	fman_if_loopback_disable;
 	fman_if_loopback_enable;
 	fman_if_promiscuous_disable;
 	fman_if_promiscuous_enable;
 	fman_if_reset_mcast_filter_table;
 	fman_if_set_bp;
-	fman_if_set_fc_threshold;
 	fman_if_set_fc_quanta;
+	fman_if_set_fc_threshold;
 	fman_if_set_fdoff;
 	fman_if_set_ic_params;
 	fman_if_set_maxfrm;
 	fman_if_set_mcast_filter_table;
+	fman_if_set_sg;
 	fman_if_stats_get;
 	fman_if_stats_get_all;
 	fman_if_stats_reset;
 	fman_ip_rev;
+	fsl_qman_fq_portal_create;
 	netcfg_acquire;
 	netcfg_release;
-	qm_channel_caam;
-	qman_create_fq;
-	qman_dequeue;
-	qman_dqrr_consume;
-	qman_enqueue;
-	qman_enqueue_multi;
-	qman_fq_fqid;
-	qman_fq_state;
-	qman_init_fq;
-	qman_poll_dqrr;
-	qman_query_fq_np;
-	qman_set_vdq;
-	qman_reserve_fqid_range;
-	qman_volatile_dequeue;
-	rte_dpaa_driver_register;
-	rte_dpaa_driver_unregister;
-	rte_dpaa_mem_ptov;
-	rte_dpaa_portal_init;
-
-	local: *;
-};
-
-DPDK_18.02 {
-	global:
-
-	dpaa_logtype_eventdev;
-	dpaa_svr_family;
 	per_lcore_dpaa_io;
 	per_lcore_held_bufs;
+	qm_channel_caam;
 	qm_channel_pool1;
 	qman_alloc_cgrid_range;
 	qman_alloc_pool_range;
+	qman_clear_irq;
 	qman_create_cgr;
+	qman_create_fq;
 	qman_dca_index;
 	qman_delete_cgr;
+	qman_dequeue;
+	qman_dqrr_consume;
+	qman_enqueue;
+	qman_enqueue_multi;
 	qman_enqueue_multi_fq;
+	qman_fq_fqid;
+	qman_fq_portal_irqsource_add;
+	qman_fq_portal_irqsource_remove;
+	qman_fq_portal_thread_irq;
+	qman_fq_state;
+	qman_init_fq;
+	qman_irqsource_add;
+	qman_irqsource_remove;
 	qman_modify_cgr;
 	qman_oos_fq;
+	qman_poll_dqrr;
 	qman_portal_dequeue;
 	qman_portal_poll_rx;
 	qman_query_fq_frm_cnt;
+	qman_query_fq_np;
 	qman_release_cgrid_range;
+	qman_reserve_fqid_range;
 	qman_retire_fq;
+	qman_set_fq_lookup_table;
+	qman_set_vdq;
 	qman_static_dequeue_add;
-	rte_dpaa_portal_fq_close;
-	rte_dpaa_portal_fq_init;
-
-} DPDK_17.11;
-
-DPDK_18.08 {
-	global:
-
-	fman_if_get_sg_enable;
-	fman_if_set_sg;
-
-} DPDK_18.02;
-
-DPDK_18.11 {
-	global:
-
-	bman_thread_irq;
-	fman_if_get_sg_enable;
-	fman_if_set_sg;
-	qman_clear_irq;
-
-	qman_irqsource_add;
-	qman_irqsource_remove;
 	qman_thread_fd;
 	qman_thread_irq;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	qman_set_fq_lookup_table;
-
-} DPDK_18.11;
-
-DPDK_19.11 {
-	global:
-
-	fsl_qman_fq_portal_create;
-	qman_fq_portal_irqsource_add;
-	qman_fq_portal_irqsource_remove;
-	qman_fq_portal_thread_irq;
-
-} DPDK_19.05;
+	qman_volatile_dequeue;
+	rte_dpaa_driver_register;
+	rte_dpaa_driver_unregister;
+	rte_dpaa_mem_ptov;
+	rte_dpaa_portal_fq_close;
+	rte_dpaa_portal_fq_init;
+	rte_dpaa_portal_init;
+
+	local: *;
+};
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index 4da787236b..fe45575046 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -1,32 +1,67 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
+	dpaa2_affine_qbman_ethrx_swp;
 	dpaa2_affine_qbman_swp;
 	dpaa2_alloc_dpbp_dev;
 	dpaa2_alloc_dq_storage;
+	dpaa2_dpbp_supported;
+	dpaa2_dqrr_size;
+	dpaa2_eqcr_size;
 	dpaa2_free_dpbp_dev;
 	dpaa2_free_dq_storage;
+	dpaa2_free_eq_descriptors;
+	dpaa2_get_qbman_swp;
+	dpaa2_io_portal;
+	dpaa2_svr_family;
+	dpaa2_virt_mode;
 	dpbp_disable;
 	dpbp_enable;
 	dpbp_get_attributes;
 	dpbp_get_num_free_bufs;
 	dpbp_open;
 	dpbp_reset;
+	dpci_get_opr;
+	dpci_set_opr;
+	dpci_set_rx_queue;
+	dpcon_get_attributes;
+	dpcon_open;
+	dpdmai_close;
+	dpdmai_disable;
+	dpdmai_enable;
+	dpdmai_get_attributes;
+	dpdmai_get_rx_queue;
+	dpdmai_get_tx_queue;
+	dpdmai_open;
+	dpdmai_set_rx_queue;
+	dpio_add_static_dequeue_channel;
 	dpio_close;
 	dpio_disable;
 	dpio_enable;
 	dpio_get_attributes;
 	dpio_open;
+	dpio_remove_static_dequeue_channel;
 	dpio_reset;
 	dpio_set_stashing_destination;
+	mc_get_soc_version;
+	mc_get_version;
 	mc_send_command;
 	per_lcore__dpaa2_io;
+	per_lcore_dpaa2_held_bufs;
 	qbman_check_command_complete;
+	qbman_check_new_result;
 	qbman_eq_desc_clear;
+	qbman_eq_desc_set_dca;
 	qbman_eq_desc_set_fq;
 	qbman_eq_desc_set_no_orp;
+	qbman_eq_desc_set_orp;
 	qbman_eq_desc_set_qd;
 	qbman_eq_desc_set_response;
+	qbman_eq_desc_set_token;
+	qbman_fq_query_state;
+	qbman_fq_state_frame_count;
+	qbman_get_dqrr_from_idx;
+	qbman_get_dqrr_idx;
 	qbman_pull_desc_clear;
 	qbman_pull_desc_set_fq;
 	qbman_pull_desc_set_numframes;
@@ -35,112 +70,43 @@ DPDK_17.05 {
 	qbman_release_desc_set_bpid;
 	qbman_result_DQ_fd;
 	qbman_result_DQ_flags;
-	qbman_result_has_new_result;
-	qbman_swp_acquire;
-	qbman_swp_pull;
-	qbman_swp_release;
-	rte_fslmc_driver_register;
-	rte_fslmc_driver_unregister;
-	rte_fslmc_vfio_dmamap;
-	rte_mcp_ptr_list;
-
-	local: *;
-};
-
-DPDK_17.08 {
-	global:
-
-	dpaa2_io_portal;
-	dpaa2_get_qbman_swp;
-	dpci_set_rx_queue;
-	dpcon_open;
-	dpcon_get_attributes;
-	dpio_add_static_dequeue_channel;
-	dpio_remove_static_dequeue_channel;
-	mc_get_soc_version;
-	mc_get_version;
-	qbman_check_new_result;
-	qbman_eq_desc_set_dca;
-	qbman_get_dqrr_from_idx;
-	qbman_get_dqrr_idx;
 	qbman_result_DQ_fqd_ctx;
+	qbman_result_DQ_odpid;
+	qbman_result_DQ_seqnum;
 	qbman_result_SCN_state;
+	qbman_result_eqresp_fd;
+	qbman_result_eqresp_rc;
+	qbman_result_eqresp_rspid;
+	qbman_result_eqresp_set_rspid;
+	qbman_result_has_new_result;
+	qbman_swp_acquire;
 	qbman_swp_dqrr_consume;
+	qbman_swp_dqrr_idx_consume;
 	qbman_swp_dqrr_next;
 	qbman_swp_enqueue_multiple;
 	qbman_swp_enqueue_multiple_desc;
+	qbman_swp_enqueue_multiple_fd;
 	qbman_swp_interrupt_clear_status;
+	qbman_swp_prefetch_dqrr_next;
+	qbman_swp_pull;
 	qbman_swp_push_set;
+	qbman_swp_release;
 	rte_dpaa2_alloc_dpci_dev;
-	rte_fslmc_object_register;
-	rte_global_active_dqs_list;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	dpaa2_dpbp_supported;
 	rte_dpaa2_dev_type;
+	rte_dpaa2_free_dpci_dev;
 	rte_dpaa2_intr_disable;
 	rte_dpaa2_intr_enable;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	dpaa2_svr_family;
-	dpaa2_virt_mode;
-	per_lcore_dpaa2_held_bufs;
-	qbman_fq_query_state;
-	qbman_fq_state_frame_count;
-	qbman_swp_dqrr_idx_consume;
-	qbman_swp_prefetch_dqrr_next;
-	rte_fslmc_get_device_count;
-
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	dpaa2_affine_qbman_ethrx_swp;
-	dpdmai_close;
-	dpdmai_disable;
-	dpdmai_enable;
-	dpdmai_get_attributes;
-	dpdmai_get_rx_queue;
-	dpdmai_get_tx_queue;
-	dpdmai_open;
-	dpdmai_set_rx_queue;
-	rte_dpaa2_free_dpci_dev;
 	rte_dpaa2_memsegs;
-
-} DPDK_18.02;
-
-DPDK_18.11 {
-	global:
-	dpaa2_dqrr_size;
-	dpaa2_eqcr_size;
-	dpci_get_opr;
-	dpci_set_opr;
-
-} DPDK_18.05;
-
-DPDK_19.05 {
-	global:
-	dpaa2_free_eq_descriptors;
-
-	qbman_eq_desc_set_orp;
-	qbman_eq_desc_set_token;
-	qbman_result_DQ_odpid;
-	qbman_result_DQ_seqnum;
-	qbman_result_eqresp_fd;
-	qbman_result_eqresp_rc;
-	qbman_result_eqresp_rspid;
-	qbman_result_eqresp_set_rspid;
-	qbman_swp_enqueue_multiple_fd;
-} DPDK_18.11;
+	rte_fslmc_driver_register;
+	rte_fslmc_driver_unregister;
+	rte_fslmc_get_device_count;
+	rte_fslmc_object_register;
+	rte_fslmc_vfio_dmamap;
+	rte_global_active_dqs_list;
+	rte_mcp_ptr_list;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/drivers/bus/ifpga/rte_bus_ifpga_version.map b/drivers/bus/ifpga/rte_bus_ifpga_version.map
index 964c9a9c45..05b4a28c1b 100644
--- a/drivers/bus/ifpga/rte_bus_ifpga_version.map
+++ b/drivers/bus/ifpga/rte_bus_ifpga_version.map
@@ -1,17 +1,11 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	global:
 
-	rte_ifpga_get_integer32_arg;
-	rte_ifpga_get_string_arg;
 	rte_ifpga_driver_register;
 	rte_ifpga_driver_unregister;
+	rte_ifpga_find_afu_by_name;
+	rte_ifpga_get_integer32_arg;
+	rte_ifpga_get_string_arg;
 
 	local: *;
 };
-
-DPDK_19.05 {
-	global:
-
-	rte_ifpga_find_afu_by_name;
-
-} DPDK_18.05;
diff --git a/drivers/bus/pci/rte_bus_pci_version.map b/drivers/bus/pci/rte_bus_pci_version.map
index 27e9c4f101..012d817e14 100644
--- a/drivers/bus/pci/rte_bus_pci_version.map
+++ b/drivers/bus/pci/rte_bus_pci_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_pci_dump;
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
index 590cf9b437..5abb10ecb0 100644
--- a/drivers/bus/vdev/rte_bus_vdev_version.map
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -1,18 +1,12 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
+	rte_vdev_add_custom_scan;
 	rte_vdev_init;
 	rte_vdev_register;
+	rte_vdev_remove_custom_scan;
 	rte_vdev_uninit;
 	rte_vdev_unregister;
 
 	local: *;
 };
-
-DPDK_18.02 {
-	global:
-
-	rte_vdev_add_custom_scan;
-	rte_vdev_remove_custom_scan;
-
-} DPDK_17.11;
diff --git a/drivers/bus/vmbus/rte_bus_vmbus_version.map b/drivers/bus/vmbus/rte_bus_vmbus_version.map
index ae231ad329..cbaaebc06c 100644
--- a/drivers/bus/vmbus/rte_bus_vmbus_version.map
+++ b/drivers/bus/vmbus/rte_bus_vmbus_version.map
@@ -1,6 +1,4 @@
-/* SPDX-License-Identifier: BSD-3-Clause */
-
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	rte_vmbus_chan_close;
@@ -20,6 +18,7 @@ DPDK_18.08 {
 	rte_vmbus_probe;
 	rte_vmbus_register;
 	rte_vmbus_scan;
+	rte_vmbus_set_latency;
 	rte_vmbus_sub_channel_index;
 	rte_vmbus_subchan_open;
 	rte_vmbus_unmap_device;
@@ -27,10 +26,3 @@ DPDK_18.08 {
 
 	local: *;
 };
-
-DPDK_18.11 {
-	global:
-
-	rte_vmbus_set_latency;
-
-} DPDK_18.08;
diff --git a/drivers/common/cpt/rte_common_cpt_version.map b/drivers/common/cpt/rte_common_cpt_version.map
index 382ec4bd44..7f1929d58e 100644
--- a/drivers/common/cpt/rte_common_cpt_version.map
+++ b/drivers/common/cpt/rte_common_cpt_version.map
@@ -1,14 +1,9 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
+	cpt_pmd_ops_helper_asym_get_mlen;
 	cpt_pmd_ops_helper_get_mlen_direct_mode;
 	cpt_pmd_ops_helper_get_mlen_sg_mode;
-};
-
-DPDK_19.11 {
-	global:
-
-	cpt_pmd_ops_helper_asym_get_mlen;
 
 	local: *;
 };
diff --git a/drivers/common/dpaax/rte_common_dpaax_version.map b/drivers/common/dpaax/rte_common_dpaax_version.map
index a7699ae4dd..f72eba761d 100644
--- a/drivers/common/dpaax/rte_common_dpaax_version.map
+++ b/drivers/common/dpaax/rte_common_dpaax_version.map
@@ -1,29 +1,23 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
-	dpaax_iova_table_update;
 	dpaax_iova_table_depopulate;
 	dpaax_iova_table_dump;
 	dpaax_iova_table_p;
 	dpaax_iova_table_populate;
-
-	local: *;
-};
-
-DPDK_19.11 {
-	global:
+	dpaax_iova_table_update;
 	of_device_is_available;
 	of_device_is_compatible;
 	of_find_compatible_node;
 	of_find_node_by_phandle;
 	of_get_address;
 	of_get_mac_address;
+	of_get_next_child;
 	of_get_parent;
 	of_get_property;
 	of_init_path;
 	of_n_addr_cells;
 	of_translate_address;
-	of_get_next_child;
 
 	local: *;
-} DPDK_18.11;
+};
diff --git a/drivers/common/mvep/rte_common_mvep_version.map b/drivers/common/mvep/rte_common_mvep_version.map
index c71722d79f..030928439d 100644
--- a/drivers/common/mvep/rte_common_mvep_version.map
+++ b/drivers/common/mvep/rte_common_mvep_version.map
@@ -1,6 +1,8 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
-	rte_mvep_init;
 	rte_mvep_deinit;
+	rte_mvep_init;
+
+	local: *;
 };
diff --git a/drivers/common/octeontx/rte_common_octeontx_version.map b/drivers/common/octeontx/rte_common_octeontx_version.map
index a9b3cff9bc..c15fb89112 100644
--- a/drivers/common/octeontx/rte_common_octeontx_version.map
+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
@@ -1,8 +1,10 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	global:
 
 	octeontx_logtype_mbox;
+	octeontx_mbox_send;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
-	octeontx_mbox_send;
+
+	local: *;
 };
diff --git a/drivers/common/octeontx2/rte_common_octeontx2_version.map b/drivers/common/octeontx2/rte_common_octeontx2_version.map
index 4400120da0..adad21a2d6 100644
--- a/drivers/common/octeontx2/rte_common_octeontx2_version.map
+++ b/drivers/common/octeontx2/rte_common_octeontx2_version.map
@@ -1,39 +1,35 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
 	otx2_dev_active_vfs;
 	otx2_dev_fini;
 	otx2_dev_priv_init;
-
+	otx2_disable_irqs;
+	otx2_intra_dev_get_cfg;
 	otx2_logtype_base;
 	otx2_logtype_dpi;
 	otx2_logtype_mbox;
+	otx2_logtype_nix;
 	otx2_logtype_npa;
 	otx2_logtype_npc;
-	otx2_logtype_nix;
 	otx2_logtype_sso;
-	otx2_logtype_tm;
 	otx2_logtype_tim;
-
+	otx2_logtype_tm;
 	otx2_mbox_alloc_msg_rsp;
 	otx2_mbox_get_rsp;
 	otx2_mbox_get_rsp_tmo;
 	otx2_mbox_id2name;
 	otx2_mbox_msg_send;
 	otx2_mbox_wait_for_rsp;
-
-	otx2_intra_dev_get_cfg;
 	otx2_npa_lf_active;
 	otx2_npa_lf_obj_get;
 	otx2_npa_lf_obj_ref;
 	otx2_npa_pf_func_get;
 	otx2_npa_set_defaults;
+	otx2_register_irq;
 	otx2_sso_pf_func_get;
 	otx2_sso_pf_func_set;
-
-	otx2_disable_irqs;
 	otx2_unregister_irq;
-	otx2_register_irq;
 
 	local: *;
 };
diff --git a/drivers/compress/isal/rte_pmd_isal_version.map b/drivers/compress/isal/rte_pmd_isal_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/compress/isal/rte_pmd_isal_version.map
+++ b/drivers/compress/isal/rte_pmd_isal_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map b/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
+++ b/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/qat/rte_pmd_qat_version.map b/drivers/compress/qat/rte_pmd_qat_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/qat/rte_pmd_qat_version.map
+++ b/drivers/compress/qat/rte_pmd_qat_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/zlib/rte_pmd_zlib_version.map b/drivers/compress/zlib/rte_pmd_zlib_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/zlib/rte_pmd_zlib_version.map
+++ b/drivers/compress/zlib/rte_pmd_zlib_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map b/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
+++ b/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map b/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
+++ b/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/armv8/rte_pmd_armv8_version.map b/drivers/crypto/armv8/rte_pmd_armv8_version.map
index 1f84b68a83..f9f17e4f6e 100644
--- a/drivers/crypto/armv8/rte_pmd_armv8_version.map
+++ b/drivers/crypto/armv8/rte_pmd_armv8_version.map
@@ -1,3 +1,3 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map b/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
+++ b/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/ccp/rte_pmd_ccp_version.map b/drivers/crypto/ccp/rte_pmd_ccp_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/crypto/ccp/rte_pmd_ccp_version.map
+++ b/drivers/crypto/ccp/rte_pmd_ccp_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map b/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
index 0bfb986d0b..5952d645fd 100644
--- a/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
+++ b/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
@@ -1,12 +1,8 @@
-DPDK_17.05 {
-
-	local: *;
-};
-
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa2_sec_eventq_attach;
 	dpaa2_sec_eventq_detach;
 
-} DPDK_17.05;
+	local: *;
+};
diff --git a/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map b/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
index cc7f2162e0..8580fa13db 100644
--- a/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
+++ b/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
@@ -1,12 +1,8 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_19.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa_sec_eventq_attach;
 	dpaa_sec_eventq_detach;
 
-} DPDK_17.11;
+	local: *;
+};
diff --git a/drivers/crypto/kasumi/rte_pmd_kasumi_version.map b/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
index 8ffeca934e..f9f17e4f6e 100644
--- a/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
+++ b/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
@@ -1,3 +1,3 @@
-DPDK_16.07 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/mvsam/rte_pmd_mvsam_version.map b/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
+++ b/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/nitrox/rte_pmd_nitrox_version.map b/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
index 406964d1fc..f9f17e4f6e 100644
--- a/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
+++ b/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
@@ -1,3 +1,3 @@
-DPDK_19.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/null/rte_pmd_null_crypto_version.map b/drivers/crypto/null/rte_pmd_null_crypto_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/null/rte_pmd_null_crypto_version.map
+++ b/drivers/crypto/null/rte_pmd_null_crypto_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map b/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
+++ b/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map b/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
index b7b7c91683..f9f17e4f6e 100644
--- a/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
+++ b/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
@@ -1,4 +1,3 @@
-DPDK_19.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/openssl/rte_pmd_openssl_version.map b/drivers/crypto/openssl/rte_pmd_openssl_version.map
index cc5829e30b..f9f17e4f6e 100644
--- a/drivers/crypto/openssl/rte_pmd_openssl_version.map
+++ b/drivers/crypto/openssl/rte_pmd_openssl_version.map
@@ -1,3 +1,3 @@
-DPDK_16.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map b/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
index 5c43127cf2..077afedce7 100644
--- a/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
+++ b/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
@@ -1,21 +1,16 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
 	rte_cryptodev_scheduler_load_user_scheduler;
-	rte_cryptodev_scheduler_slave_attach;
-	rte_cryptodev_scheduler_slave_detach;
-	rte_cryptodev_scheduler_ordering_set;
-	rte_cryptodev_scheduler_ordering_get;
-
-};
-
-DPDK_17.05 {
-	global:
-
 	rte_cryptodev_scheduler_mode_get;
 	rte_cryptodev_scheduler_mode_set;
 	rte_cryptodev_scheduler_option_get;
 	rte_cryptodev_scheduler_option_set;
+	rte_cryptodev_scheduler_ordering_get;
+	rte_cryptodev_scheduler_ordering_set;
+	rte_cryptodev_scheduler_slave_attach;
+	rte_cryptodev_scheduler_slave_detach;
 	rte_cryptodev_scheduler_slaves_get;
 
-} DPDK_17.02;
+	local: *;
+};
diff --git a/drivers/crypto/snow3g/rte_pmd_snow3g_version.map b/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
+++ b/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map b/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
+++ b/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/zuc/rte_pmd_zuc_version.map b/drivers/crypto/zuc/rte_pmd_zuc_version.map
index cc5829e30b..f9f17e4f6e 100644
--- a/drivers/crypto/zuc/rte_pmd_zuc_version.map
+++ b/drivers/crypto/zuc/rte_pmd_zuc_version.map
@@ -1,3 +1,3 @@
-DPDK_16.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dpaa/rte_pmd_dpaa_event_version.map b/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
+++ b/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map b/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
index 1c0b7559dc..f9f17e4f6e 100644
--- a/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
+++ b/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dsw/rte_pmd_dsw_event_version.map b/drivers/event/dsw/rte_pmd_dsw_event_version.map
index 24bd5cdb35..f9f17e4f6e 100644
--- a/drivers/event/dsw/rte_pmd_dsw_event_version.map
+++ b/drivers/event/dsw/rte_pmd_dsw_event_version.map
@@ -1,3 +1,3 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/octeontx/rte_pmd_octeontx_event_version.map b/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
+++ b/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map b/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
index 41c65c8c9c..f9f17e4f6e 100644
--- a/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
+++ b/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	local: *;
 };
-
diff --git a/drivers/event/opdl/rte_pmd_opdl_event_version.map b/drivers/event/opdl/rte_pmd_opdl_event_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/event/opdl/rte_pmd_opdl_event_version.map
+++ b/drivers/event/opdl/rte_pmd_opdl_event_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
+++ b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/sw/rte_pmd_sw_event_version.map b/drivers/event/sw/rte_pmd_sw_event_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/event/sw/rte_pmd_sw_event_version.map
+++ b/drivers/event/sw/rte_pmd_sw_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/bucket/rte_mempool_bucket_version.map b/drivers/mempool/bucket/rte_mempool_bucket_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/mempool/bucket/rte_mempool_bucket_version.map
+++ b/drivers/mempool/bucket/rte_mempool_bucket_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
index 60bf50b2d1..9eebaf7ffd 100644
--- a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
+++ b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_dpaa_bpid_info;
diff --git a/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map b/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
index b45e7a9ac1..cd4bc88273 100644
--- a/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
+++ b/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
@@ -1,16 +1,10 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_dpaa2_bpid_info;
 	rte_dpaa2_mbuf_alloc_bulk;
-
-	local: *;
-};
-
-DPDK_18.05 {
-	global:
-
 	rte_dpaa2_mbuf_from_buf_addr;
 	rte_dpaa2_mbuf_pool_bpid;
 
-} DPDK_17.05;
+	local: *;
+};
diff --git a/drivers/mempool/octeontx/rte_mempool_octeontx_version.map b/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
+++ b/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map b/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
index d703368c31..d4f81aed8e 100644
--- a/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
+++ b/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
@@ -1,8 +1,8 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
-	otx2_npa_lf_init;
 	otx2_npa_lf_fini;
+	otx2_npa_lf_init;
 
 	local: *;
 };
diff --git a/drivers/mempool/ring/rte_mempool_ring_version.map b/drivers/mempool/ring/rte_mempool_ring_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/mempool/ring/rte_mempool_ring_version.map
+++ b/drivers/mempool/ring/rte_mempool_ring_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/stack/rte_mempool_stack_version.map b/drivers/mempool/stack/rte_mempool_stack_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/mempool/stack/rte_mempool_stack_version.map
+++ b/drivers/mempool/stack/rte_mempool_stack_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/af_packet/rte_pmd_af_packet_version.map b/drivers/net/af_packet/rte_pmd_af_packet_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/af_packet/rte_pmd_af_packet_version.map
+++ b/drivers/net/af_packet/rte_pmd_af_packet_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/af_xdp/rte_pmd_af_xdp_version.map b/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
index c6db030fe6..f9f17e4f6e 100644
--- a/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
+++ b/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
@@ -1,3 +1,3 @@
-DPDK_19.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ark/rte_pmd_ark_version.map b/drivers/net/ark/rte_pmd_ark_version.map
index 1062e0429f..f9f17e4f6e 100644
--- a/drivers/net/ark/rte_pmd_ark_version.map
+++ b/drivers/net/ark/rte_pmd_ark_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-	 local: *;
-
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/atlantic/rte_pmd_atlantic_version.map b/drivers/net/atlantic/rte_pmd_atlantic_version.map
index b16faa999f..9b04838d84 100644
--- a/drivers/net/atlantic/rte_pmd_atlantic_version.map
+++ b/drivers/net/atlantic/rte_pmd_atlantic_version.map
@@ -1,5 +1,4 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
 
@@ -13,4 +12,3 @@ EXPERIMENTAL {
 	rte_pmd_atl_macsec_select_txsa;
 	rte_pmd_atl_macsec_select_rxsa;
 };
-
diff --git a/drivers/net/avp/rte_pmd_avp_version.map b/drivers/net/avp/rte_pmd_avp_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/net/avp/rte_pmd_avp_version.map
+++ b/drivers/net/avp/rte_pmd_avp_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/axgbe/rte_pmd_axgbe_version.map b/drivers/net/axgbe/rte_pmd_axgbe_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/net/axgbe/rte_pmd_axgbe_version.map
+++ b/drivers/net/axgbe/rte_pmd_axgbe_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/bnx2x/rte_pmd_bnx2x_version.map b/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
index bd8138a034..f9f17e4f6e 100644
--- a/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
+++ b/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
@@ -1,4 +1,3 @@
-DPDK_2.1 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/bnxt/rte_pmd_bnxt_version.map b/drivers/net/bnxt/rte_pmd_bnxt_version.map
index 4750d40ad6..bb52562347 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt_version.map
+++ b/drivers/net/bnxt/rte_pmd_bnxt_version.map
@@ -1,4 +1,4 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	global:
 
 	rte_pmd_bnxt_get_vf_rx_status;
@@ -10,13 +10,13 @@ DPDK_17.08 {
 	rte_pmd_bnxt_set_tx_loopback;
 	rte_pmd_bnxt_set_vf_mac_addr;
 	rte_pmd_bnxt_set_vf_mac_anti_spoof;
+	rte_pmd_bnxt_set_vf_persist_stats;
 	rte_pmd_bnxt_set_vf_rate_limit;
 	rte_pmd_bnxt_set_vf_rxmode;
 	rte_pmd_bnxt_set_vf_vlan_anti_spoof;
 	rte_pmd_bnxt_set_vf_vlan_filter;
 	rte_pmd_bnxt_set_vf_vlan_insert;
 	rte_pmd_bnxt_set_vf_vlan_stripq;
-	rte_pmd_bnxt_set_vf_persist_stats;
 
 	local: *;
 };
diff --git a/drivers/net/bonding/rte_pmd_bond_version.map b/drivers/net/bonding/rte_pmd_bond_version.map
index 00d955c481..270c7d5d55 100644
--- a/drivers/net/bonding/rte_pmd_bond_version.map
+++ b/drivers/net/bonding/rte_pmd_bond_version.map
@@ -1,9 +1,21 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_eth_bond_8023ad_agg_selection_get;
+	rte_eth_bond_8023ad_agg_selection_set;
+	rte_eth_bond_8023ad_conf_get;
+	rte_eth_bond_8023ad_dedicated_queues_disable;
+	rte_eth_bond_8023ad_dedicated_queues_enable;
+	rte_eth_bond_8023ad_ext_collect;
+	rte_eth_bond_8023ad_ext_collect_get;
+	rte_eth_bond_8023ad_ext_distrib;
+	rte_eth_bond_8023ad_ext_distrib_get;
+	rte_eth_bond_8023ad_ext_slowtx;
+	rte_eth_bond_8023ad_setup;
 	rte_eth_bond_8023ad_slave_info;
 	rte_eth_bond_active_slaves_get;
 	rte_eth_bond_create;
+	rte_eth_bond_free;
 	rte_eth_bond_link_monitoring_set;
 	rte_eth_bond_mac_address_reset;
 	rte_eth_bond_mac_address_set;
@@ -19,36 +31,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_2.1 {
-	global:
-
-	rte_eth_bond_free;
-
-} DPDK_2.0;
-
-DPDK_16.04 {
-};
-
-DPDK_16.07 {
-	global:
-
-	rte_eth_bond_8023ad_ext_collect;
-	rte_eth_bond_8023ad_ext_collect_get;
-	rte_eth_bond_8023ad_ext_distrib;
-	rte_eth_bond_8023ad_ext_distrib_get;
-	rte_eth_bond_8023ad_ext_slowtx;
-
-} DPDK_16.04;
-
-DPDK_17.08 {
-	global:
-
-	rte_eth_bond_8023ad_dedicated_queues_enable;
-	rte_eth_bond_8023ad_dedicated_queues_disable;
-	rte_eth_bond_8023ad_agg_selection_get;
-	rte_eth_bond_8023ad_agg_selection_set;
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
-
-} DPDK_16.07;
diff --git a/drivers/net/cxgbe/rte_pmd_cxgbe_version.map b/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
index bd8138a034..f9f17e4f6e 100644
--- a/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
+++ b/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
@@ -1,4 +1,3 @@
-DPDK_2.1 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/dpaa/rte_pmd_dpaa_version.map b/drivers/net/dpaa/rte_pmd_dpaa_version.map
index 8cb4500b51..f403a1526d 100644
--- a/drivers/net/dpaa/rte_pmd_dpaa_version.map
+++ b/drivers/net/dpaa/rte_pmd_dpaa_version.map
@@ -1,12 +1,9 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	dpaa_eth_eventq_attach;
 	dpaa_eth_eventq_detach;
 	rte_pmd_dpaa_set_tx_loopback;
-} DPDK_17.11;
+
+	local: *;
+};
diff --git a/drivers/net/dpaa2/rte_pmd_dpaa2_version.map b/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
index d1b4cdb232..f2bb793319 100644
--- a/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
+++ b/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
@@ -1,15 +1,11 @@
-DPDK_17.05 {
-
-	local: *;
-};
-
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa2_eth_eventq_attach;
 	dpaa2_eth_eventq_detach;
 
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
@@ -17,4 +13,4 @@ EXPERIMENTAL {
 	rte_pmd_dpaa2_mux_flow_create;
 	rte_pmd_dpaa2_set_custom_hash;
 	rte_pmd_dpaa2_set_timestamp;
-} DPDK_17.11;
+};
diff --git a/drivers/net/e1000/rte_pmd_e1000_version.map b/drivers/net/e1000/rte_pmd_e1000_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/e1000/rte_pmd_e1000_version.map
+++ b/drivers/net/e1000/rte_pmd_e1000_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ena/rte_pmd_ena_version.map b/drivers/net/ena/rte_pmd_ena_version.map
index 349c6e1c22..f9f17e4f6e 100644
--- a/drivers/net/ena/rte_pmd_ena_version.map
+++ b/drivers/net/ena/rte_pmd_ena_version.map
@@ -1,4 +1,3 @@
-DPDK_16.04 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/enetc/rte_pmd_enetc_version.map b/drivers/net/enetc/rte_pmd_enetc_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/net/enetc/rte_pmd_enetc_version.map
+++ b/drivers/net/enetc/rte_pmd_enetc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/enic/rte_pmd_enic_version.map b/drivers/net/enic/rte_pmd_enic_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/enic/rte_pmd_enic_version.map
+++ b/drivers/net/enic/rte_pmd_enic_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/failsafe/rte_pmd_failsafe_version.map b/drivers/net/failsafe/rte_pmd_failsafe_version.map
index b6d2840be4..f9f17e4f6e 100644
--- a/drivers/net/failsafe/rte_pmd_failsafe_version.map
+++ b/drivers/net/failsafe/rte_pmd_failsafe_version.map
@@ -1,4 +1,3 @@
-DPDK_17.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/fm10k/rte_pmd_fm10k_version.map b/drivers/net/fm10k/rte_pmd_fm10k_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/fm10k/rte_pmd_fm10k_version.map
+++ b/drivers/net/fm10k/rte_pmd_fm10k_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/hinic/rte_pmd_hinic_version.map b/drivers/net/hinic/rte_pmd_hinic_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/net/hinic/rte_pmd_hinic_version.map
+++ b/drivers/net/hinic/rte_pmd_hinic_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/hns3/rte_pmd_hns3_version.map b/drivers/net/hns3/rte_pmd_hns3_version.map
index 35e5f2debb..f9f17e4f6e 100644
--- a/drivers/net/hns3/rte_pmd_hns3_version.map
+++ b/drivers/net/hns3/rte_pmd_hns3_version.map
@@ -1,3 +1,3 @@
-DPDK_19.11 {
-	 local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index cccd5768c2..a80e69b93e 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -1,23 +1,34 @@
-DPDK_2.0 {
-
-	local: *;
-};
-
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
+	rte_pmd_i40e_add_vf_mac_addr;
+	rte_pmd_i40e_flow_add_del_packet_template;
+	rte_pmd_i40e_flow_type_mapping_get;
+	rte_pmd_i40e_flow_type_mapping_reset;
+	rte_pmd_i40e_flow_type_mapping_update;
+	rte_pmd_i40e_get_ddp_info;
+	rte_pmd_i40e_get_ddp_list;
 	rte_pmd_i40e_get_vf_stats;
+	rte_pmd_i40e_inset_get;
+	rte_pmd_i40e_inset_set;
 	rte_pmd_i40e_ping_vfs;
+	rte_pmd_i40e_process_ddp_package;
 	rte_pmd_i40e_ptype_mapping_get;
 	rte_pmd_i40e_ptype_mapping_replace;
 	rte_pmd_i40e_ptype_mapping_reset;
 	rte_pmd_i40e_ptype_mapping_update;
+	rte_pmd_i40e_query_vfid_by_mac;
 	rte_pmd_i40e_reset_vf_stats;
+	rte_pmd_i40e_rss_queue_region_conf;
+	rte_pmd_i40e_set_tc_strict_prio;
 	rte_pmd_i40e_set_tx_loopback;
 	rte_pmd_i40e_set_vf_broadcast;
 	rte_pmd_i40e_set_vf_mac_addr;
 	rte_pmd_i40e_set_vf_mac_anti_spoof;
+	rte_pmd_i40e_set_vf_max_bw;
 	rte_pmd_i40e_set_vf_multicast_promisc;
+	rte_pmd_i40e_set_vf_tc_bw_alloc;
+	rte_pmd_i40e_set_vf_tc_max_bw;
 	rte_pmd_i40e_set_vf_unicast_promisc;
 	rte_pmd_i40e_set_vf_vlan_anti_spoof;
 	rte_pmd_i40e_set_vf_vlan_filter;
@@ -25,43 +36,5 @@ DPDK_17.02 {
 	rte_pmd_i40e_set_vf_vlan_stripq;
 	rte_pmd_i40e_set_vf_vlan_tag;
 
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_pmd_i40e_set_tc_strict_prio;
-	rte_pmd_i40e_set_vf_max_bw;
-	rte_pmd_i40e_set_vf_tc_bw_alloc;
-	rte_pmd_i40e_set_vf_tc_max_bw;
-	rte_pmd_i40e_process_ddp_package;
-	rte_pmd_i40e_get_ddp_list;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_pmd_i40e_get_ddp_info;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_pmd_i40e_add_vf_mac_addr;
-	rte_pmd_i40e_flow_add_del_packet_template;
-	rte_pmd_i40e_flow_type_mapping_update;
-	rte_pmd_i40e_flow_type_mapping_get;
-	rte_pmd_i40e_flow_type_mapping_reset;
-	rte_pmd_i40e_query_vfid_by_mac;
-	rte_pmd_i40e_rss_queue_region_conf;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_pmd_i40e_inset_get;
-	rte_pmd_i40e_inset_set;
-} DPDK_17.11;
\ No newline at end of file
+	local: *;
+};
diff --git a/drivers/net/iavf/rte_pmd_iavf_version.map b/drivers/net/iavf/rte_pmd_iavf_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/net/iavf/rte_pmd_iavf_version.map
+++ b/drivers/net/iavf/rte_pmd_iavf_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ice/rte_pmd_ice_version.map b/drivers/net/ice/rte_pmd_ice_version.map
index 0677a1c696..d04b194c13 100644
--- a/drivers/net/ice/rte_pmd_ice_version.map
+++ b/drivers/net/ice/rte_pmd_ice_version.map
@@ -1,5 +1,4 @@
-DPDK_19.02 {
-
+DPDK_20.0 {
 	local: *;
 };
 
diff --git a/drivers/net/ifc/rte_pmd_ifc_version.map b/drivers/net/ifc/rte_pmd_ifc_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/net/ifc/rte_pmd_ifc_version.map
+++ b/drivers/net/ifc/rte_pmd_ifc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map b/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
index fc8c95e919..f9f17e4f6e 100644
--- a/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
+++ b/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
@@ -1,4 +1,3 @@
-DPDK_19.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index c814f96d72..21534dbc3d 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -1,57 +1,39 @@
-DPDK_2.0 {
-
-	local: *;
-};
-
-DPDK_16.11 {
-	global:
-
-	rte_pmd_ixgbe_set_all_queues_drop_en;
-	rte_pmd_ixgbe_set_tx_loopback;
-	rte_pmd_ixgbe_set_vf_mac_addr;
-	rte_pmd_ixgbe_set_vf_mac_anti_spoof;
-	rte_pmd_ixgbe_set_vf_split_drop_en;
-	rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
-	rte_pmd_ixgbe_set_vf_vlan_insert;
-	rte_pmd_ixgbe_set_vf_vlan_stripq;
-} DPDK_2.0;
-
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
+	rte_pmd_ixgbe_bypass_event_show;
+	rte_pmd_ixgbe_bypass_event_store;
+	rte_pmd_ixgbe_bypass_init;
+	rte_pmd_ixgbe_bypass_state_set;
+	rte_pmd_ixgbe_bypass_state_show;
+	rte_pmd_ixgbe_bypass_ver_show;
+	rte_pmd_ixgbe_bypass_wd_reset;
+	rte_pmd_ixgbe_bypass_wd_timeout_show;
+	rte_pmd_ixgbe_bypass_wd_timeout_store;
 	rte_pmd_ixgbe_macsec_config_rxsc;
 	rte_pmd_ixgbe_macsec_config_txsc;
 	rte_pmd_ixgbe_macsec_disable;
 	rte_pmd_ixgbe_macsec_enable;
 	rte_pmd_ixgbe_macsec_select_rxsa;
 	rte_pmd_ixgbe_macsec_select_txsa;
+	rte_pmd_ixgbe_ping_vf;
+	rte_pmd_ixgbe_set_all_queues_drop_en;
+	rte_pmd_ixgbe_set_tc_bw_alloc;
+	rte_pmd_ixgbe_set_tx_loopback;
+	rte_pmd_ixgbe_set_vf_mac_addr;
+	rte_pmd_ixgbe_set_vf_mac_anti_spoof;
 	rte_pmd_ixgbe_set_vf_rate_limit;
 	rte_pmd_ixgbe_set_vf_rx;
 	rte_pmd_ixgbe_set_vf_rxmode;
+	rte_pmd_ixgbe_set_vf_split_drop_en;
 	rte_pmd_ixgbe_set_vf_tx;
+	rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
 	rte_pmd_ixgbe_set_vf_vlan_filter;
-} DPDK_16.11;
+	rte_pmd_ixgbe_set_vf_vlan_insert;
+	rte_pmd_ixgbe_set_vf_vlan_stripq;
 
-DPDK_17.05 {
-	global:
-
-	rte_pmd_ixgbe_ping_vf;
-	rte_pmd_ixgbe_set_tc_bw_alloc;
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_pmd_ixgbe_bypass_event_show;
-	rte_pmd_ixgbe_bypass_event_store;
-	rte_pmd_ixgbe_bypass_init;
-	rte_pmd_ixgbe_bypass_state_set;
-	rte_pmd_ixgbe_bypass_state_show;
-	rte_pmd_ixgbe_bypass_ver_show;
-	rte_pmd_ixgbe_bypass_wd_reset;
-	rte_pmd_ixgbe_bypass_wd_timeout_show;
-	rte_pmd_ixgbe_bypass_wd_timeout_store;
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/drivers/net/kni/rte_pmd_kni_version.map b/drivers/net/kni/rte_pmd_kni_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/net/kni/rte_pmd_kni_version.map
+++ b/drivers/net/kni/rte_pmd_kni_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/liquidio/rte_pmd_liquidio_version.map b/drivers/net/liquidio/rte_pmd_liquidio_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/net/liquidio/rte_pmd_liquidio_version.map
+++ b/drivers/net/liquidio/rte_pmd_liquidio_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/memif/rte_pmd_memif_version.map b/drivers/net/memif/rte_pmd_memif_version.map
index 8861484fb3..f9f17e4f6e 100644
--- a/drivers/net/memif/rte_pmd_memif_version.map
+++ b/drivers/net/memif/rte_pmd_memif_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
-        local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/mlx4/rte_pmd_mlx4_version.map b/drivers/net/mlx4/rte_pmd_mlx4_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/mlx4/rte_pmd_mlx4_version.map
+++ b/drivers/net/mlx4/rte_pmd_mlx4_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mlx5/rte_pmd_mlx5_version.map b/drivers/net/mlx5/rte_pmd_mlx5_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/mlx5/rte_pmd_mlx5_version.map
+++ b/drivers/net/mlx5/rte_pmd_mlx5_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mvneta/rte_pmd_mvneta_version.map b/drivers/net/mvneta/rte_pmd_mvneta_version.map
index 24bd5cdb35..f9f17e4f6e 100644
--- a/drivers/net/mvneta/rte_pmd_mvneta_version.map
+++ b/drivers/net/mvneta/rte_pmd_mvneta_version.map
@@ -1,3 +1,3 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mvpp2/rte_pmd_mvpp2_version.map b/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
+++ b/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/netvsc/rte_pmd_netvsc_version.map b/drivers/net/netvsc/rte_pmd_netvsc_version.map
index d534019a6b..f9f17e4f6e 100644
--- a/drivers/net/netvsc/rte_pmd_netvsc_version.map
+++ b/drivers/net/netvsc/rte_pmd_netvsc_version.map
@@ -1,5 +1,3 @@
-/* SPDX-License-Identifier: BSD-3-Clause */
-
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/nfb/rte_pmd_nfb_version.map b/drivers/net/nfb/rte_pmd_nfb_version.map
index fc8c95e919..f9f17e4f6e 100644
--- a/drivers/net/nfb/rte_pmd_nfb_version.map
+++ b/drivers/net/nfb/rte_pmd_nfb_version.map
@@ -1,4 +1,3 @@
-DPDK_19.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/nfp/rte_pmd_nfp_version.map b/drivers/net/nfp/rte_pmd_nfp_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/nfp/rte_pmd_nfp_version.map
+++ b/drivers/net/nfp/rte_pmd_nfp_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/null/rte_pmd_null_version.map b/drivers/net/null/rte_pmd_null_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/null/rte_pmd_null_version.map
+++ b/drivers/net/null/rte_pmd_null_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/octeontx/rte_pmd_octeontx_version.map b/drivers/net/octeontx/rte_pmd_octeontx_version.map
index a3161b14d0..f7cae02fac 100644
--- a/drivers/net/octeontx/rte_pmd_octeontx_version.map
+++ b/drivers/net/octeontx/rte_pmd_octeontx_version.map
@@ -1,11 +1,7 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_18.02 {
+DPDK_20.0 {
 	global:
 
 	rte_octeontx_pchan_map;
 
-} DPDK_17.11;
+	local: *;
+};
diff --git a/drivers/net/octeontx2/rte_pmd_octeontx2_version.map b/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
+++ b/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/pcap/rte_pmd_pcap_version.map b/drivers/net/pcap/rte_pmd_pcap_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/pcap/rte_pmd_pcap_version.map
+++ b/drivers/net/pcap/rte_pmd_pcap_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/pfe/rte_pmd_pfe_version.map b/drivers/net/pfe/rte_pmd_pfe_version.map
index b7b7c91683..f9f17e4f6e 100644
--- a/drivers/net/pfe/rte_pmd_pfe_version.map
+++ b/drivers/net/pfe/rte_pmd_pfe_version.map
@@ -1,4 +1,3 @@
-DPDK_19.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/qede/rte_pmd_qede_version.map b/drivers/net/qede/rte_pmd_qede_version.map
index 349c6e1c22..f9f17e4f6e 100644
--- a/drivers/net/qede/rte_pmd_qede_version.map
+++ b/drivers/net/qede/rte_pmd_qede_version.map
@@ -1,4 +1,3 @@
-DPDK_16.04 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ring/rte_pmd_ring_version.map b/drivers/net/ring/rte_pmd_ring_version.map
index 1f785d9409..ebb6be2733 100644
--- a/drivers/net/ring/rte_pmd_ring_version.map
+++ b/drivers/net/ring/rte_pmd_ring_version.map
@@ -1,14 +1,8 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_eth_from_ring;
 	rte_eth_from_rings;
 
 	local: *;
 };
-
-DPDK_2.2 {
-	global:
-
-	rte_eth_from_ring;
-
-} DPDK_2.0;
diff --git a/drivers/net/sfc/rte_pmd_sfc_version.map b/drivers/net/sfc/rte_pmd_sfc_version.map
index 31eca32ebe..f9f17e4f6e 100644
--- a/drivers/net/sfc/rte_pmd_sfc_version.map
+++ b/drivers/net/sfc/rte_pmd_sfc_version.map
@@ -1,4 +1,3 @@
-DPDK_17.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/softnic/rte_pmd_softnic_version.map b/drivers/net/softnic/rte_pmd_softnic_version.map
index bc44b06f98..50f113d5a2 100644
--- a/drivers/net/softnic/rte_pmd_softnic_version.map
+++ b/drivers/net/softnic/rte_pmd_softnic_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_pmd_softnic_run;
diff --git a/drivers/net/szedata2/rte_pmd_szedata2_version.map b/drivers/net/szedata2/rte_pmd_szedata2_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/szedata2/rte_pmd_szedata2_version.map
+++ b/drivers/net/szedata2/rte_pmd_szedata2_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/tap/rte_pmd_tap_version.map b/drivers/net/tap/rte_pmd_tap_version.map
index 31eca32ebe..f9f17e4f6e 100644
--- a/drivers/net/tap/rte_pmd_tap_version.map
+++ b/drivers/net/tap/rte_pmd_tap_version.map
@@ -1,4 +1,3 @@
-DPDK_17.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/thunderx/rte_pmd_thunderx_version.map b/drivers/net/thunderx/rte_pmd_thunderx_version.map
index 1901bcb3b3..f9f17e4f6e 100644
--- a/drivers/net/thunderx/rte_pmd_thunderx_version.map
+++ b/drivers/net/thunderx/rte_pmd_thunderx_version.map
@@ -1,4 +1,3 @@
-DPDK_16.07 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map b/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
+++ b/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vhost/rte_pmd_vhost_version.map b/drivers/net/vhost/rte_pmd_vhost_version.map
index 695db85749..16b591ccc4 100644
--- a/drivers/net/vhost/rte_pmd_vhost_version.map
+++ b/drivers/net/vhost/rte_pmd_vhost_version.map
@@ -1,13 +1,8 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	global:
 
 	rte_eth_vhost_get_queue_event;
-
-	local: *;
-};
-
-DPDK_16.11 {
-	global:
-
 	rte_eth_vhost_get_vid_from_port_id;
+
+	local: *;
 };
diff --git a/drivers/net/virtio/rte_pmd_virtio_version.map b/drivers/net/virtio/rte_pmd_virtio_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/virtio/rte_pmd_virtio_version.map
+++ b/drivers/net/virtio/rte_pmd_virtio_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map b/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
+++ b/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map b/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
+++ b/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map b/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
index d16a136fc8..ca6a0d7626 100644
--- a/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
+++ b/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
@@ -1,4 +1,4 @@
-DPDK_19.05 {
+DPDK_20.0 {
 	global:
 
 	rte_qdma_attr_get;
@@ -9,9 +9,9 @@ DPDK_19.05 {
 	rte_qdma_start;
 	rte_qdma_stop;
 	rte_qdma_vq_create;
-	rte_qdma_vq_destroy;
 	rte_qdma_vq_dequeue;
 	rte_qdma_vq_dequeue_multi;
+	rte_qdma_vq_destroy;
 	rte_qdma_vq_enqueue;
 	rte_qdma_vq_enqueue_multi;
 	rte_qdma_vq_stats;
diff --git a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
+++ b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/ioat/rte_rawdev_ioat_version.map b/drivers/raw/ioat/rte_rawdev_ioat_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/raw/ioat/rte_rawdev_ioat_version.map
+++ b/drivers/raw/ioat/rte_rawdev_ioat_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/ntb/rte_rawdev_ntb_version.map b/drivers/raw/ntb/rte_rawdev_ntb_version.map
index 8861484fb3..f9f17e4f6e 100644
--- a/drivers/raw/ntb/rte_rawdev_ntb_version.map
+++ b/drivers/raw/ntb/rte_rawdev_ntb_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
-        local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map b/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
+++ b/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/skeleton/rte_rawdev_skeleton_version.map b/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
+++ b/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
index b09370a104..c3daca8115 100644
--- a/lib/librte_acl/rte_acl_version.map
+++ b/lib/librte_acl/rte_acl_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_acl_add_rules;
diff --git a/lib/librte_bitratestats/rte_bitratestats_version.map b/lib/librte_bitratestats/rte_bitratestats_version.map
index fe7454452d..88fc2912db 100644
--- a/lib/librte_bitratestats/rte_bitratestats_version.map
+++ b/lib/librte_bitratestats/rte_bitratestats_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_stats_bitrate_calc;
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
index a0a11cea8d..906eee96bf 100644
--- a/lib/librte_cfgfile/rte_cfgfile_version.map
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -1,40 +1,22 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_cfgfile_add_entry;
+	rte_cfgfile_add_section;
 	rte_cfgfile_close;
+	rte_cfgfile_create;
 	rte_cfgfile_get_entry;
 	rte_cfgfile_has_entry;
 	rte_cfgfile_has_section;
 	rte_cfgfile_load;
+	rte_cfgfile_load_with_params;
 	rte_cfgfile_num_sections;
+	rte_cfgfile_save;
 	rte_cfgfile_section_entries;
+	rte_cfgfile_section_entries_by_index;
 	rte_cfgfile_section_num_entries;
 	rte_cfgfile_sections;
+	rte_cfgfile_set_entry;
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_cfgfile_section_entries_by_index;
-
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_cfgfile_load_with_params;
-
-} DPDK_16.04;
-
-DPDK_17.11 {
-	global:
-
-	rte_cfgfile_add_entry;
-	rte_cfgfile_add_section;
-	rte_cfgfile_create;
-	rte_cfgfile_save;
-	rte_cfgfile_set_entry;
-
-} DPDK_17.05;
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
index 04bcb387f2..95fce812ff 100644
--- a/lib/librte_cmdline/rte_cmdline_version.map
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	cirbuf_add_buf_head;
@@ -40,6 +40,7 @@ DPDK_2.0 {
 	cmdline_parse_num;
 	cmdline_parse_portlist;
 	cmdline_parse_string;
+	cmdline_poll;
 	cmdline_printf;
 	cmdline_quit;
 	cmdline_set_prompt;
@@ -68,10 +69,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_2.1 {
-	global:
-
-	cmdline_poll;
-
-} DPDK_2.0;
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 3deb265ac2..1dd1e259a0 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -1,92 +1,62 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	global:
 
-	rte_cryptodevs;
+	rte_crypto_aead_algorithm_strings;
+	rte_crypto_aead_operation_strings;
+	rte_crypto_auth_algorithm_strings;
+	rte_crypto_auth_operation_strings;
+	rte_crypto_cipher_algorithm_strings;
+	rte_crypto_cipher_operation_strings;
+	rte_crypto_op_pool_create;
+	rte_cryptodev_allocate_driver;
 	rte_cryptodev_callback_register;
 	rte_cryptodev_callback_unregister;
 	rte_cryptodev_close;
-	rte_cryptodev_count;
 	rte_cryptodev_configure;
+	rte_cryptodev_count;
+	rte_cryptodev_device_count_by_driver;
+	rte_cryptodev_devices_get;
+	rte_cryptodev_driver_id_get;
+	rte_cryptodev_driver_name_get;
+	rte_cryptodev_get_aead_algo_enum;
+	rte_cryptodev_get_auth_algo_enum;
+	rte_cryptodev_get_cipher_algo_enum;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
+	rte_cryptodev_get_sec_ctx;
 	rte_cryptodev_info_get;
+	rte_cryptodev_name_get;
 	rte_cryptodev_pmd_allocate;
 	rte_cryptodev_pmd_callback_process;
+	rte_cryptodev_pmd_create;
+	rte_cryptodev_pmd_create_dev_name;
+	rte_cryptodev_pmd_destroy;
+	rte_cryptodev_pmd_get_dev;
+	rte_cryptodev_pmd_get_named_dev;
+	rte_cryptodev_pmd_is_valid_dev;
+	rte_cryptodev_pmd_parse_input_args;
 	rte_cryptodev_pmd_release_device;
-	rte_cryptodev_sym_session_create;
-	rte_cryptodev_sym_session_free;
+	rte_cryptodev_queue_pair_count;
+	rte_cryptodev_queue_pair_setup;
 	rte_cryptodev_socket_id;
 	rte_cryptodev_start;
 	rte_cryptodev_stats_get;
 	rte_cryptodev_stats_reset;
 	rte_cryptodev_stop;
-	rte_cryptodev_queue_pair_count;
-	rte_cryptodev_queue_pair_setup;
-	rte_crypto_op_pool_create;
-
-	local: *;
-};
-
-DPDK_17.02 {
-	global:
-
-	rte_cryptodev_devices_get;
-	rte_cryptodev_pmd_create_dev_name;
-	rte_cryptodev_pmd_get_dev;
-	rte_cryptodev_pmd_get_named_dev;
-	rte_cryptodev_pmd_is_valid_dev;
+	rte_cryptodev_sym_capability_check_aead;
 	rte_cryptodev_sym_capability_check_auth;
 	rte_cryptodev_sym_capability_check_cipher;
 	rte_cryptodev_sym_capability_get;
-	rte_crypto_auth_algorithm_strings;
-	rte_crypto_auth_operation_strings;
-	rte_crypto_cipher_algorithm_strings;
-	rte_crypto_cipher_operation_strings;
-
-} DPDK_16.04;
-
-DPDK_17.05 {
-	global:
-
-	rte_cryptodev_get_auth_algo_enum;
-	rte_cryptodev_get_cipher_algo_enum;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_cryptodev_allocate_driver;
-	rte_cryptodev_device_count_by_driver;
-	rte_cryptodev_driver_id_get;
-	rte_cryptodev_driver_name_get;
-	rte_cryptodev_get_aead_algo_enum;
-	rte_cryptodev_sym_capability_check_aead;
-	rte_cryptodev_sym_session_init;
-	rte_cryptodev_sym_session_clear;
-	rte_crypto_aead_algorithm_strings;
-	rte_crypto_aead_operation_strings;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_cryptodev_get_sec_ctx;
-	rte_cryptodev_name_get;
-	rte_cryptodev_pmd_create;
-	rte_cryptodev_pmd_destroy;
-	rte_cryptodev_pmd_parse_input_args;
-
-} DPDK_17.08;
-
-DPDK_18.05 {
-	global:
-
 	rte_cryptodev_sym_get_header_session_size;
 	rte_cryptodev_sym_get_private_session_size;
+	rte_cryptodev_sym_session_clear;
+	rte_cryptodev_sym_session_create;
+	rte_cryptodev_sym_session_free;
+	rte_cryptodev_sym_session_init;
+	rte_cryptodevs;
 
-} DPDK_17.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
index 00e26b4804..1b7c643005 100644
--- a/lib/librte_distributor/rte_distributor_version.map
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_distributor_clear_returns;
@@ -10,4 +10,6 @@ DPDK_17.05 {
 	rte_distributor_request_pkt;
 	rte_distributor_return_pkt;
 	rte_distributor_returned_pkts;
+
+	local: *;
 };
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index f1982f2f73..8663517df3 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	__rte_panic;
@@ -6,44 +6,113 @@ DPDK_2.0 {
 	eal_timer_source;
 	per_lcore__lcore_id;
 	per_lcore__rte_errno;
+	rte_bus_dump;
+	rte_bus_find;
+	rte_bus_find_by_device;
+	rte_bus_find_by_name;
+	rte_bus_get_iommu_class;
+	rte_bus_probe;
+	rte_bus_register;
+	rte_bus_scan;
+	rte_bus_unregister;
 	rte_calloc;
 	rte_calloc_socket;
 	rte_cpu_get_flag_enabled;
+	rte_cpu_get_flag_name;
+	rte_cpu_is_supported;
+	rte_ctrl_thread_create;
 	rte_cycles_vmware_tsc_map;
 	rte_delay_us;
+	rte_delay_us_block;
+	rte_delay_us_callback_register;
+	rte_dev_is_probed;
+	rte_dev_probe;
+	rte_dev_remove;
+	rte_devargs_add;
+	rte_devargs_dump;
+	rte_devargs_insert;
+	rte_devargs_next;
+	rte_devargs_parse;
+	rte_devargs_parsef;
+	rte_devargs_remove;
+	rte_devargs_type_count;
 	rte_dump_physmem_layout;
 	rte_dump_registers;
 	rte_dump_stack;
 	rte_dump_tailq;
 	rte_eal_alarm_cancel;
 	rte_eal_alarm_set;
+	rte_eal_cleanup;
+	rte_eal_create_uio_dev;
 	rte_eal_get_lcore_state;
 	rte_eal_get_physmem_size;
+	rte_eal_get_runtime_dir;
 	rte_eal_has_hugepages;
+	rte_eal_has_pci;
+	rte_eal_hotplug_add;
+	rte_eal_hotplug_remove;
 	rte_eal_hpet_init;
 	rte_eal_init;
 	rte_eal_iopl_init;
+	rte_eal_iova_mode;
 	rte_eal_lcore_role;
+	rte_eal_mbuf_user_pool_ops;
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
+	rte_eal_primary_proc_alive;
 	rte_eal_process_type;
 	rte_eal_remote_launch;
 	rte_eal_tailq_lookup;
 	rte_eal_tailq_register;
+	rte_eal_using_phys_addrs;
+	rte_eal_vfio_intr_mode;
 	rte_eal_wait_lcore;
+	rte_epoll_ctl;
+	rte_epoll_wait;
 	rte_exit;
 	rte_free;
 	rte_get_hpet_cycles;
 	rte_get_hpet_hz;
+	rte_get_master_lcore;
+	rte_get_next_lcore;
 	rte_get_tsc_hz;
 	rte_hexdump;
+	rte_hypervisor_get;
+	rte_hypervisor_get_name;
+	rte_intr_allow_others;
 	rte_intr_callback_register;
 	rte_intr_callback_unregister;
+	rte_intr_cap_multiple;
 	rte_intr_disable;
+	rte_intr_dp_is_en;
+	rte_intr_efd_disable;
+	rte_intr_efd_enable;
 	rte_intr_enable;
+	rte_intr_free_epoll_fd;
+	rte_intr_rx_ctl;
+	rte_intr_tls_epfd;
+	rte_keepalive_create;
+	rte_keepalive_dispatch_pings;
+	rte_keepalive_mark_alive;
+	rte_keepalive_mark_sleep;
+	rte_keepalive_register_core;
+	rte_keepalive_register_relay_callback;
+	rte_lcore_count;
+	rte_lcore_has_role;
+	rte_lcore_index;
+	rte_lcore_is_enabled;
+	rte_lcore_to_socket_id;
 	rte_log;
 	rte_log_cur_msg_loglevel;
 	rte_log_cur_msg_logtype;
+	rte_log_dump;
+	rte_log_get_global_level;
+	rte_log_get_level;
+	rte_log_register;
+	rte_log_set_global_level;
+	rte_log_set_level;
+	rte_log_set_level_pattern;
+	rte_log_set_level_regexp;
 	rte_logs;
 	rte_malloc;
 	rte_malloc_dump_stats;
@@ -51,155 +120,38 @@ DPDK_2.0 {
 	rte_malloc_set_limit;
 	rte_malloc_socket;
 	rte_malloc_validate;
+	rte_malloc_virt2iova;
+	rte_mcfg_mem_read_lock;
+	rte_mcfg_mem_read_unlock;
+	rte_mcfg_mem_write_lock;
+	rte_mcfg_mem_write_unlock;
+	rte_mcfg_mempool_read_lock;
+	rte_mcfg_mempool_read_unlock;
+	rte_mcfg_mempool_write_lock;
+	rte_mcfg_mempool_write_unlock;
+	rte_mcfg_tailq_read_lock;
+	rte_mcfg_tailq_read_unlock;
+	rte_mcfg_tailq_write_lock;
+	rte_mcfg_tailq_write_unlock;
 	rte_mem_lock_page;
+	rte_mem_virt2iova;
 	rte_mem_virt2phy;
 	rte_memdump;
 	rte_memory_get_nchannel;
 	rte_memory_get_nrank;
 	rte_memzone_dump;
+	rte_memzone_free;
 	rte_memzone_lookup;
 	rte_memzone_reserve;
 	rte_memzone_reserve_aligned;
 	rte_memzone_reserve_bounded;
 	rte_memzone_walk;
 	rte_openlog_stream;
+	rte_rand;
 	rte_realloc;
-	rte_set_application_usage_hook;
-	rte_socket_id;
-	rte_strerror;
-	rte_strsplit;
-	rte_sys_gettid;
-	rte_thread_get_affinity;
-	rte_thread_set_affinity;
-	rte_vlog;
-	rte_zmalloc;
-	rte_zmalloc_socket;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_epoll_ctl;
-	rte_epoll_wait;
-	rte_intr_allow_others;
-	rte_intr_dp_is_en;
-	rte_intr_efd_disable;
-	rte_intr_efd_enable;
-	rte_intr_rx_ctl;
-	rte_intr_tls_epfd;
-	rte_memzone_free;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
-	rte_intr_cap_multiple;
-	rte_keepalive_create;
-	rte_keepalive_dispatch_pings;
-	rte_keepalive_mark_alive;
-	rte_keepalive_register_core;
-
-} DPDK_2.1;
-
-DPDK_16.04 {
-	global:
-
-	rte_cpu_get_flag_name;
-	rte_eal_primary_proc_alive;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
-	global:
-
-	rte_keepalive_mark_sleep;
-	rte_keepalive_register_relay_callback;
-	rte_rtm_supported;
-	rte_thread_setname;
-
-} DPDK_16.04;
-
-DPDK_16.11 {
-	global:
-
-	rte_delay_us_block;
-	rte_delay_us_callback_register;
-
-} DPDK_16.07;
-
-DPDK_17.02 {
-	global:
-
-	rte_bus_dump;
-	rte_bus_probe;
-	rte_bus_register;
-	rte_bus_scan;
-	rte_bus_unregister;
-
-} DPDK_16.11;
-
-DPDK_17.05 {
-	global:
-
-	rte_cpu_is_supported;
-	rte_intr_free_epoll_fd;
-	rte_log_dump;
-	rte_log_get_global_level;
-	rte_log_register;
-	rte_log_set_global_level;
-	rte_log_set_level;
-	rte_log_set_level_regexp;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_bus_find;
-	rte_bus_find_by_device;
-	rte_bus_find_by_name;
-	rte_log_get_level;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_eal_create_uio_dev;
-	rte_bus_get_iommu_class;
-	rte_eal_has_pci;
-	rte_eal_iova_mode;
-	rte_eal_using_phys_addrs;
-	rte_eal_vfio_intr_mode;
-	rte_lcore_has_role;
-	rte_malloc_virt2iova;
-	rte_mem_virt2iova;
-	rte_vfio_enable;
-	rte_vfio_is_enabled;
-	rte_vfio_noiommu_is_enabled;
-	rte_vfio_release_device;
-	rte_vfio_setup_device;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_hypervisor_get;
-	rte_hypervisor_get_name;
-	rte_vfio_clear_group;
 	rte_reciprocal_value;
 	rte_reciprocal_value_u64;
-
-}  DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_log_set_level_pattern;
+	rte_rtm_supported;
 	rte_service_attr_get;
 	rte_service_attr_reset_all;
 	rte_service_component_register;
@@ -212,6 +164,8 @@ DPDK_18.05 {
 	rte_service_get_count;
 	rte_service_get_name;
 	rte_service_lcore_add;
+	rte_service_lcore_attr_get;
+	rte_service_lcore_attr_reset_all;
 	rte_service_lcore_count;
 	rte_service_lcore_count_services;
 	rte_service_lcore_del;
@@ -221,6 +175,7 @@ DPDK_18.05 {
 	rte_service_lcore_stop;
 	rte_service_map_lcore_get;
 	rte_service_map_lcore_set;
+	rte_service_may_be_active;
 	rte_service_probe_capability;
 	rte_service_run_iter_on_app_lcore;
 	rte_service_runstate_get;
@@ -228,94 +183,43 @@ DPDK_18.05 {
 	rte_service_set_runstate_mapped_check;
 	rte_service_set_stats_enable;
 	rte_service_start_with_defaults;
-
-} DPDK_18.02;
-
-DPDK_18.08 {
-	global:
-
-	rte_eal_mbuf_user_pool_ops;
+	rte_set_application_usage_hook;
+	rte_socket_count;
+	rte_socket_id;
+	rte_socket_id_by_idx;
+	rte_srand;
+	rte_strerror;
+	rte_strscpy;
+	rte_strsplit;
+	rte_sys_gettid;
+	rte_thread_get_affinity;
+	rte_thread_set_affinity;
+	rte_thread_setname;
 	rte_uuid_compare;
 	rte_uuid_is_null;
 	rte_uuid_parse;
 	rte_uuid_unparse;
+	rte_vfio_clear_group;
 	rte_vfio_container_create;
 	rte_vfio_container_destroy;
 	rte_vfio_container_dma_map;
 	rte_vfio_container_dma_unmap;
 	rte_vfio_container_group_bind;
 	rte_vfio_container_group_unbind;
+	rte_vfio_enable;
 	rte_vfio_get_container_fd;
 	rte_vfio_get_group_fd;
 	rte_vfio_get_group_num;
-
-} DPDK_18.05;
-
-DPDK_18.11 {
-	global:
-
-	rte_dev_probe;
-	rte_dev_remove;
-	rte_eal_get_runtime_dir;
-	rte_eal_hotplug_add;
-	rte_eal_hotplug_remove;
-	rte_strscpy;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	rte_ctrl_thread_create;
-	rte_dev_is_probed;
-	rte_devargs_add;
-	rte_devargs_dump;
-	rte_devargs_insert;
-	rte_devargs_next;
-	rte_devargs_parse;
-	rte_devargs_parsef;
-	rte_devargs_remove;
-	rte_devargs_type_count;
-	rte_eal_cleanup;
-	rte_socket_count;
-	rte_socket_id_by_idx;
-
-} DPDK_18.11;
-
-DPDK_19.08 {
-	global:
-
-	rte_lcore_index;
-	rte_lcore_to_socket_id;
-	rte_mcfg_mem_read_lock;
-	rte_mcfg_mem_read_unlock;
-	rte_mcfg_mem_write_lock;
-	rte_mcfg_mem_write_unlock;
-	rte_mcfg_mempool_read_lock;
-	rte_mcfg_mempool_read_unlock;
-	rte_mcfg_mempool_write_lock;
-	rte_mcfg_mempool_write_unlock;
-	rte_mcfg_tailq_read_lock;
-	rte_mcfg_tailq_read_unlock;
-	rte_mcfg_tailq_write_lock;
-	rte_mcfg_tailq_write_unlock;
-	rte_rand;
-	rte_service_lcore_attr_get;
-	rte_service_lcore_attr_reset_all;
-	rte_service_may_be_active;
-	rte_srand;
-
-} DPDK_19.05;
-
-DPDK_19.11 {
-	global:
-
-	rte_get_master_lcore;
-	rte_get_next_lcore;
-	rte_lcore_count;
-	rte_lcore_is_enabled;
-
-} DPDK_19.08;
+	rte_vfio_is_enabled;
+	rte_vfio_noiommu_is_enabled;
+	rte_vfio_release_device;
+	rte_vfio_setup_device;
+	rte_vlog;
+	rte_zmalloc;
+	rte_zmalloc_socket;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_efd/rte_efd_version.map b/lib/librte_efd/rte_efd_version.map
index ae60a64178..e010eecfe4 100644
--- a/lib/librte_efd/rte_efd_version.map
+++ b/lib/librte_efd/rte_efd_version.map
@@ -1,4 +1,4 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
 	rte_efd_create;
diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map
index ccfbeae23f..a7dacf2cf2 100644
--- a/lib/librte_ethdev/rte_ethdev_version.map
+++ b/lib/librte_ethdev/rte_ethdev_version.map
@@ -1,34 +1,52 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	global:
 
+	_rte_eth_dev_callback_process;
+	_rte_eth_dev_reset;
+	rte_eth_add_first_rx_callback;
 	rte_eth_add_rx_callback;
 	rte_eth_add_tx_callback;
 	rte_eth_allmulticast_disable;
 	rte_eth_allmulticast_enable;
 	rte_eth_allmulticast_get;
+	rte_eth_dev_adjust_nb_rx_tx_desc;
 	rte_eth_dev_allocate;
 	rte_eth_dev_allocated;
+	rte_eth_dev_attach_secondary;
 	rte_eth_dev_callback_register;
 	rte_eth_dev_callback_unregister;
 	rte_eth_dev_close;
 	rte_eth_dev_configure;
+	rte_eth_dev_count_avail;
+	rte_eth_dev_count_total;
 	rte_eth_dev_default_mac_addr_set;
+	rte_eth_dev_filter_ctrl;
 	rte_eth_dev_filter_supported;
 	rte_eth_dev_flow_ctrl_get;
 	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_fw_version_get;
 	rte_eth_dev_get_dcb_info;
 	rte_eth_dev_get_eeprom;
 	rte_eth_dev_get_eeprom_length;
 	rte_eth_dev_get_mtu;
+	rte_eth_dev_get_name_by_port;
+	rte_eth_dev_get_port_by_name;
 	rte_eth_dev_get_reg_info;
+	rte_eth_dev_get_sec_ctx;
+	rte_eth_dev_get_supported_ptypes;
 	rte_eth_dev_get_vlan_offload;
-	rte_eth_devices;
 	rte_eth_dev_info_get;
 	rte_eth_dev_is_valid_port;
+	rte_eth_dev_l2_tunnel_eth_type_conf;
+	rte_eth_dev_l2_tunnel_offload_set;
+	rte_eth_dev_logtype;
 	rte_eth_dev_mac_addr_add;
 	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_pool_ops_supported;
 	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_probing_finish;
 	rte_eth_dev_release_port;
+	rte_eth_dev_reset;
 	rte_eth_dev_rss_hash_conf_get;
 	rte_eth_dev_rss_hash_update;
 	rte_eth_dev_rss_reta_query;
@@ -37,6 +55,7 @@ DPDK_2.2 {
 	rte_eth_dev_rx_intr_ctl_q;
 	rte_eth_dev_rx_intr_disable;
 	rte_eth_dev_rx_intr_enable;
+	rte_eth_dev_rx_offload_name;
 	rte_eth_dev_rx_queue_start;
 	rte_eth_dev_rx_queue_stop;
 	rte_eth_dev_set_eeprom;
@@ -46,18 +65,28 @@ DPDK_2.2 {
 	rte_eth_dev_set_mtu;
 	rte_eth_dev_set_rx_queue_stats_mapping;
 	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_vlan_ether_type;
 	rte_eth_dev_set_vlan_offload;
 	rte_eth_dev_set_vlan_pvid;
 	rte_eth_dev_set_vlan_strip_on_queue;
 	rte_eth_dev_socket_id;
 	rte_eth_dev_start;
 	rte_eth_dev_stop;
+	rte_eth_dev_tx_offload_name;
 	rte_eth_dev_tx_queue_start;
 	rte_eth_dev_tx_queue_stop;
 	rte_eth_dev_uc_all_hash_table_set;
 	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_udp_tunnel_port_add;
+	rte_eth_dev_udp_tunnel_port_delete;
 	rte_eth_dev_vlan_filter;
+	rte_eth_devices;
 	rte_eth_dma_zone_reserve;
+	rte_eth_find_next;
+	rte_eth_find_next_owned_by;
+	rte_eth_iterator_cleanup;
+	rte_eth_iterator_init;
+	rte_eth_iterator_next;
 	rte_eth_led_off;
 	rte_eth_led_on;
 	rte_eth_link;
@@ -74,6 +103,7 @@ DPDK_2.2 {
 	rte_eth_rx_queue_info_get;
 	rte_eth_rx_queue_setup;
 	rte_eth_set_queue_rate_limit;
+	rte_eth_speed_bitflag;
 	rte_eth_stats;
 	rte_eth_stats_get;
 	rte_eth_stats_reset;
@@ -84,66 +114,27 @@ DPDK_2.2 {
 	rte_eth_timesync_read_time;
 	rte_eth_timesync_read_tx_timestamp;
 	rte_eth_timesync_write_time;
-	rte_eth_tx_queue_info_get;
-	rte_eth_tx_queue_setup;
-	rte_eth_xstats_get;
-	rte_eth_xstats_reset;
-
-	local: *;
-};
-
-DPDK_16.04 {
-	global:
-
-	rte_eth_dev_get_supported_ptypes;
-	rte_eth_dev_l2_tunnel_eth_type_conf;
-	rte_eth_dev_l2_tunnel_offload_set;
-	rte_eth_dev_set_vlan_ether_type;
-	rte_eth_dev_udp_tunnel_port_add;
-	rte_eth_dev_udp_tunnel_port_delete;
-	rte_eth_speed_bitflag;
 	rte_eth_tx_buffer_count_callback;
 	rte_eth_tx_buffer_drop_callback;
 	rte_eth_tx_buffer_init;
 	rte_eth_tx_buffer_set_err_callback;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
-	global:
-
-	rte_eth_add_first_rx_callback;
-	rte_eth_dev_get_name_by_port;
-	rte_eth_dev_get_port_by_name;
-	rte_eth_xstats_get_names;
-
-} DPDK_16.04;
-
-DPDK_17.02 {
-	global:
-
-	_rte_eth_dev_reset;
-	rte_eth_dev_fw_version_get;
-
-} DPDK_16.07;
-
-DPDK_17.05 {
-	global:
-
-	rte_eth_dev_attach_secondary;
-	rte_eth_find_next;
 	rte_eth_tx_done_cleanup;
+	rte_eth_tx_queue_info_get;
+	rte_eth_tx_queue_setup;
+	rte_eth_xstats_get;
 	rte_eth_xstats_get_by_id;
 	rte_eth_xstats_get_id_by_name;
+	rte_eth_xstats_get_names;
 	rte_eth_xstats_get_names_by_id;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	_rte_eth_dev_callback_process;
-	rte_eth_dev_adjust_nb_rx_tx_desc;
+	rte_eth_xstats_reset;
+	rte_flow_copy;
+	rte_flow_create;
+	rte_flow_destroy;
+	rte_flow_error_set;
+	rte_flow_flush;
+	rte_flow_isolate;
+	rte_flow_query;
+	rte_flow_validate;
 	rte_tm_capabilities_get;
 	rte_tm_get_number_of_leaf_nodes;
 	rte_tm_hierarchy_commit;
@@ -175,65 +166,8 @@ DPDK_17.08 {
 	rte_tm_wred_profile_add;
 	rte_tm_wred_profile_delete;
 
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_eth_dev_get_sec_ctx;
-	rte_eth_dev_pool_ops_supported;
-	rte_eth_dev_reset;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_eth_dev_filter_ctrl;
-
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_eth_dev_count_avail;
-	rte_eth_dev_probing_finish;
-	rte_eth_find_next_owned_by;
-	rte_flow_copy;
-	rte_flow_create;
-	rte_flow_destroy;
-	rte_flow_error_set;
-	rte_flow_flush;
-	rte_flow_isolate;
-	rte_flow_query;
-	rte_flow_validate;
-
-} DPDK_18.02;
-
-DPDK_18.08 {
-	global:
-
-	rte_eth_dev_logtype;
-
-} DPDK_18.05;
-
-DPDK_18.11 {
-	global:
-
-	rte_eth_dev_rx_offload_name;
-	rte_eth_dev_tx_offload_name;
-	rte_eth_iterator_cleanup;
-	rte_eth_iterator_init;
-	rte_eth_iterator_next;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	rte_eth_dev_count_total;
-
-} DPDK_18.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_eventdev/rte_eventdev_version.map b/lib/librte_eventdev/rte_eventdev_version.map
index 76b3021d3a..edfc15282d 100644
--- a/lib/librte_eventdev/rte_eventdev_version.map
+++ b/lib/librte_eventdev/rte_eventdev_version.map
@@ -1,61 +1,38 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
-	rte_eventdevs;
-
+	rte_event_crypto_adapter_caps_get;
+	rte_event_crypto_adapter_create;
+	rte_event_crypto_adapter_create_ext;
+	rte_event_crypto_adapter_event_port_get;
+	rte_event_crypto_adapter_free;
+	rte_event_crypto_adapter_queue_pair_add;
+	rte_event_crypto_adapter_queue_pair_del;
+	rte_event_crypto_adapter_service_id_get;
+	rte_event_crypto_adapter_start;
+	rte_event_crypto_adapter_stats_get;
+	rte_event_crypto_adapter_stats_reset;
+	rte_event_crypto_adapter_stop;
+	rte_event_dequeue_timeout_ticks;
+	rte_event_dev_attr_get;
+	rte_event_dev_close;
+	rte_event_dev_configure;
 	rte_event_dev_count;
+	rte_event_dev_dump;
 	rte_event_dev_get_dev_id;
-	rte_event_dev_socket_id;
 	rte_event_dev_info_get;
-	rte_event_dev_configure;
+	rte_event_dev_selftest;
+	rte_event_dev_service_id_get;
+	rte_event_dev_socket_id;
 	rte_event_dev_start;
 	rte_event_dev_stop;
-	rte_event_dev_close;
-	rte_event_dev_dump;
+	rte_event_dev_stop_flush_callback_register;
 	rte_event_dev_xstats_by_name_get;
 	rte_event_dev_xstats_get;
 	rte_event_dev_xstats_names_get;
 	rte_event_dev_xstats_reset;
-
-	rte_event_port_default_conf_get;
-	rte_event_port_setup;
-	rte_event_port_link;
-	rte_event_port_unlink;
-	rte_event_port_links_get;
-
-	rte_event_queue_default_conf_get;
-	rte_event_queue_setup;
-
-	rte_event_dequeue_timeout_ticks;
-
-	rte_event_pmd_allocate;
-	rte_event_pmd_release;
-	rte_event_pmd_vdev_init;
-	rte_event_pmd_vdev_uninit;
-	rte_event_pmd_pci_probe;
-	rte_event_pmd_pci_remove;
-
-	local: *;
-};
-
-DPDK_17.08 {
-	global:
-
-	rte_event_ring_create;
-	rte_event_ring_free;
-	rte_event_ring_init;
-	rte_event_ring_lookup;
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_event_dev_attr_get;
-	rte_event_dev_service_id_get;
-	rte_event_port_attr_get;
-	rte_event_queue_attr_get;
-
 	rte_event_eth_rx_adapter_caps_get;
+	rte_event_eth_rx_adapter_cb_register;
 	rte_event_eth_rx_adapter_create;
 	rte_event_eth_rx_adapter_create_ext;
 	rte_event_eth_rx_adapter_free;
@@ -63,38 +40,9 @@ DPDK_17.11 {
 	rte_event_eth_rx_adapter_queue_del;
 	rte_event_eth_rx_adapter_service_id_get;
 	rte_event_eth_rx_adapter_start;
+	rte_event_eth_rx_adapter_stats_get;
 	rte_event_eth_rx_adapter_stats_reset;
 	rte_event_eth_rx_adapter_stop;
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_event_dev_selftest;
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_event_dev_stop_flush_callback_register;
-} DPDK_18.02;
-
-DPDK_19.05 {
-	global:
-
-	rte_event_crypto_adapter_caps_get;
-	rte_event_crypto_adapter_create;
-	rte_event_crypto_adapter_create_ext;
-	rte_event_crypto_adapter_event_port_get;
-	rte_event_crypto_adapter_free;
-	rte_event_crypto_adapter_queue_pair_add;
-	rte_event_crypto_adapter_queue_pair_del;
-	rte_event_crypto_adapter_service_id_get;
-	rte_event_crypto_adapter_start;
-	rte_event_crypto_adapter_stats_get;
-	rte_event_crypto_adapter_stats_reset;
-	rte_event_crypto_adapter_stop;
-	rte_event_port_unlinks_in_progress;
 	rte_event_eth_tx_adapter_caps_get;
 	rte_event_eth_tx_adapter_create;
 	rte_event_eth_tx_adapter_create_ext;
@@ -107,6 +55,26 @@ DPDK_19.05 {
 	rte_event_eth_tx_adapter_stats_get;
 	rte_event_eth_tx_adapter_stats_reset;
 	rte_event_eth_tx_adapter_stop;
+	rte_event_pmd_allocate;
+	rte_event_pmd_pci_probe;
+	rte_event_pmd_pci_remove;
+	rte_event_pmd_release;
+	rte_event_pmd_vdev_init;
+	rte_event_pmd_vdev_uninit;
+	rte_event_port_attr_get;
+	rte_event_port_default_conf_get;
+	rte_event_port_link;
+	rte_event_port_links_get;
+	rte_event_port_setup;
+	rte_event_port_unlink;
+	rte_event_port_unlinks_in_progress;
+	rte_event_queue_attr_get;
+	rte_event_queue_default_conf_get;
+	rte_event_queue_setup;
+	rte_event_ring_create;
+	rte_event_ring_free;
+	rte_event_ring_init;
+	rte_event_ring_lookup;
 	rte_event_timer_adapter_caps_get;
 	rte_event_timer_adapter_create;
 	rte_event_timer_adapter_create_ext;
@@ -121,11 +89,7 @@ DPDK_19.05 {
 	rte_event_timer_arm_burst;
 	rte_event_timer_arm_tmo_tick_burst;
 	rte_event_timer_cancel_burst;
-} DPDK_18.05;
+	rte_eventdevs;
 
-DPDK_19.08 {
-	global:
-
-	rte_event_eth_rx_adapter_cb_register;
-	rte_event_eth_rx_adapter_stats_get;
-} DPDK_19.05;
+	local: *;
+};
diff --git a/lib/librte_gro/rte_gro_version.map b/lib/librte_gro/rte_gro_version.map
index 1606b6dc72..9f6fe79e57 100644
--- a/lib/librte_gro/rte_gro_version.map
+++ b/lib/librte_gro/rte_gro_version.map
@@ -1,4 +1,4 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	global:
 
 	rte_gro_ctx_create;
diff --git a/lib/librte_gso/rte_gso_version.map b/lib/librte_gso/rte_gso_version.map
index e1fd453edb..8505a59c27 100644
--- a/lib/librte_gso/rte_gso_version.map
+++ b/lib/librte_gso/rte_gso_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_gso_segment;
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
index 734ae28b04..138c130c1b 100644
--- a/lib/librte_hash/rte_hash_version.map
+++ b/lib/librte_hash/rte_hash_version.map
@@ -1,58 +1,33 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_fbk_hash_create;
 	rte_fbk_hash_find_existing;
 	rte_fbk_hash_free;
 	rte_hash_add_key;
+	rte_hash_add_key_data;
 	rte_hash_add_key_with_hash;
+	rte_hash_add_key_with_hash_data;
+	rte_hash_count;
 	rte_hash_create;
 	rte_hash_del_key;
 	rte_hash_del_key_with_hash;
 	rte_hash_find_existing;
 	rte_hash_free;
+	rte_hash_get_key_with_position;
 	rte_hash_hash;
+	rte_hash_iterate;
 	rte_hash_lookup;
 	rte_hash_lookup_bulk;
-	rte_hash_lookup_with_hash;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_hash_add_key_data;
-	rte_hash_add_key_with_hash_data;
-	rte_hash_iterate;
 	rte_hash_lookup_bulk_data;
 	rte_hash_lookup_data;
+	rte_hash_lookup_with_hash;
 	rte_hash_lookup_with_hash_data;
 	rte_hash_reset;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
 	rte_hash_set_cmp_func;
 
-} DPDK_2.1;
-
-DPDK_16.07 {
-	global:
-
-	rte_hash_get_key_with_position;
-
-} DPDK_2.2;
-
-
-DPDK_18.08 {
-	global:
-
-	rte_hash_count;
-
-} DPDK_16.07;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_ip_frag/rte_ip_frag_version.map b/lib/librte_ip_frag/rte_ip_frag_version.map
index a193007c61..5dd34f828c 100644
--- a/lib/librte_ip_frag/rte_ip_frag_version.map
+++ b/lib/librte_ip_frag/rte_ip_frag_version.map
@@ -1,8 +1,9 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_ip_frag_free_death_row;
 	rte_ip_frag_table_create;
+	rte_ip_frag_table_destroy;
 	rte_ip_frag_table_statistics_dump;
 	rte_ipv4_frag_reassemble_packet;
 	rte_ipv4_fragment_packet;
@@ -12,13 +13,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_17.08 {
-	global:
-
-	rte_ip_frag_table_destroy;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_jobstats/rte_jobstats_version.map b/lib/librte_jobstats/rte_jobstats_version.map
index f89441438e..dbd2664ae2 100644
--- a/lib/librte_jobstats/rte_jobstats_version.map
+++ b/lib/librte_jobstats/rte_jobstats_version.map
@@ -1,6 +1,7 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_jobstats_abort;
 	rte_jobstats_context_finish;
 	rte_jobstats_context_init;
 	rte_jobstats_context_reset;
@@ -17,10 +18,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_jobstats_abort;
-
-} DPDK_2.0;
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
index c877dc6aaa..9cd3cedc54 100644
--- a/lib/librte_kni/rte_kni_version.map
+++ b/lib/librte_kni/rte_kni_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_kni_alloc;
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
index 8f4b4e3f8f..3ba0f4b59c 100644
--- a/lib/librte_kvargs/rte_kvargs_version.map
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_kvargs_count;
@@ -15,4 +15,4 @@ EXPERIMENTAL {
 	rte_kvargs_parse_delim;
 	rte_kvargs_strcmp;
 
-} DPDK_2.0;
+};
diff --git a/lib/librte_latencystats/rte_latencystats_version.map b/lib/librte_latencystats/rte_latencystats_version.map
index ac8403e821..e04e63463f 100644
--- a/lib/librte_latencystats/rte_latencystats_version.map
+++ b/lib/librte_latencystats/rte_latencystats_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_latencystats_get;
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
index 604ed416d1..500f58b806 100644
--- a/lib/librte_lpm/rte_lpm_version.map
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -1,35 +1,23 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_lpm6_add;
 	rte_lpm6_create;
 	rte_lpm6_delete;
 	rte_lpm6_delete_all;
 	rte_lpm6_delete_bulk_func;
 	rte_lpm6_find_existing;
 	rte_lpm6_free;
-
-	local: *;
-};
-
-DPDK_16.04 {
-	global:
-
+	rte_lpm6_is_rule_present;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
 	rte_lpm_add;
-	rte_lpm_find_existing;
 	rte_lpm_create;
-	rte_lpm_free;
-	rte_lpm_is_rule_present;
 	rte_lpm_delete;
 	rte_lpm_delete_all;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_is_rule_present;
 
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_lpm6_add;
-	rte_lpm6_is_rule_present;
-	rte_lpm6_lookup;
-	rte_lpm6_lookup_bulk_func;
-
-} DPDK_16.04;
+	local: *;
+};
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
index 263dc0a21e..3bbb476975 100644
--- a/lib/librte_mbuf/rte_mbuf_version.map
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -1,26 +1,7 @@
-DPDK_2.0 {
-	global:
-
-	rte_get_rx_ol_flag_name;
-	rte_get_tx_ol_flag_name;
-	rte_mbuf_sanity_check;
-	rte_pktmbuf_dump;
-	rte_pktmbuf_init;
-	rte_pktmbuf_pool_init;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_pktmbuf_pool_create;
-
-} DPDK_2.0;
-
-DPDK_16.11 {
+DPDK_20.0 {
 	global:
 
+	__rte_pktmbuf_linearize;
 	__rte_pktmbuf_read;
 	rte_get_ptype_inner_l2_name;
 	rte_get_ptype_inner_l3_name;
@@ -31,28 +12,24 @@ DPDK_16.11 {
 	rte_get_ptype_name;
 	rte_get_ptype_tunnel_name;
 	rte_get_rx_ol_flag_list;
+	rte_get_rx_ol_flag_name;
 	rte_get_tx_ol_flag_list;
-
-} DPDK_2.1;
-
-DPDK_18.08 {
-	global:
-
+	rte_get_tx_ol_flag_name;
 	rte_mbuf_best_mempool_ops;
 	rte_mbuf_platform_mempool_ops;
+	rte_mbuf_sanity_check;
 	rte_mbuf_set_platform_mempool_ops;
 	rte_mbuf_set_user_mempool_ops;
 	rte_mbuf_user_mempool_ops;
-	rte_pktmbuf_pool_create_by_ops;
-} DPDK_16.11;
-
-DPDK_19.11 {
-	global:
-
-	__rte_pktmbuf_linearize;
 	rte_pktmbuf_clone;
+	rte_pktmbuf_dump;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_create;
+	rte_pktmbuf_pool_create_by_ops;
+	rte_pktmbuf_pool_init;
 
-} DPDK_18.08;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
@@ -68,4 +45,4 @@ EXPERIMENTAL {
 	rte_pktmbuf_copy;
 	rte_pktmbuf_free_bulk;
 
-} DPDK_18.08;
+};
diff --git a/lib/librte_member/rte_member_version.map b/lib/librte_member/rte_member_version.map
index 019e4cd962..87780ae611 100644
--- a/lib/librte_member/rte_member_version.map
+++ b/lib/librte_member/rte_member_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_member_add;
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
index ce9e791e78..d002dfc46f 100644
--- a/lib/librte_mempool/rte_mempool_version.map
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -1,57 +1,39 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_mempool_audit;
-	rte_mempool_calc_obj_size;
-	rte_mempool_create;
-	rte_mempool_dump;
-	rte_mempool_list_dump;
-	rte_mempool_lookup;
-	rte_mempool_walk;
-
-	local: *;
-};
-
-DPDK_16.07 {
-	global:
-
 	rte_mempool_avail_count;
 	rte_mempool_cache_create;
 	rte_mempool_cache_flush;
 	rte_mempool_cache_free;
+	rte_mempool_calc_obj_size;
 	rte_mempool_check_cookies;
+	rte_mempool_contig_blocks_check_cookies;
+	rte_mempool_create;
 	rte_mempool_create_empty;
 	rte_mempool_default_cache;
+	rte_mempool_dump;
 	rte_mempool_free;
 	rte_mempool_generic_get;
 	rte_mempool_generic_put;
 	rte_mempool_in_use_count;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
 	rte_mempool_mem_iter;
 	rte_mempool_obj_iter;
+	rte_mempool_op_calc_mem_size_default;
+	rte_mempool_op_populate_default;
 	rte_mempool_ops_table;
 	rte_mempool_populate_anon;
 	rte_mempool_populate_default;
+	rte_mempool_populate_iova;
 	rte_mempool_populate_virt;
 	rte_mempool_register_ops;
 	rte_mempool_set_ops_byname;
+	rte_mempool_walk;
 
-} DPDK_2.0;
-
-DPDK_17.11 {
-	global:
-
-	rte_mempool_populate_iova;
-
-} DPDK_16.07;
-
-DPDK_18.05 {
-	global:
-
-	rte_mempool_contig_blocks_check_cookies;
-	rte_mempool_op_calc_mem_size_default;
-	rte_mempool_op_populate_default;
-
-} DPDK_17.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
index 4b460d5803..46410b0369 100644
--- a/lib/librte_meter/rte_meter_version.map
+++ b/lib/librte_meter/rte_meter_version.map
@@ -1,21 +1,16 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_meter_srtcm_color_aware_check;
 	rte_meter_srtcm_color_blind_check;
 	rte_meter_srtcm_config;
+	rte_meter_srtcm_profile_config;
 	rte_meter_trtcm_color_aware_check;
 	rte_meter_trtcm_color_blind_check;
 	rte_meter_trtcm_config;
-
-	local: *;
-};
-
-DPDK_18.08 {
-	global:
-
-	rte_meter_srtcm_profile_config;
 	rte_meter_trtcm_profile_config;
+
+	local: *;
 };
 
 EXPERIMENTAL {
diff --git a/lib/librte_metrics/rte_metrics_version.map b/lib/librte_metrics/rte_metrics_version.map
index 6ac99a44a1..85663f356e 100644
--- a/lib/librte_metrics/rte_metrics_version.map
+++ b/lib/librte_metrics/rte_metrics_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_metrics_get_names;
diff --git a/lib/librte_net/rte_net_version.map b/lib/librte_net/rte_net_version.map
index fffc4a3723..8a4e75a3a0 100644
--- a/lib/librte_net/rte_net_version.map
+++ b/lib/librte_net/rte_net_version.map
@@ -1,25 +1,14 @@
-DPDK_16.11 {
-	global:
-	rte_net_get_ptype;
-
-	local: *;
-};
-
-DPDK_17.05 {
-	global:
-
-	rte_net_crc_calc;
-	rte_net_crc_set_alg;
-
-} DPDK_16.11;
-
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
 	rte_eth_random_addr;
 	rte_ether_format_addr;
+	rte_net_crc_calc;
+	rte_net_crc_set_alg;
+	rte_net_get_ptype;
 
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_pci/rte_pci_version.map b/lib/librte_pci/rte_pci_version.map
index 03790cb0f0..67eb845796 100644
--- a/lib/librte_pci/rte_pci_version.map
+++ b/lib/librte_pci/rte_pci_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	pci_map_resource;
diff --git a/lib/librte_pdump/rte_pdump_version.map b/lib/librte_pdump/rte_pdump_version.map
index 3e744f3012..6d02ccce6d 100644
--- a/lib/librte_pdump/rte_pdump_version.map
+++ b/lib/librte_pdump/rte_pdump_version.map
@@ -1,4 +1,4 @@
-DPDK_16.07 {
+DPDK_20.0 {
 	global:
 
 	rte_pdump_disable;
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
index 420f065d6e..64d38afecd 100644
--- a/lib/librte_pipeline/rte_pipeline_version.map
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -1,6 +1,8 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_pipeline_ah_packet_drop;
+	rte_pipeline_ah_packet_hijack;
 	rte_pipeline_check;
 	rte_pipeline_create;
 	rte_pipeline_flush;
@@ -9,42 +11,22 @@ DPDK_2.0 {
 	rte_pipeline_port_in_create;
 	rte_pipeline_port_in_disable;
 	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_stats_read;
 	rte_pipeline_port_out_create;
 	rte_pipeline_port_out_packet_insert;
+	rte_pipeline_port_out_stats_read;
 	rte_pipeline_run;
 	rte_pipeline_table_create;
 	rte_pipeline_table_default_entry_add;
 	rte_pipeline_table_default_entry_delete;
 	rte_pipeline_table_entry_add;
-	rte_pipeline_table_entry_delete;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_pipeline_port_in_stats_read;
-	rte_pipeline_port_out_stats_read;
-	rte_pipeline_table_stats_read;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
 	rte_pipeline_table_entry_add_bulk;
+	rte_pipeline_table_entry_delete;
 	rte_pipeline_table_entry_delete_bulk;
+	rte_pipeline_table_stats_read;
 
-} DPDK_2.1;
-
-DPDK_16.04 {
-	global:
-
-	rte_pipeline_ah_packet_hijack;
-	rte_pipeline_ah_packet_drop;
-
-} DPDK_2.2;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
index d5989721d7..18c6154672 100644
--- a/lib/librte_port/rte_port_version.map
+++ b/lib/librte_port/rte_port_version.map
@@ -1,65 +1,35 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_nodrop_ops;
 	rte_port_ethdev_writer_ops;
+	rte_port_fd_reader_ops;
+	rte_port_fd_writer_nodrop_ops;
+	rte_port_fd_writer_ops;
+	rte_port_kni_reader_ops;
+	rte_port_kni_writer_nodrop_ops;
+	rte_port_kni_writer_ops;
+	rte_port_ring_multi_reader_ops;
+	rte_port_ring_multi_writer_nodrop_ops;
+	rte_port_ring_multi_writer_ops;
 	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_reader_ipv6_frag_ops;
 	rte_port_ring_reader_ops;
 	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_writer_ipv6_ras_ops;
+	rte_port_ring_writer_nodrop_ops;
 	rte_port_ring_writer_ops;
 	rte_port_sched_reader_ops;
 	rte_port_sched_writer_ops;
 	rte_port_sink_ops;
 	rte_port_source_ops;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_port_ethdev_writer_nodrop_ops;
-	rte_port_ring_reader_ipv6_frag_ops;
-	rte_port_ring_writer_ipv6_ras_ops;
-	rte_port_ring_writer_nodrop_ops;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
-	rte_port_ring_multi_reader_ops;
-	rte_port_ring_multi_writer_ops;
-	rte_port_ring_multi_writer_nodrop_ops;
-
-} DPDK_2.1;
-
-DPDK_16.07 {
-	global:
-
-	rte_port_kni_reader_ops;
-	rte_port_kni_writer_ops;
-	rte_port_kni_writer_nodrop_ops;
-
-} DPDK_2.2;
-
-DPDK_16.11 {
-	global:
-
-	rte_port_fd_reader_ops;
-	rte_port_fd_writer_ops;
-	rte_port_fd_writer_nodrop_ops;
-
-} DPDK_16.07;
-
-DPDK_18.11 {
-	global:
-
 	rte_port_sym_crypto_reader_ops;
-	rte_port_sym_crypto_writer_ops;
 	rte_port_sym_crypto_writer_nodrop_ops;
+	rte_port_sym_crypto_writer_ops;
 
-} DPDK_16.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
index 7729838137..55a168f56e 100644
--- a/lib/librte_power/rte_power_version.map
+++ b/lib/librte_power/rte_power_version.map
@@ -1,39 +1,27 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_power_exit;
+	rte_power_freq_disable_turbo;
 	rte_power_freq_down;
+	rte_power_freq_enable_turbo;
 	rte_power_freq_max;
 	rte_power_freq_min;
 	rte_power_freq_up;
 	rte_power_freqs;
+	rte_power_get_capabilities;
 	rte_power_get_env;
 	rte_power_get_freq;
+	rte_power_guest_channel_send_msg;
 	rte_power_init;
 	rte_power_set_env;
 	rte_power_set_freq;
+	rte_power_turbo_status;
 	rte_power_unset_env;
 
 	local: *;
 };
 
-DPDK_17.11 {
-	global:
-
-	rte_power_guest_channel_send_msg;
-	rte_power_freq_disable_turbo;
-	rte_power_freq_enable_turbo;
-	rte_power_turbo_status;
-
-} DPDK_2.0;
-
-DPDK_18.08 {
-	global:
-
-	rte_power_get_capabilities;
-
-} DPDK_17.11;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_rawdev/rte_rawdev_version.map b/lib/librte_rawdev/rte_rawdev_version.map
index b61dbff11c..d847c9e0d3 100644
--- a/lib/librte_rawdev/rte_rawdev_version.map
+++ b/lib/librte_rawdev/rte_rawdev_version.map
@@ -1,4 +1,4 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	rte_rawdev_close;
@@ -17,8 +17,8 @@ DPDK_18.08 {
 	rte_rawdev_pmd_release;
 	rte_rawdev_queue_conf_get;
 	rte_rawdev_queue_count;
-	rte_rawdev_queue_setup;
 	rte_rawdev_queue_release;
+	rte_rawdev_queue_setup;
 	rte_rawdev_reset;
 	rte_rawdev_selftest;
 	rte_rawdev_set_attr;
diff --git a/lib/librte_reorder/rte_reorder_version.map b/lib/librte_reorder/rte_reorder_version.map
index 0a8a54de83..cf444062df 100644
--- a/lib/librte_reorder/rte_reorder_version.map
+++ b/lib/librte_reorder/rte_reorder_version.map
@@ -1,13 +1,13 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_reorder_create;
-	rte_reorder_init;
+	rte_reorder_drain;
 	rte_reorder_find_existing;
-	rte_reorder_reset;
 	rte_reorder_free;
+	rte_reorder_init;
 	rte_reorder_insert;
-	rte_reorder_drain;
+	rte_reorder_reset;
 
 	local: *;
 };
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
index 510c1386e0..89d84bcf48 100644
--- a/lib/librte_ring/rte_ring_version.map
+++ b/lib/librte_ring/rte_ring_version.map
@@ -1,8 +1,9 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_ring_create;
 	rte_ring_dump;
+	rte_ring_free;
 	rte_ring_get_memsize;
 	rte_ring_init;
 	rte_ring_list_dump;
@@ -11,13 +12,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_2.2 {
-	global:
-
-	rte_ring_free;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
index f33761e63e..cefd990367 100644
--- a/lib/librte_sched/rte_sched_version.map
+++ b/lib/librte_sched/rte_sched_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_approx;
@@ -14,6 +14,9 @@ DPDK_2.0 {
 	rte_sched_port_enqueue;
 	rte_sched_port_free;
 	rte_sched_port_get_memory_footprint;
+	rte_sched_port_pkt_read_color;
+	rte_sched_port_pkt_read_tree_path;
+	rte_sched_port_pkt_write;
 	rte_sched_queue_read_stats;
 	rte_sched_subport_config;
 	rte_sched_subport_read_stats;
@@ -21,15 +24,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_2.1 {
-	global:
-
-	rte_sched_port_pkt_write;
-	rte_sched_port_pkt_read_tree_path;
-	rte_sched_port_pkt_read_color;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_security/rte_security_version.map b/lib/librte_security/rte_security_version.map
index 53267bf3cc..b07314bbf4 100644
--- a/lib/librte_security/rte_security_version.map
+++ b/lib/librte_security/rte_security_version.map
@@ -1,4 +1,4 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
 	rte_security_attach_session;
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
index 6237252bec..40f72b1fe8 100644
--- a/lib/librte_table/rte_table_version.map
+++ b/lib/librte_table/rte_table_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_table_acl_ops;
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
index 92c69b2e29..2a59d3f081 100644
--- a/lib/librte_timer/rte_timer_version.map
+++ b/lib/librte_timer/rte_timer_version.map
@@ -1,23 +1,18 @@
-DPDK_2.0 {
-	global:
-
-	rte_timer_init;
-	rte_timer_pending;
-	rte_timer_reset_sync;
-	rte_timer_stop_sync;
-
-	local: *;
-};
-
-DPDK_19.05 {
+DPDK_20.0 {
 	global:
 
 	rte_timer_dump_stats;
+	rte_timer_init;
 	rte_timer_manage;
+	rte_timer_pending;
 	rte_timer_reset;
+	rte_timer_reset_sync;
 	rte_timer_stop;
+	rte_timer_stop_sync;
 	rte_timer_subsystem_init;
-} DPDK_2.0;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
index ce517b1271..c512377fe6 100644
--- a/lib/librte_vhost/rte_vhost_version.map
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -1,64 +1,34 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_vhost_avail_entries;
 	rte_vhost_dequeue_burst;
 	rte_vhost_driver_callback_register;
-	rte_vhost_driver_register;
-	rte_vhost_enable_guest_notification;
-	rte_vhost_enqueue_burst;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_vhost_driver_unregister;
-
-} DPDK_2.0;
-
-DPDK_16.07 {
-	global:
-
-	rte_vhost_avail_entries;
-	rte_vhost_get_ifname;
-	rte_vhost_get_numa_node;
-	rte_vhost_get_queue_num;
-
-} DPDK_2.1;
-
-DPDK_17.05 {
-	global:
-
 	rte_vhost_driver_disable_features;
 	rte_vhost_driver_enable_features;
 	rte_vhost_driver_get_features;
+	rte_vhost_driver_register;
 	rte_vhost_driver_set_features;
 	rte_vhost_driver_start;
+	rte_vhost_driver_unregister;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_enqueue_burst;
+	rte_vhost_get_ifname;
 	rte_vhost_get_mem_table;
 	rte_vhost_get_mtu;
 	rte_vhost_get_negotiated_features;
+	rte_vhost_get_numa_node;
+	rte_vhost_get_queue_num;
 	rte_vhost_get_vhost_vring;
 	rte_vhost_get_vring_num;
 	rte_vhost_gpa_to_vva;
 	rte_vhost_log_used_vring;
 	rte_vhost_log_write;
-
-} DPDK_16.07;
-
-DPDK_17.08 {
-	global:
-
 	rte_vhost_rx_queue_count;
-
-} DPDK_17.05;
-
-DPDK_18.02 {
-	global:
-
 	rte_vhost_vring_call;
 
-} DPDK_17.08;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
-- 
2.17.1

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v8 03/12] build: remove individual library versions
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (2 preceding siblings ...)
  2019-11-20 17:23  9%       ` [dpdk-dev] [PATCH v8 02/12] config: remove CONFIG_RTE_MAJOR_ABI option Anatoly Burakov
@ 2019-11-20 17:23  1%       ` Anatoly Burakov
  2019-11-20 17:23 16%       ` [dpdk-dev] [PATCH v8 04/12] buildtools: add script for updating symbols abi version Anatoly Burakov
                         ` (8 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Nicolas Chautru, Hemant Agrawal, Sachin Saxena, Rosen Xu,
	Stephen Hemminger, Anoob Joseph, Tomasz Duszynski, Liron Himi,
	Jerin Jacob, Nithin Dabilpuram, Vamsi Attunuru, Lee Daly,
	Fiona Trahe, Ashish Gupta, Sunila Sahu, Declan Doherty,
	Pablo de Lara, Gagandeep Singh, Ravi Kumar, Akhil Goyal,
	Michael Shamis, Nagadheeraj Rottela, Srikanth Jampala,
	Ankur Dwivedi, Fan Zhang, Jay Zhou, Nipun Gupta,
	Mattias Rönnblom, Pavan Nikhilesh, Liang Ma, Peter Mccarthy,
	Harry van Haaren, Artem V. Andreev, Andrew Rybchenko,
	Olivier Matz, Gage Eads, John W. Linville, Xiaolong Ye, Qi Zhang,
	Shepard Siegel, Ed Czeck, John Miller, Igor Russkikh,
	Pavel Belous, Allain Legacy, Matt Peters, Rasesh Mody,
	Shahed Shaikh, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Rahul Lakkireddy, Wenzhuo Lu, Marcin Wojtas, Michal Krawczyk,
	Guy Tzalik, Evgeny Schemeilin, Igor Chauskin, John Daley,
	Hyong Youb Kim, Gaetan Rivet, Xiao Wang, Ziyang Xuan,
	Xiaoyun Wang, Guoyang Zhou, Wei Hu (Xavier), Min Hu (Connor),
	Yisen Zhuang, Beilei Xing, Jingjing Wu, Qiming Yang,
	Konstantin Ananyev, Ferruh Yigit, Shijith Thotton,
	Srisivasubramanian Srinivasan, Jakub Grajciar, Matan Azrad,
	Shahaf Shuler, Viacheslav Ovsiienko, Zyta Szpak,
	K. Y. Srinivasan, Haiyang Zhang, Rastislav Cernay, Jan Remes,
	Alejandro Lucero, Tetsuya Mukawa, Kiran Kumar K,
	Bruce Richardson, Jasvinder Singh, Cristian Dumitrescu,
	Keith Wiles, Maciej Czekaj, Maxime Coquelin, Tiwei Bie,
	Zhihong Wang, Yong Wang, Tianfei zhang, Xiaoyun Li, Satha Rao,
	Shreyansh Jain, Marko Kovacevic, Ori Kam, Radu Nicolau,
	Tomasz Kantecki, Sunil Kumar Kori, David Hunt, Byron Marohn,
	Yipeng Wang, Thomas Monjalon, Vladimir Medvedkin,
	Bernard Iremonger, Jiayu Hu, Sameh Gobriel, Reshma Pattan,
	Honnappa Nagarahalli, Kevin Laatz, Robert Sanford,
	Erik Gabriel Carrillo, john.mcnamara, ray.kinsella,
	david.marchand

Since the library versioning for both stable and experimental ABI's is
now managed globally, the LIBABIVER and version variables no longer
serve any useful purpose, and can be removed.

The replacement in Makefiles was done using the following regex:

	^(#.*\n)?LIBABIVER\s*:=\s*\d+\n(\s*\n)?

(LIBABIVER := numbers, optionally preceded by a comment and optionally
succeeded by an empty line)

The replacement for meson files was done using the following regex:

	^(#.*\n)?version\s*=\s*\d+\n(\s*\n)?

(version = numbers, optionally preceded by a comment and optionally
succeeded by an empty line)

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---

Notes:
    v6:
    - Silenced grep error message on trying to grep a directory
    
    v3:
    - Removed Windows support from Makefile changes
    - Removed unneeded path conversions from meson files
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 drivers/baseband/fpga_lte_fec/Makefile | 3 ---
 drivers/baseband/null/Makefile         | 3 ---
 drivers/baseband/turbo_sw/Makefile     | 3 ---
 drivers/bus/dpaa/Makefile              | 2 --
 drivers/bus/dpaa/meson.build           | 2 --
 drivers/bus/fslmc/Makefile             | 3 ---
 drivers/bus/fslmc/meson.build          | 2 --
 drivers/bus/ifpga/Makefile             | 3 ---
 drivers/bus/ifpga/meson.build          | 2 --
 drivers/bus/pci/Makefile               | 1 -
 drivers/bus/pci/meson.build            | 2 --
 drivers/bus/vdev/Makefile              | 3 ---
 drivers/bus/vdev/meson.build           | 2 --
 drivers/bus/vmbus/Makefile             | 1 -
 drivers/bus/vmbus/meson.build          | 2 --
 drivers/common/cpt/Makefile            | 2 --
 drivers/common/dpaax/Makefile          | 3 ---
 drivers/common/mvep/Makefile           | 3 ---
 drivers/common/octeontx/Makefile       | 2 --
 drivers/common/octeontx2/Makefile      | 2 --
 drivers/compress/isal/Makefile         | 3 ---
 drivers/compress/octeontx/Makefile     | 3 ---
 drivers/compress/zlib/Makefile         | 3 ---
 drivers/crypto/aesni_gcm/Makefile      | 3 ---
 drivers/crypto/aesni_mb/Makefile       | 3 ---
 drivers/crypto/armv8/Makefile          | 3 ---
 drivers/crypto/caam_jr/Makefile        | 3 ---
 drivers/crypto/ccp/Makefile            | 3 ---
 drivers/crypto/dpaa2_sec/Makefile      | 3 ---
 drivers/crypto/dpaa2_sec/meson.build   | 2 --
 drivers/crypto/dpaa_sec/Makefile       | 3 ---
 drivers/crypto/kasumi/Makefile         | 3 ---
 drivers/crypto/mvsam/Makefile          | 3 ---
 drivers/crypto/nitrox/Makefile         | 3 ---
 drivers/crypto/null/Makefile           | 3 ---
 drivers/crypto/octeontx/Makefile       | 3 ---
 drivers/crypto/octeontx2/Makefile      | 3 ---
 drivers/crypto/openssl/Makefile        | 3 ---
 drivers/crypto/scheduler/Makefile      | 3 ---
 drivers/crypto/snow3g/Makefile         | 3 ---
 drivers/crypto/virtio/Makefile         | 2 --
 drivers/crypto/zuc/Makefile            | 3 ---
 drivers/event/dpaa/Makefile            | 2 --
 drivers/event/dpaa2/Makefile           | 2 --
 drivers/event/dpaa2/meson.build        | 2 --
 drivers/event/dsw/Makefile             | 2 --
 drivers/event/octeontx/Makefile        | 2 --
 drivers/event/octeontx2/Makefile       | 2 --
 drivers/event/opdl/Makefile            | 3 ---
 drivers/event/skeleton/Makefile        | 2 --
 drivers/event/sw/Makefile              | 3 ---
 drivers/mempool/bucket/Makefile        | 2 --
 drivers/mempool/dpaa/Makefile          | 3 ---
 drivers/mempool/dpaa2/Makefile         | 3 ---
 drivers/mempool/dpaa2/meson.build      | 2 --
 drivers/mempool/octeontx/Makefile      | 2 --
 drivers/mempool/octeontx2/Makefile     | 2 --
 drivers/mempool/ring/Makefile          | 2 --
 drivers/mempool/stack/Makefile         | 2 --
 drivers/net/af_packet/Makefile         | 2 --
 drivers/net/af_xdp/Makefile            | 2 --
 drivers/net/ark/Makefile               | 2 --
 drivers/net/atlantic/Makefile          | 2 --
 drivers/net/avp/Makefile               | 2 --
 drivers/net/axgbe/Makefile             | 2 --
 drivers/net/bnx2x/Makefile             | 2 --
 drivers/net/bnxt/Makefile              | 2 --
 drivers/net/bnxt/meson.build           | 1 -
 drivers/net/bonding/Makefile           | 2 --
 drivers/net/bonding/meson.build        | 1 -
 drivers/net/cxgbe/Makefile             | 2 --
 drivers/net/dpaa/Makefile              | 2 --
 drivers/net/dpaa2/Makefile             | 3 ---
 drivers/net/dpaa2/meson.build          | 2 --
 drivers/net/e1000/Makefile             | 2 --
 drivers/net/ena/Makefile               | 2 --
 drivers/net/enetc/Makefile             | 2 --
 drivers/net/enic/Makefile              | 2 --
 drivers/net/failsafe/Makefile          | 2 --
 drivers/net/fm10k/Makefile             | 2 --
 drivers/net/hinic/Makefile             | 2 --
 drivers/net/hns3/Makefile              | 2 --
 drivers/net/i40e/Makefile              | 2 --
 drivers/net/i40e/meson.build           | 2 --
 drivers/net/iavf/Makefile              | 2 --
 drivers/net/ice/Makefile               | 2 --
 drivers/net/ifc/Makefile               | 2 --
 drivers/net/ipn3ke/Makefile            | 2 --
 drivers/net/ixgbe/Makefile             | 2 --
 drivers/net/ixgbe/meson.build          | 2 --
 drivers/net/kni/Makefile               | 2 --
 drivers/net/liquidio/Makefile          | 2 --
 drivers/net/memif/Makefile             | 2 --
 drivers/net/mlx4/Makefile              | 2 --
 drivers/net/mlx5/Makefile              | 2 --
 drivers/net/mvneta/Makefile            | 3 ---
 drivers/net/mvpp2/Makefile             | 3 ---
 drivers/net/netvsc/Makefile            | 2 --
 drivers/net/netvsc/meson.build         | 1 -
 drivers/net/nfb/Makefile               | 2 --
 drivers/net/nfp/Makefile               | 2 --
 drivers/net/null/Makefile              | 2 --
 drivers/net/null/meson.build           | 1 -
 drivers/net/octeontx/Makefile          | 2 --
 drivers/net/octeontx2/Makefile         | 2 --
 drivers/net/pcap/Makefile              | 2 --
 drivers/net/pfe/Makefile               | 2 --
 drivers/net/qede/Makefile              | 2 --
 drivers/net/ring/Makefile              | 2 --
 drivers/net/ring/meson.build           | 1 -
 drivers/net/sfc/Makefile               | 2 --
 drivers/net/softnic/Makefile           | 2 --
 drivers/net/szedata2/Makefile          | 2 --
 drivers/net/tap/Makefile               | 2 --
 drivers/net/thunderx/Makefile          | 2 --
 drivers/net/vdev_netvsc/Makefile       | 1 -
 drivers/net/vhost/Makefile             | 2 --
 drivers/net/vhost/meson.build          | 1 -
 drivers/net/virtio/Makefile            | 2 --
 drivers/net/vmxnet3/Makefile           | 2 --
 drivers/raw/dpaa2_cmdif/Makefile       | 2 --
 drivers/raw/dpaa2_cmdif/meson.build    | 2 --
 drivers/raw/dpaa2_qdma/Makefile        | 2 --
 drivers/raw/dpaa2_qdma/meson.build     | 2 --
 drivers/raw/ifpga/Makefile             | 2 --
 drivers/raw/ifpga/meson.build          | 2 --
 drivers/raw/ioat/Makefile              | 3 ---
 drivers/raw/ntb/Makefile               | 2 --
 drivers/raw/octeontx2_dma/Makefile     | 2 --
 drivers/raw/skeleton/Makefile          | 2 --
 examples/ethtool/lib/Makefile          | 2 --
 lib/librte_acl/Makefile                | 2 --
 lib/librte_acl/meson.build             | 1 -
 lib/librte_bbdev/Makefile              | 3 ---
 lib/librte_bitratestats/Makefile       | 2 --
 lib/librte_bitratestats/meson.build    | 1 -
 lib/librte_bpf/Makefile                | 2 --
 lib/librte_cfgfile/Makefile            | 2 --
 lib/librte_cfgfile/meson.build         | 1 -
 lib/librte_cmdline/Makefile            | 2 --
 lib/librte_cmdline/meson.build         | 1 -
 lib/librte_compressdev/Makefile        | 3 ---
 lib/librte_cryptodev/Makefile          | 3 ---
 lib/librte_cryptodev/meson.build       | 1 -
 lib/librte_distributor/Makefile        | 2 --
 lib/librte_eal/freebsd/eal/Makefile    | 2 --
 lib/librte_eal/linux/eal/Makefile      | 2 --
 lib/librte_efd/Makefile                | 2 --
 lib/librte_ethdev/Makefile             | 2 --
 lib/librte_ethdev/meson.build          | 1 -
 lib/librte_eventdev/Makefile           | 3 ---
 lib/librte_eventdev/meson.build        | 1 -
 lib/librte_fib/Makefile                | 2 --
 lib/librte_flow_classify/Makefile      | 2 --
 lib/librte_gro/Makefile                | 2 --
 lib/librte_gso/Makefile                | 2 --
 lib/librte_hash/Makefile               | 2 --
 lib/librte_hash/meson.build            | 1 -
 lib/librte_ip_frag/Makefile            | 2 --
 lib/librte_ipsec/Makefile              | 2 --
 lib/librte_ipsec/meson.build           | 1 -
 lib/librte_jobstats/Makefile           | 2 --
 lib/librte_kni/Makefile                | 2 --
 lib/librte_kni/meson.build             | 1 -
 lib/librte_kvargs/Makefile             | 2 --
 lib/librte_kvargs/meson.build          | 1 -
 lib/librte_latencystats/Makefile       | 2 --
 lib/librte_lpm/Makefile                | 2 --
 lib/librte_lpm/meson.build             | 1 -
 lib/librte_mbuf/Makefile               | 2 --
 lib/librte_mbuf/meson.build            | 1 -
 lib/librte_member/Makefile             | 2 --
 lib/librte_mempool/Makefile            | 2 --
 lib/librte_mempool/meson.build         | 1 -
 lib/librte_meter/Makefile              | 2 --
 lib/librte_meter/meson.build           | 1 -
 lib/librte_metrics/Makefile            | 2 --
 lib/librte_net/Makefile                | 2 --
 lib/librte_net/meson.build             | 1 -
 lib/librte_pci/Makefile                | 2 --
 lib/librte_pci/meson.build             | 2 --
 lib/librte_pdump/Makefile              | 2 --
 lib/librte_pdump/meson.build           | 1 -
 lib/librte_pipeline/Makefile           | 2 --
 lib/librte_pipeline/meson.build        | 1 -
 lib/librte_port/Makefile               | 2 --
 lib/librte_port/meson.build            | 1 -
 lib/librte_power/Makefile              | 2 --
 lib/librte_rawdev/Makefile             | 3 ---
 lib/librte_rcu/Makefile                | 2 --
 lib/librte_reorder/Makefile            | 2 --
 lib/librte_rib/Makefile                | 2 --
 lib/librte_ring/Makefile               | 2 --
 lib/librte_ring/meson.build            | 1 -
 lib/librte_sched/Makefile              | 2 --
 lib/librte_sched/meson.build           | 1 -
 lib/librte_security/Makefile           | 3 ---
 lib/librte_security/meson.build        | 1 -
 lib/librte_stack/Makefile              | 2 --
 lib/librte_stack/meson.build           | 1 -
 lib/librte_table/Makefile              | 2 --
 lib/librte_table/meson.build           | 1 -
 lib/librte_telemetry/Makefile          | 2 --
 lib/librte_timer/Makefile              | 2 --
 lib/librte_vhost/Makefile              | 2 --
 lib/librte_vhost/meson.build           | 1 -
 206 files changed, 420 deletions(-)

diff --git a/drivers/baseband/fpga_lte_fec/Makefile b/drivers/baseband/fpga_lte_fec/Makefile
index 2369bd27fa..b4a442ca54 100644
--- a/drivers/baseband/fpga_lte_fec/Makefile
+++ b/drivers/baseband/fpga_lte_fec/Makefile
@@ -17,9 +17,6 @@ LDLIBS += -lrte_pci -lrte_bus_pci
 # versioning export map
 EXPORT_MAP := rte_pmd_bbdev_fpga_lte_fec_version.map
 
-# library version
-LIBABIVER := 1
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC) += fpga_lte_fec.c
 
diff --git a/drivers/baseband/null/Makefile b/drivers/baseband/null/Makefile
index f885a97bb3..28751eeb79 100644
--- a/drivers/baseband/null/Makefile
+++ b/drivers/baseband/null/Makefile
@@ -16,9 +16,6 @@ LDLIBS += -lrte_bus_vdev
 # versioning export map
 EXPORT_MAP := rte_pmd_bbdev_null_version.map
 
-# library version
-LIBABIVER := 1
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_NULL) += bbdev_null.c
 
diff --git a/drivers/baseband/turbo_sw/Makefile b/drivers/baseband/turbo_sw/Makefile
index 4aa05d2db6..ec74d277e9 100644
--- a/drivers/baseband/turbo_sw/Makefile
+++ b/drivers/baseband/turbo_sw/Makefile
@@ -47,9 +47,6 @@ LDLIBS += -L$(FLEXRAN_SDK)/lib_LDPC_ratematch_5gnr -lLDPC_ratematch_5gnr
 LDLIBS += -L$(FLEXRAN_SDK)/lib_rate_dematching_5gnr -lrate_dematching_5gnr
 endif
 
-# library version
-LIBABIVER := 1
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += bbdev_turbo_software.c
 
diff --git a/drivers/bus/dpaa/Makefile b/drivers/bus/dpaa/Makefile
index 454ac12bf3..cd1093f744 100644
--- a/drivers/bus/dpaa/Makefile
+++ b/drivers/bus/dpaa/Makefile
@@ -23,8 +23,6 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
 # versioning export map
 EXPORT_MAP := rte_bus_dpaa_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += \
diff --git a/drivers/bus/dpaa/meson.build b/drivers/bus/dpaa/meson.build
index 0e561c2608..2b1cf19114 100644
--- a/drivers/bus/dpaa/meson.build
+++ b/drivers/bus/dpaa/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 if not is_linux
 	build = false
 	reason = 'only supported on linux'
diff --git a/drivers/bus/fslmc/Makefile b/drivers/bus/fslmc/Makefile
index 16f0a2ca4a..6d22860885 100644
--- a/drivers/bus/fslmc/Makefile
+++ b/drivers/bus/fslmc/Makefile
@@ -25,9 +25,6 @@ LDLIBS += -lrte_common_dpaax
 # versioning export map
 EXPORT_MAP := rte_bus_fslmc_version.map
 
-# library version
-LIBABIVER := 2
-
 SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += \
         qbman/qbman_portal.c \
         qbman/qbman_debug.c
diff --git a/drivers/bus/fslmc/meson.build b/drivers/bus/fslmc/meson.build
index faebc4327f..6e709a8d5a 100644
--- a/drivers/bus/fslmc/meson.build
+++ b/drivers/bus/fslmc/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 if not is_linux
 	build = false
 	reason = 'only supported on linux'
diff --git a/drivers/bus/ifpga/Makefile b/drivers/bus/ifpga/Makefile
index 514452b39d..290c1124ba 100644
--- a/drivers/bus/ifpga/Makefile
+++ b/drivers/bus/ifpga/Makefile
@@ -18,9 +18,6 @@ LDLIBS += -lrte_kvargs
 # versioning export map
 EXPORT_MAP := rte_bus_ifpga_version.map
 
-# library version
-LIBABIVER := 2
-
 SRCS-$(CONFIG_RTE_LIBRTE_IFPGA_BUS) += ifpga_bus.c
 SRCS-$(CONFIG_RTE_LIBRTE_IFPGA_BUS) += ifpga_common.c
 
diff --git a/drivers/bus/ifpga/meson.build b/drivers/bus/ifpga/meson.build
index 0b5c38d54c..c9b08c8627 100644
--- a/drivers/bus/ifpga/meson.build
+++ b/drivers/bus/ifpga/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2010-2018 Intel Corporation
 
-version = 2
-
 deps += ['pci', 'kvargs', 'rawdev']
 install_headers('rte_bus_ifpga.h')
 sources = files('ifpga_common.c', 'ifpga_bus.c')
diff --git a/drivers/bus/pci/Makefile b/drivers/bus/pci/Makefile
index 45d12427a1..975d796527 100644
--- a/drivers/bus/pci/Makefile
+++ b/drivers/bus/pci/Makefile
@@ -4,7 +4,6 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_bus_pci.a
-LIBABIVER := 2
 EXPORT_MAP := rte_bus_pci_version.map
 
 CFLAGS := -I$(SRCDIR) $(CFLAGS)
diff --git a/drivers/bus/pci/meson.build b/drivers/bus/pci/meson.build
index a312ecc034..a3feb86aea 100644
--- a/drivers/bus/pci/meson.build
+++ b/drivers/bus/pci/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
-
 deps += ['pci']
 install_headers('rte_bus_pci.h')
 sources = files('pci_common.c',
diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
index 803b8ea7b0..63c9b3f59b 100644
--- a/drivers/bus/vdev/Makefile
+++ b/drivers/bus/vdev/Makefile
@@ -15,9 +15,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 # versioning export map
 EXPORT_MAP := rte_bus_vdev_version.map
 
-# library version
-LIBABIVER := 2
-
 SRCS-y += vdev.c
 SRCS-y += vdev_params.c
 
diff --git a/drivers/bus/vdev/meson.build b/drivers/bus/vdev/meson.build
index 803785f10f..12605e5c74 100644
--- a/drivers/bus/vdev/meson.build
+++ b/drivers/bus/vdev/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
-
 sources = files('vdev.c',
 	'vdev_params.c')
 install_headers('rte_bus_vdev.h')
diff --git a/drivers/bus/vmbus/Makefile b/drivers/bus/vmbus/Makefile
index 8f3ec7af45..59e789db9b 100644
--- a/drivers/bus/vmbus/Makefile
+++ b/drivers/bus/vmbus/Makefile
@@ -3,7 +3,6 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_bus_vmbus.a
-LIBABIVER := 2
 EXPORT_MAP := rte_bus_vmbus_version.map
 
 CFLAGS += -I$(SRCDIR)
diff --git a/drivers/bus/vmbus/meson.build b/drivers/bus/vmbus/meson.build
index 79d4c685ec..251f21b662 100644
--- a/drivers/bus/vmbus/meson.build
+++ b/drivers/bus/vmbus/meson.build
@@ -1,7 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
 
-version = 2
-
 allow_experimental_apis = true
 
 install_headers('rte_bus_vmbus.h','rte_vmbus_reg.h')
diff --git a/drivers/common/cpt/Makefile b/drivers/common/cpt/Makefile
index 2340aa9616..859443218b 100644
--- a/drivers/common/cpt/Makefile
+++ b/drivers/common/cpt/Makefile
@@ -13,8 +13,6 @@ CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -I$(RTE_SDK)/drivers/bus/pci
 EXPORT_MAP := rte_common_cpt_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/common/dpaax/Makefile b/drivers/common/dpaax/Makefile
index a0a1de0283..59bd8ae15d 100644
--- a/drivers/common/dpaax/Makefile
+++ b/drivers/common/dpaax/Makefile
@@ -20,9 +20,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/common/dpaax
 # versioning export map
 EXPORT_MAP := rte_common_dpaax_version.map
 
-# library version
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/common/mvep/Makefile b/drivers/common/mvep/Makefile
index 1f5f005d91..f91d295e5c 100644
--- a/drivers/common/mvep/Makefile
+++ b/drivers/common/mvep/Makefile
@@ -15,9 +15,6 @@ endif
 # library name
 LIB = librte_common_mvep.a
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_common_mvep_version.map
 
diff --git a/drivers/common/octeontx/Makefile b/drivers/common/octeontx/Makefile
index dfdb9f196e..5e67df0583 100644
--- a/drivers/common/octeontx/Makefile
+++ b/drivers/common/octeontx/Makefile
@@ -12,8 +12,6 @@ LIB = librte_common_octeontx.a
 CFLAGS += $(WERROR_FLAGS)
 EXPORT_MAP := rte_common_octeontx_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/common/octeontx2/Makefile b/drivers/common/octeontx2/Makefile
index afe570817c..eaff29433a 100644
--- a/drivers/common/octeontx2/Makefile
+++ b/drivers/common/octeontx2/Makefile
@@ -24,8 +24,6 @@ endif
 
 EXPORT_MAP := rte_common_octeontx2_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/compress/isal/Makefile b/drivers/compress/isal/Makefile
index 95904f6418..6438b75ce8 100644
--- a/drivers/compress/isal/Makefile
+++ b/drivers/compress/isal/Makefile
@@ -17,9 +17,6 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
 LDLIBS += -lrte_compressdev
 LDLIBS += -lrte_bus_vdev
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_isal_version.map
 
diff --git a/drivers/compress/octeontx/Makefile b/drivers/compress/octeontx/Makefile
index f34424c87f..d6324b5302 100644
--- a/drivers/compress/octeontx/Makefile
+++ b/drivers/compress/octeontx/Makefile
@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_pmd_octeontx_zip.a
 
-# library version
-LIBABIVER := 1
-
 # build flags
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -O3
diff --git a/drivers/compress/zlib/Makefile b/drivers/compress/zlib/Makefile
index 5cf8de6f83..1eba3560fe 100644
--- a/drivers/compress/zlib/Makefile
+++ b/drivers/compress/zlib/Makefile
@@ -11,9 +11,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_zlib_version.map
 
diff --git a/drivers/crypto/aesni_gcm/Makefile b/drivers/crypto/aesni_gcm/Makefile
index 39eff3db00..d8190a2ff4 100644
--- a/drivers/crypto/aesni_gcm/Makefile
+++ b/drivers/crypto/aesni_gcm/Makefile
@@ -11,9 +11,6 @@ CFLAGS += -O3
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += $(WERROR_FLAGS)
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_aesni_gcm_version.map
 
diff --git a/drivers/crypto/aesni_mb/Makefile b/drivers/crypto/aesni_mb/Makefile
index f3035340ac..f1530e74c4 100644
--- a/drivers/crypto/aesni_mb/Makefile
+++ b/drivers/crypto/aesni_mb/Makefile
@@ -11,9 +11,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_aesni_mb_version.map
 
diff --git a/drivers/crypto/armv8/Makefile b/drivers/crypto/armv8/Makefile
index f71f6b14a4..1252836648 100644
--- a/drivers/crypto/armv8/Makefile
+++ b/drivers/crypto/armv8/Makefile
@@ -19,9 +19,6 @@ LIB = librte_pmd_armv8.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_armv8_version.map
 
diff --git a/drivers/crypto/caam_jr/Makefile b/drivers/crypto/caam_jr/Makefile
index fa35b79b85..1b1f25a2a2 100644
--- a/drivers/crypto/caam_jr/Makefile
+++ b/drivers/crypto/caam_jr/Makefile
@@ -25,9 +25,6 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
 # versioning export map
 EXPORT_MAP := rte_pmd_caam_jr_version.map
 
-# library version
-LIBABIVER := 1
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_CAAM_JR) += caam_jr.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_CAAM_JR) += caam_jr_capabilities.c
diff --git a/drivers/crypto/ccp/Makefile b/drivers/crypto/ccp/Makefile
index f51d170f90..3f5da2adf3 100644
--- a/drivers/crypto/ccp/Makefile
+++ b/drivers/crypto/ccp/Makefile
@@ -11,9 +11,6 @@ CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
-# library version
-LIBABIVER := 1
-
 # external library include paths
 LDLIBS += -lcrypto
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
diff --git a/drivers/crypto/dpaa2_sec/Makefile b/drivers/crypto/dpaa2_sec/Makefile
index ba30a955a9..96b9c78435 100644
--- a/drivers/crypto/dpaa2_sec/Makefile
+++ b/drivers/crypto/dpaa2_sec/Makefile
@@ -33,9 +33,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/mempool/dpaa2/
 # versioning export map
 EXPORT_MAP := rte_pmd_dpaa2_sec_version.map
 
-# library version
-LIBABIVER := 2
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC) += dpaa2_sec_dpseci.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC) += mc/dpseci.c
diff --git a/drivers/crypto/dpaa2_sec/meson.build b/drivers/crypto/dpaa2_sec/meson.build
index 9d1b170be7..ab9c8c8bf9 100644
--- a/drivers/crypto/dpaa2_sec/meson.build
+++ b/drivers/crypto/dpaa2_sec/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 if not is_linux
 	build = false
 	reason = 'only supported on linux'
diff --git a/drivers/crypto/dpaa_sec/Makefile b/drivers/crypto/dpaa_sec/Makefile
index 9acccaac4f..fbfd775855 100644
--- a/drivers/crypto/dpaa_sec/Makefile
+++ b/drivers/crypto/dpaa_sec/Makefile
@@ -27,9 +27,6 @@ LDLIBS += -lrte_cryptodev
 # versioning export map
 EXPORT_MAP := rte_pmd_dpaa_sec_version.map
 
-# library version
-LIBABIVER := 1
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_DPAA_SEC) += dpaa_sec.c
 
diff --git a/drivers/crypto/kasumi/Makefile b/drivers/crypto/kasumi/Makefile
index 3de2f97edf..26f51375da 100644
--- a/drivers/crypto/kasumi/Makefile
+++ b/drivers/crypto/kasumi/Makefile
@@ -17,9 +17,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_kasumi_version.map
 
diff --git a/drivers/crypto/mvsam/Makefile b/drivers/crypto/mvsam/Makefile
index 2b4d036c83..f0641ae7d9 100644
--- a/drivers/crypto/mvsam/Makefile
+++ b/drivers/crypto/mvsam/Makefile
@@ -24,9 +24,6 @@ CFLAGS += -I$(LIBMUSDK_PATH)/include
 CFLAGS += -DMVCONF_TYPES_PUBLIC
 CFLAGS += -DMVCONF_DMA_PHYS_ADDR_T_PUBLIC
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_mvsam_version.map
 
diff --git a/drivers/crypto/nitrox/Makefile b/drivers/crypto/nitrox/Makefile
index f569927704..fc42ac8088 100644
--- a/drivers/crypto/nitrox/Makefile
+++ b/drivers/crypto/nitrox/Makefile
@@ -11,9 +11,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_nitrox_version.map
 
diff --git a/drivers/crypto/null/Makefile b/drivers/crypto/null/Makefile
index 9e6400c1b4..4595055f01 100644
--- a/drivers/crypto/null/Makefile
+++ b/drivers/crypto/null/Makefile
@@ -14,9 +14,6 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
 LDLIBS += -lrte_cryptodev
 LDLIBS += -lrte_bus_vdev
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_null_crypto_version.map
 
diff --git a/drivers/crypto/octeontx/Makefile b/drivers/crypto/octeontx/Makefile
index 2752cbc364..08a99c8272 100644
--- a/drivers/crypto/octeontx/Makefile
+++ b/drivers/crypto/octeontx/Makefile
@@ -7,9 +7,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_pmd_octeontx_crypto.a
 
-# library version
-LIBABIVER := 1
-
 # build flags
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/drivers/crypto/octeontx2/Makefile b/drivers/crypto/octeontx2/Makefile
index ce116b87bc..f7d6c37527 100644
--- a/drivers/crypto/octeontx2/Makefile
+++ b/drivers/crypto/octeontx2/Makefile
@@ -7,9 +7,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_pmd_octeontx2_crypto.a
 
-# library version
-LIBABIVER := 1
-
 # build flags
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/drivers/crypto/openssl/Makefile b/drivers/crypto/openssl/Makefile
index ae6c3bcac1..58a26eced6 100644
--- a/drivers/crypto/openssl/Makefile
+++ b/drivers/crypto/openssl/Makefile
@@ -11,9 +11,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_openssl_version.map
 
diff --git a/drivers/crypto/scheduler/Makefile b/drivers/crypto/scheduler/Makefile
index a9514e3386..67aac024c4 100644
--- a/drivers/crypto/scheduler/Makefile
+++ b/drivers/crypto/scheduler/Makefile
@@ -13,9 +13,6 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
 LDLIBS += -lrte_cryptodev -lrte_kvargs -lrte_reorder
 LDLIBS += -lrte_bus_vdev
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_crypto_scheduler_version.map
 
diff --git a/drivers/crypto/snow3g/Makefile b/drivers/crypto/snow3g/Makefile
index 37f77dbf84..4086c571da 100644
--- a/drivers/crypto/snow3g/Makefile
+++ b/drivers/crypto/snow3g/Makefile
@@ -17,9 +17,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_snow3g_version.map
 
diff --git a/drivers/crypto/virtio/Makefile b/drivers/crypto/virtio/Makefile
index be7b828fe1..32e2e4d5e9 100644
--- a/drivers/crypto/virtio/Makefile
+++ b/drivers/crypto/virtio/Makefile
@@ -17,8 +17,6 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_crypto_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/crypto/zuc/Makefile b/drivers/crypto/zuc/Makefile
index 8d625aa01d..a01bb6ecbc 100644
--- a/drivers/crypto/zuc/Makefile
+++ b/drivers/crypto/zuc/Makefile
@@ -17,9 +17,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_zuc_version.map
 
diff --git a/drivers/event/dpaa/Makefile b/drivers/event/dpaa/Makefile
index befb21b1b6..2f53efdf9e 100644
--- a/drivers/event/dpaa/Makefile
+++ b/drivers/event/dpaa/Makefile
@@ -27,8 +27,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/crypto/dpaa_sec
 
 EXPORT_MAP := rte_pmd_dpaa_event_version.map
 
-LIBABIVER := 1
-
 # Interfaces with DPDK
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_DPAA_EVENTDEV) += dpaa_eventdev.c
 
diff --git a/drivers/event/dpaa2/Makefile b/drivers/event/dpaa2/Makefile
index a29284f046..5a584c9d6b 100644
--- a/drivers/event/dpaa2/Makefile
+++ b/drivers/event/dpaa2/Makefile
@@ -31,8 +31,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/crypto/dpaa2_sec
 # versioning export map
 EXPORT_MAP := rte_pmd_dpaa2_event_version.map
 
-LIBABIVER := 2
-
 # depends on fslmc bus which uses experimental API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/event/dpaa2/meson.build b/drivers/event/dpaa2/meson.build
index 72f97d4c1e..ca914ccc4d 100644
--- a/drivers/event/dpaa2/meson.build
+++ b/drivers/event/dpaa2/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 if not is_linux
 	build = false
 	reason = 'only supported on linux'
diff --git a/drivers/event/dsw/Makefile b/drivers/event/dsw/Makefile
index 922fe2e42b..f6e7dda1fd 100644
--- a/drivers/event/dsw/Makefile
+++ b/drivers/event/dsw/Makefile
@@ -18,8 +18,6 @@ LDLIBS += -lrte_ring
 LDLIBS += -lrte_eventdev
 LDLIBS += -lrte_bus_vdev
 
-LIBABIVER := 1
-
 EXPORT_MAP := rte_pmd_dsw_event_version.map
 
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_DSW_EVENTDEV) += \
diff --git a/drivers/event/octeontx/Makefile b/drivers/event/octeontx/Makefile
index 2c92ccb35d..c1233e098d 100644
--- a/drivers/event/octeontx/Makefile
+++ b/drivers/event/octeontx/Makefile
@@ -20,8 +20,6 @@ LDLIBS += -lrte_bus_vdev -lrte_ethdev
 
 EXPORT_MAP := rte_pmd_octeontx_event_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/event/octeontx2/Makefile b/drivers/event/octeontx2/Makefile
index 8289f617a4..6dab69c590 100644
--- a/drivers/event/octeontx2/Makefile
+++ b/drivers/event/octeontx2/Makefile
@@ -27,8 +27,6 @@ endif
 
 EXPORT_MAP := rte_pmd_octeontx2_event_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/event/opdl/Makefile b/drivers/event/opdl/Makefile
index bf50a60a0b..6aab556ad9 100644
--- a/drivers/event/opdl/Makefile
+++ b/drivers/event/opdl/Makefile
@@ -20,9 +20,6 @@ endif
 LDLIBS += -lrte_eal -lrte_eventdev -lrte_kvargs
 LDLIBS += -lrte_bus_vdev -lrte_mbuf -lrte_mempool
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_opdl_event_version.map
 
diff --git a/drivers/event/skeleton/Makefile b/drivers/event/skeleton/Makefile
index 0f7f07eaf1..dc85ad3c4b 100644
--- a/drivers/event/skeleton/Makefile
+++ b/drivers/event/skeleton/Makefile
@@ -16,8 +16,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_skeleton_event_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/event/sw/Makefile b/drivers/event/sw/Makefile
index c6600e8367..17937e295e 100644
--- a/drivers/event/sw/Makefile
+++ b/drivers/event/sw/Makefile
@@ -20,9 +20,6 @@ LDLIBS += -lrte_eal -lrte_eventdev -lrte_kvargs -lrte_ring
 LDLIBS += -lrte_mempool -lrte_mbuf
 LDLIBS += -lrte_bus_vdev
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_sw_event_version.map
 
diff --git a/drivers/mempool/bucket/Makefile b/drivers/mempool/bucket/Makefile
index d6660b09cd..1dc0079f8f 100644
--- a/drivers/mempool/bucket/Makefile
+++ b/drivers/mempool/bucket/Makefile
@@ -21,8 +21,6 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_ring
 
 EXPORT_MAP := rte_mempool_bucket_version.map
 
-LIBABIVER := 1
-
 SRCS-$(CONFIG_RTE_DRIVER_MEMPOOL_BUCKET) += rte_mempool_bucket.c
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/mempool/dpaa/Makefile b/drivers/mempool/dpaa/Makefile
index 534e00733c..8c786ddbeb 100644
--- a/drivers/mempool/dpaa/Makefile
+++ b/drivers/mempool/dpaa/Makefile
@@ -19,9 +19,6 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
 # versioning export map
 EXPORT_MAP := rte_mempool_dpaa_version.map
 
-# Lbrary version
-LIBABIVER := 1
-
 # depends on dpaa bus which uses experimental API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/mempool/dpaa2/Makefile b/drivers/mempool/dpaa2/Makefile
index bdb9410252..52565be9a9 100644
--- a/drivers/mempool/dpaa2/Makefile
+++ b/drivers/mempool/dpaa2/Makefile
@@ -18,9 +18,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/qbman/include
 # versioning export map
 EXPORT_MAP := rte_mempool_dpaa2_version.map
 
-# Lbrary version
-LIBABIVER := 2
-
 # depends on fslmc bus which uses experimental API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/mempool/dpaa2/meson.build b/drivers/mempool/dpaa2/meson.build
index 3d25ba06d9..d79fc31644 100644
--- a/drivers/mempool/dpaa2/meson.build
+++ b/drivers/mempool/dpaa2/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 if not is_linux
 	build = false
 	reason = 'only supported on linux'
diff --git a/drivers/mempool/octeontx/Makefile b/drivers/mempool/octeontx/Makefile
index 25efc5cf26..ee54c66dc2 100644
--- a/drivers/mempool/octeontx/Makefile
+++ b/drivers/mempool/octeontx/Makefile
@@ -15,8 +15,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_mempool_octeontx_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/mempool/octeontx2/Makefile b/drivers/mempool/octeontx2/Makefile
index 4961a4a35b..337babf66e 100644
--- a/drivers/mempool/octeontx2/Makefile
+++ b/drivers/mempool/octeontx2/Makefile
@@ -27,8 +27,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_mempool_octeontx2_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/mempool/ring/Makefile b/drivers/mempool/ring/Makefile
index ddab522fec..8624502da9 100644
--- a/drivers/mempool/ring/Makefile
+++ b/drivers/mempool/ring/Makefile
@@ -14,8 +14,6 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_ring
 
 EXPORT_MAP := rte_mempool_ring_version.map
 
-LIBABIVER := 1
-
 SRCS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING) += rte_mempool_ring.c
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/mempool/stack/Makefile b/drivers/mempool/stack/Makefile
index 1681a62bcc..97c3dab071 100644
--- a/drivers/mempool/stack/Makefile
+++ b/drivers/mempool/stack/Makefile
@@ -18,8 +18,6 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_stack
 
 EXPORT_MAP := rte_mempool_stack_version.map
 
-LIBABIVER := 1
-
 SRCS-$(CONFIG_RTE_DRIVER_MEMPOOL_STACK) += rte_mempool_stack.c
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/net/af_packet/Makefile b/drivers/net/af_packet/Makefile
index 39a1e0d24e..91dbf0a692 100644
--- a/drivers/net/af_packet/Makefile
+++ b/drivers/net/af_packet/Makefile
@@ -13,8 +13,6 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
-LIBABIVER := 1
-
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
diff --git a/drivers/net/af_xdp/Makefile b/drivers/net/af_xdp/Makefile
index eeba6b6933..55db6085ac 100644
--- a/drivers/net/af_xdp/Makefile
+++ b/drivers/net/af_xdp/Makefile
@@ -10,8 +10,6 @@ LIB = librte_pmd_af_xdp.a
 
 EXPORT_MAP := rte_pmd_af_xdp_version.map
 
-LIBABIVER := 1
-
 CFLAGS += -O3
 
 CFLAGS += $(WERROR_FLAGS)
diff --git a/drivers/net/ark/Makefile b/drivers/net/ark/Makefile
index 34d341c235..c02080bdd0 100644
--- a/drivers/net/ark/Makefile
+++ b/drivers/net/ark/Makefile
@@ -13,8 +13,6 @@ CFLAGS += $(WERROR_FLAGS) -Werror
 
 EXPORT_MAP := rte_pmd_ark_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/atlantic/Makefile b/drivers/net/atlantic/Makefile
index fc12e6a532..016e369283 100644
--- a/drivers/net/atlantic/Makefile
+++ b/drivers/net/atlantic/Makefile
@@ -14,8 +14,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_pmd_atlantic_version.map
 
-LIBABIVER := 1
-
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
 LDLIBS += -lrte_ethdev -lrte_net
 LDLIBS += -lrte_bus_pci
diff --git a/drivers/net/avp/Makefile b/drivers/net/avp/Makefile
index a7537656c9..8c12d3b7a0 100644
--- a/drivers/net/avp/Makefile
+++ b/drivers/net/avp/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_avp_version.map
 
-LIBABIVER := 1
-
 # install public header files to enable compilation of the hypervisor level
 # dpdk application
 SYMLINK-$(CONFIG_RTE_LIBRTE_AVP_PMD)-include += rte_avp_common.h
diff --git a/drivers/net/axgbe/Makefile b/drivers/net/axgbe/Makefile
index bcdcd544cf..0097a93074 100644
--- a/drivers/net/axgbe/Makefile
+++ b/drivers/net/axgbe/Makefile
@@ -14,8 +14,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_pmd_axgbe_version.map
 
-LIBABIVER := 1
-
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool
 LDLIBS += -lrte_pci -lrte_bus_pci
 LDLIBS += -lrte_ethdev -lrte_net
diff --git a/drivers/net/bnx2x/Makefile b/drivers/net/bnx2x/Makefile
index adead9d002..5f6c39e4ee 100644
--- a/drivers/net/bnx2x/Makefile
+++ b/drivers/net/bnx2x/Makefile
@@ -20,8 +20,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_bnx2x_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile
index 21a5650630..b77532b817 100644
--- a/drivers/net/bnxt/Makefile
+++ b/drivers/net/bnxt/Makefile
@@ -13,8 +13,6 @@ LIB = librte_pmd_bnxt.a
 
 EXPORT_MAP := rte_pmd_bnxt_version.map
 
-LIBABIVER := 2
-
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build
index 4dda28f5b0..0c311d235a 100644
--- a/drivers/net/bnxt/meson.build
+++ b/drivers/net/bnxt/meson.build
@@ -2,7 +2,6 @@
 # Copyright(c) 2018 Intel Corporation
 
 install_headers('rte_pmd_bnxt.h')
-version = 2
 sources = files('bnxt_cpr.c',
 	'bnxt_ethdev.c',
 	'bnxt_filter.c',
diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile
index 26c1782554..a64296d8cf 100644
--- a/drivers/net/bonding/Makefile
+++ b/drivers/net/bonding/Makefile
@@ -18,8 +18,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_bond_version.map
 
-LIBABIVER := 2
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/bonding/meson.build b/drivers/net/bonding/meson.build
index 6267210adf..d133375d4a 100644
--- a/drivers/net/bonding/meson.build
+++ b/drivers/net/bonding/meson.build
@@ -2,7 +2,6 @@
 # Copyright(c) 2017 Intel Corporation
 
 name = 'bond' #, james bond :-)
-version = 2
 allow_experimental_apis = true
 sources = files('rte_eth_bond_api.c', 'rte_eth_bond_pmd.c', 'rte_eth_bond_flow.c',
 	'rte_eth_bond_args.c', 'rte_eth_bond_8023ad.c', 'rte_eth_bond_alb.c')
diff --git a/drivers/net/cxgbe/Makefile b/drivers/net/cxgbe/Makefile
index d809f47209..79c6e1d1fb 100644
--- a/drivers/net/cxgbe/Makefile
+++ b/drivers/net/cxgbe/Makefile
@@ -14,8 +14,6 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_cxgbe_version.map
 
-LIBABIVER := 1
-
 #
 # CFLAGS for gcc/clang
 #
diff --git a/drivers/net/dpaa/Makefile b/drivers/net/dpaa/Makefile
index 395e4d900f..8e049b2a0b 100644
--- a/drivers/net/dpaa/Makefile
+++ b/drivers/net/dpaa/Makefile
@@ -25,8 +25,6 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
 
 EXPORT_MAP := rte_pmd_dpaa_version.map
 
-LIBABIVER := 1
-
 # depends on dpaa bus which uses experimental API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile
index e5a2d3fdee..806c88ff0c 100644
--- a/drivers/net/dpaa2/Makefile
+++ b/drivers/net/dpaa2/Makefile
@@ -24,9 +24,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/mempool/dpaa2
 # versioning export map
 EXPORT_MAP := rte_pmd_dpaa2_version.map
 
-# library version
-LIBABIVER := 2
-
 # depends on fslmc bus which uses experimental API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/net/dpaa2/meson.build b/drivers/net/dpaa2/meson.build
index 1a4ab212c2..571cdb7d4b 100644
--- a/drivers/net/dpaa2/meson.build
+++ b/drivers/net/dpaa2/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 if not is_linux
 	build = false
 	reason = 'only supported on linux'
diff --git a/drivers/net/e1000/Makefile b/drivers/net/e1000/Makefile
index 0ed6276568..d93a5225c3 100644
--- a/drivers/net/e1000/Makefile
+++ b/drivers/net/e1000/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
-LIBABIVER := 1
-
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
 # CFLAGS for icc
diff --git a/drivers/net/ena/Makefile b/drivers/net/ena/Makefile
index 8336b7606a..b44daa896f 100644
--- a/drivers/net/ena/Makefile
+++ b/drivers/net/ena/Makefile
@@ -12,8 +12,6 @@ CFLAGS += $(WERROR_FLAGS) -O2
 INCLUDES :=-I$(SRCDIR) -I$(SRCDIR)/base/ena_defs -I$(SRCDIR)/base
 
 EXPORT_MAP := rte_pmd_ena_version.map
-LIBABIVER := 1
-
 # rte_fbarray is not yet part of stable API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/net/enetc/Makefile b/drivers/net/enetc/Makefile
index 4498bc51f8..7276026e37 100644
--- a/drivers/net/enetc/Makefile
+++ b/drivers/net/enetc/Makefile
@@ -12,8 +12,6 @@ CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -I$(RTE_SDK)/drivers/common/dpaax
 EXPORT_MAP := rte_pmd_enetc_version.map
-LIBABIVER := 1
-
 SRCS-$(CONFIG_RTE_LIBRTE_ENETC_PMD) += enetc_ethdev.c
 SRCS-$(CONFIG_RTE_LIBRTE_ENETC_PMD) += enetc_rxtx.c
 
diff --git a/drivers/net/enic/Makefile b/drivers/net/enic/Makefile
index 4e0c83da56..316088a3c7 100644
--- a/drivers/net/enic/Makefile
+++ b/drivers/net/enic/Makefile
@@ -11,8 +11,6 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
-LIBABIVER := 1
-
 # Experimental APIs used: rte_intr_ack
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += -I$(SRCDIR)/base/
diff --git a/drivers/net/failsafe/Makefile b/drivers/net/failsafe/Makefile
index 0d840a2721..bebc9056e0 100644
--- a/drivers/net/failsafe/Makefile
+++ b/drivers/net/failsafe/Makefile
@@ -9,8 +9,6 @@ LIB = librte_pmd_failsafe.a
 
 EXPORT_MAP := rte_pmd_failsafe_version.map
 
-LIBABIVER := 1
-
 # Sources are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_FAILSAFE) += failsafe.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_FAILSAFE) += failsafe_args.c
diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile
index 55e9cd5035..722bf1ee04 100644
--- a/drivers/net/fm10k/Makefile
+++ b/drivers/net/fm10k/Makefile
@@ -14,8 +14,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_pmd_fm10k_version.map
 
-LIBABIVER := 1
-
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
 # CFLAGS for icc
diff --git a/drivers/net/hinic/Makefile b/drivers/net/hinic/Makefile
index b78fd8d535..87fd843e41 100644
--- a/drivers/net/hinic/Makefile
+++ b/drivers/net/hinic/Makefile
@@ -24,8 +24,6 @@ LDLIBS += -lpthread
 
 EXPORT_MAP := rte_pmd_hinic_version.map
 
-LIBABIVER := 1
-
 #
 # CFLAGS for 32-bits platforms
 #
diff --git a/drivers/net/hns3/Makefile b/drivers/net/hns3/Makefile
index cbbbe042e5..ae0ee7e931 100644
--- a/drivers/net/hns3/Makefile
+++ b/drivers/net/hns3/Makefile
@@ -23,8 +23,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_hns3_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/i40e/Makefile b/drivers/net/i40e/Makefile
index 1c3bbe329f..435eb511ad 100644
--- a/drivers/net/i40e/Makefile
+++ b/drivers/net/i40e/Makefile
@@ -19,8 +19,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
-LIBABIVER := 2
-
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/drivers/net/i40e/meson.build b/drivers/net/i40e/meson.build
index dcbca39bf7..b01babba1f 100644
--- a/drivers/net/i40e/meson.build
+++ b/drivers/net/i40e/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
-
 cflags += ['-DPF_DRIVER',
 	'-DVF_DRIVER',
 	'-DINTEGRATED_VF',
diff --git a/drivers/net/iavf/Makefile b/drivers/net/iavf/Makefile
index d3f9972f4f..81c9a0dbf2 100644
--- a/drivers/net/iavf/Makefile
+++ b/drivers/net/iavf/Makefile
@@ -15,8 +15,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_iavf_version.map
 
-LIBABIVER := 1
-
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/drivers/net/ice/Makefile b/drivers/net/ice/Makefile
index 7c3b6a7ffc..6c4d155268 100644
--- a/drivers/net/ice/Makefile
+++ b/drivers/net/ice/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_bus_pci -lrte_mempool -lrte_hash
 
 EXPORT_MAP := rte_pmd_ice_version.map
 
-LIBABIVER := 1
-
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/drivers/net/ifc/Makefile b/drivers/net/ifc/Makefile
index 7755a87ebb..fe227b8110 100644
--- a/drivers/net/ifc/Makefile
+++ b/drivers/net/ifc/Makefile
@@ -25,8 +25,6 @@ VPATH += $(SRCDIR)/base
 
 EXPORT_MAP := rte_pmd_ifc_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/ipn3ke/Makefile b/drivers/net/ipn3ke/Makefile
index 8c3ae3702d..100169ad4c 100644
--- a/drivers/net/ipn3ke/Makefile
+++ b/drivers/net/ipn3ke/Makefile
@@ -27,8 +27,6 @@ LDLIBS += -lpthread
 
 EXPORT_MAP := rte_pmd_ipn3ke_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/ixgbe/Makefile b/drivers/net/ixgbe/Makefile
index 7b6af35328..85762e2f2a 100644
--- a/drivers/net/ixgbe/Makefile
+++ b/drivers/net/ixgbe/Makefile
@@ -14,8 +14,6 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
-LIBABIVER := 2
-
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
 # CFLAGS for icc
diff --git a/drivers/net/ixgbe/meson.build b/drivers/net/ixgbe/meson.build
index 544a141484..1b0f6d1efe 100644
--- a/drivers/net/ixgbe/meson.build
+++ b/drivers/net/ixgbe/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
-
 cflags += ['-DRTE_LIBRTE_IXGBE_BYPASS']
 
 allow_experimental_apis = true
diff --git a/drivers/net/kni/Makefile b/drivers/net/kni/Makefile
index 01eaef0564..0694ffd021 100644
--- a/drivers/net/kni/Makefile
+++ b/drivers/net/kni/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_kni_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/liquidio/Makefile b/drivers/net/liquidio/Makefile
index f1092851a9..d7fda7f527 100644
--- a/drivers/net/liquidio/Makefile
+++ b/drivers/net/liquidio/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_liquidio_version.map
 
-LIBABIVER := 1
-
 VPATH += $(RTE_SDK)/drivers/net/liquidio/base
 
 #
diff --git a/drivers/net/memif/Makefile b/drivers/net/memif/Makefile
index 3d92b08f25..00f2a4cfc1 100644
--- a/drivers/net/memif/Makefile
+++ b/drivers/net/memif/Makefile
@@ -10,8 +10,6 @@ LIB = librte_pmd_memif.a
 
 EXPORT_MAP := rte_pmd_memif_version.map
 
-LIBABIVER := 1
-
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
diff --git a/drivers/net/mlx4/Makefile b/drivers/net/mlx4/Makefile
index 7ea6f74895..329569dc10 100644
--- a/drivers/net/mlx4/Makefile
+++ b/drivers/net/mlx4/Makefile
@@ -57,8 +57,6 @@ LDLIBS += -lrte_bus_pci
 CFLAGS += -Wno-error=cast-qual
 
 EXPORT_MAP := rte_pmd_mlx4_version.map
-LIBABIVER := 1
-
 # DEBUG which is usually provided on the command-line may enable
 # CONFIG_RTE_LIBRTE_MLX4_DEBUG.
 ifeq ($(DEBUG),1)
diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
index 5b79631cf5..c5cf4397ac 100644
--- a/drivers/net/mlx5/Makefile
+++ b/drivers/net/mlx5/Makefile
@@ -73,8 +73,6 @@ LDLIBS += -lrte_bus_pci
 CFLAGS += -Wno-error=cast-qual
 
 EXPORT_MAP := rte_pmd_mlx5_version.map
-LIBABIVER := 1
-
 # memseg walk is not part of stable API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/drivers/net/mvneta/Makefile b/drivers/net/mvneta/Makefile
index 05a0487cae..41e50479ff 100644
--- a/drivers/net/mvneta/Makefile
+++ b/drivers/net/mvneta/Makefile
@@ -16,9 +16,6 @@ endif
 # library name
 LIB = librte_pmd_mvneta.a
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_mvneta_version.map
 
diff --git a/drivers/net/mvpp2/Makefile b/drivers/net/mvpp2/Makefile
index 661d2cdac5..8a3ec93a60 100644
--- a/drivers/net/mvpp2/Makefile
+++ b/drivers/net/mvpp2/Makefile
@@ -16,9 +16,6 @@ endif
 # library name
 LIB = librte_pmd_mvpp2.a
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_pmd_mvpp2_version.map
 
diff --git a/drivers/net/netvsc/Makefile b/drivers/net/netvsc/Makefile
index 71482591a9..45526e2a8e 100644
--- a/drivers/net/netvsc/Makefile
+++ b/drivers/net/netvsc/Makefile
@@ -9,8 +9,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_pmd_netvsc_version.map
 
-LIBABIVER := 1
-
 SRCS-$(CONFIG_RTE_LIBRTE_NETVSC_PMD) += hn_ethdev.c
 SRCS-$(CONFIG_RTE_LIBRTE_NETVSC_PMD) += hn_rxtx.c
 SRCS-$(CONFIG_RTE_LIBRTE_NETVSC_PMD) += hn_rndis.c
diff --git a/drivers/net/netvsc/meson.build b/drivers/net/netvsc/meson.build
index e9fe35344b..131dd2866e 100644
--- a/drivers/net/netvsc/meson.build
+++ b/drivers/net/netvsc/meson.build
@@ -3,7 +3,6 @@
 
 build = dpdk_conf.has('RTE_LIBRTE_VMBUS_BUS')
 reason = 'missing dependency, DPDK VMBus driver'
-version = 2
 sources = files('hn_ethdev.c', 'hn_rxtx.c', 'hn_rndis.c', 'hn_nvs.c', 'hn_vf.c')
 
 deps += ['bus_vmbus' ]
diff --git a/drivers/net/nfb/Makefile b/drivers/net/nfb/Makefile
index 8bba2ac046..e92d29dcd3 100644
--- a/drivers/net/nfb/Makefile
+++ b/drivers/net/nfb/Makefile
@@ -23,8 +23,6 @@ LDLIBS += $(shell command -v pkg-config > /dev/null 2>&1 && pkg-config --libs ne
 
 EXPORT_MAP := rte_pmd_nfb_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/nfp/Makefile b/drivers/net/nfp/Makefile
index d3fa5699b9..aa720d6698 100644
--- a/drivers/net/nfp/Makefile
+++ b/drivers/net/nfp/Makefile
@@ -19,8 +19,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_nfp_version.map
 
-LIBABIVER := 1
-
 VPATH += $(SRCDIR)/nfpcore
 
 SRCS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += nfp_cppcore.c
diff --git a/drivers/net/null/Makefile b/drivers/net/null/Makefile
index 6d44dfae8c..f51150c131 100644
--- a/drivers/net/null/Makefile
+++ b/drivers/net/null/Makefile
@@ -16,8 +16,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_null_version.map
 
-LIBABIVER := 2
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/null/meson.build b/drivers/net/null/meson.build
index 60e2ce6c59..68ac0d2ae5 100644
--- a/drivers/net/null/meson.build
+++ b/drivers/net/null/meson.build
@@ -1,5 +1,4 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('rte_eth_null.c')
diff --git a/drivers/net/octeontx/Makefile b/drivers/net/octeontx/Makefile
index 885f176845..8ddfc30894 100644
--- a/drivers/net/octeontx/Makefile
+++ b/drivers/net/octeontx/Makefile
@@ -15,8 +15,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/mempool/octeontx/
 
 EXPORT_MAP := rte_pmd_octeontx_version.map
 
-LIBABIVER := 1
-
 OBJS_BASE_DRIVER=$(patsubst %.c,%.o,$(notdir $(wildcard $(SRCDIR)/base/*.c)))
 $(foreach obj, $(OBJS_BASE_DRIVER), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)))
 
diff --git a/drivers/net/octeontx2/Makefile b/drivers/net/octeontx2/Makefile
index 0bfcecabfe..68f5765db6 100644
--- a/drivers/net/octeontx2/Makefile
+++ b/drivers/net/octeontx2/Makefile
@@ -28,8 +28,6 @@ endif
 
 EXPORT_MAP := rte_pmd_octeontx2_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/pcap/Makefile b/drivers/net/pcap/Makefile
index ef332162c3..f243d1a0fa 100644
--- a/drivers/net/pcap/Makefile
+++ b/drivers/net/pcap/Makefile
@@ -19,8 +19,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/pfe/Makefile b/drivers/net/pfe/Makefile
index 91815fc0c6..e5c60f536b 100644
--- a/drivers/net/pfe/Makefile
+++ b/drivers/net/pfe/Makefile
@@ -15,8 +15,6 @@ CFLAGS += -I$(RTE_SDK)/drivers/net/pfe/base/
 CFLAGS += -I$(RTE_SDK)/drivers/common/dpaax
 
 EXPORT_MAP := rte_pmd_pfe_version.map
-LIBABIVER := 1
-
 # Driver uses below experimental APIs
 # rte_mem_iova2virt
 # rte_mem_virt2memseg
diff --git a/drivers/net/qede/Makefile b/drivers/net/qede/Makefile
index a11d5946a1..ada33800c4 100644
--- a/drivers/net/qede/Makefile
+++ b/drivers/net/qede/Makefile
@@ -19,8 +19,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_qede_version.map
 
-LIBABIVER := 1
-
 #
 # OS
 #
diff --git a/drivers/net/ring/Makefile b/drivers/net/ring/Makefile
index 517312e0e0..d6a3dec350 100644
--- a/drivers/net/ring/Makefile
+++ b/drivers/net/ring/Makefile
@@ -16,8 +16,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_ring_version.map
 
-LIBABIVER := 2
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/ring/meson.build b/drivers/net/ring/meson.build
index 7659b04f87..e877a4b4bd 100644
--- a/drivers/net/ring/meson.build
+++ b/drivers/net/ring/meson.build
@@ -1,6 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('rte_eth_ring.c')
 install_headers('rte_eth_ring.h')
diff --git a/drivers/net/sfc/Makefile b/drivers/net/sfc/Makefile
index 7dd660dadf..1f9c0bc3e0 100644
--- a/drivers/net/sfc/Makefile
+++ b/drivers/net/sfc/Makefile
@@ -62,8 +62,6 @@ $(foreach obj, $(BASE_DRIVER_OBJS), \
 
 EXPORT_MAP := rte_pmd_sfc_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/softnic/Makefile b/drivers/net/softnic/Makefile
index 71cfd45ad8..5068ffa18a 100644
--- a/drivers/net/softnic/Makefile
+++ b/drivers/net/softnic/Makefile
@@ -19,8 +19,6 @@ LDLIBS += -lrte_bus_vdev
 
 EXPORT_MAP := rte_pmd_softnic_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/szedata2/Makefile b/drivers/net/szedata2/Makefile
index b77fae16db..675d0938a2 100644
--- a/drivers/net/szedata2/Makefile
+++ b/drivers/net/szedata2/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_szedata2_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/tap/Makefile b/drivers/net/tap/Makefile
index 774828386d..088fa8f9a9 100644
--- a/drivers/net/tap/Makefile
+++ b/drivers/net/tap/Makefile
@@ -10,8 +10,6 @@ LIB = librte_pmd_tap.a
 
 EXPORT_MAP := rte_pmd_tap_version.map
 
-LIBABIVER := 1
-
 #
 # TAP_MAX_QUEUES must be a power of 2
 #
diff --git a/drivers/net/thunderx/Makefile b/drivers/net/thunderx/Makefile
index e6bf497522..149638a499 100644
--- a/drivers/net/thunderx/Makefile
+++ b/drivers/net/thunderx/Makefile
@@ -18,8 +18,6 @@ LDLIBS += -lrte_bus_pci
 
 EXPORT_MAP := rte_pmd_thunderx_version.map
 
-LIBABIVER := 1
-
 OBJS_BASE_DRIVER=$(sort $(patsubst %.c,%.o,$(notdir $(wildcard $(SRCDIR)/base/*.c))))
 $(foreach obj, $(OBJS_BASE_DRIVER), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)))
 
diff --git a/drivers/net/vdev_netvsc/Makefile b/drivers/net/vdev_netvsc/Makefile
index 690cb8f88d..9cd81225b3 100644
--- a/drivers/net/vdev_netvsc/Makefile
+++ b/drivers/net/vdev_netvsc/Makefile
@@ -6,7 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 # Properties of the generated library.
 LIB = librte_pmd_vdev_netvsc.a
-LIBABIVER := 1
 EXPORT_MAP := rte_pmd_vdev_netvsc_version.map
 
 # Additional compilation flags.
diff --git a/drivers/net/vhost/Makefile b/drivers/net/vhost/Makefile
index 83b5a8b8e7..0461e29f2c 100644
--- a/drivers/net/vhost/Makefile
+++ b/drivers/net/vhost/Makefile
@@ -18,8 +18,6 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_vhost_version.map
 
-LIBABIVER := 2
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/vhost/meson.build b/drivers/net/vhost/meson.build
index 9532a76050..d7930862a7 100644
--- a/drivers/net/vhost/meson.build
+++ b/drivers/net/vhost/meson.build
@@ -3,7 +3,6 @@
 
 build = dpdk_conf.has('RTE_LIBRTE_VHOST')
 reason = 'missing dependency, DPDK vhost library'
-version = 2
 sources = files('rte_eth_vhost.c')
 install_headers('rte_eth_vhost.h')
 deps += 'vhost'
diff --git a/drivers/net/virtio/Makefile b/drivers/net/virtio/Makefile
index 5144e7cc4a..efdcb0d93f 100644
--- a/drivers/net/virtio/Makefile
+++ b/drivers/net/virtio/Makefile
@@ -20,8 +20,6 @@ endif
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/net/vmxnet3/Makefile b/drivers/net/vmxnet3/Makefile
index f1141da674..3a63cf2e91 100644
--- a/drivers/net/vmxnet3/Makefile
+++ b/drivers/net/vmxnet3/Makefile
@@ -45,8 +45,6 @@ VPATH += $(SRCDIR)/base
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/raw/dpaa2_cmdif/Makefile b/drivers/raw/dpaa2_cmdif/Makefile
index a7c9802476..f671a30ccf 100644
--- a/drivers/raw/dpaa2_cmdif/Makefile
+++ b/drivers/raw/dpaa2_cmdif/Makefile
@@ -26,8 +26,6 @@ LDLIBS += -lrte_common_dpaax
 
 EXPORT_MAP := rte_rawdev_dpaa2_cmdif_version.map
 
-LIBABIVER := 2
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/raw/dpaa2_cmdif/meson.build b/drivers/raw/dpaa2_cmdif/meson.build
index 9ba1ae2dea..70247622bc 100644
--- a/drivers/raw/dpaa2_cmdif/meson.build
+++ b/drivers/raw/dpaa2_cmdif/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 build = dpdk_conf.has('RTE_LIBRTE_DPAA2_MEMPOOL')
 reason = 'missing dependency, DPDK DPAA2 mempool driver'
 deps += ['rawdev', 'mempool_dpaa2', 'bus_vdev']
diff --git a/drivers/raw/dpaa2_qdma/Makefile b/drivers/raw/dpaa2_qdma/Makefile
index 057b2a81a2..fc5b3435b0 100644
--- a/drivers/raw/dpaa2_qdma/Makefile
+++ b/drivers/raw/dpaa2_qdma/Makefile
@@ -27,8 +27,6 @@ LDLIBS += -lrte_common_dpaax
 
 EXPORT_MAP := rte_rawdev_dpaa2_qdma_version.map
 
-LIBABIVER := 3
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/raw/dpaa2_qdma/meson.build b/drivers/raw/dpaa2_qdma/meson.build
index f70ade3b4d..fe166d9183 100644
--- a/drivers/raw/dpaa2_qdma/meson.build
+++ b/drivers/raw/dpaa2_qdma/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright 2018 NXP
 
-version = 2
-
 build = dpdk_conf.has('RTE_LIBRTE_DPAA2_MEMPOOL')
 reason = 'missing dependency, DPDK DPAA2 mempool driver'
 deps += ['rawdev', 'mempool_dpaa2', 'ring', 'kvargs']
diff --git a/drivers/raw/ifpga/Makefile b/drivers/raw/ifpga/Makefile
index 655b292883..b041a2bd70 100644
--- a/drivers/raw/ifpga/Makefile
+++ b/drivers/raw/ifpga/Makefile
@@ -23,8 +23,6 @@ LDLIBS += -lrte_bus_ifpga
 
 EXPORT_MAP := rte_rawdev_ifpga_version.map
 
-LIBABIVER := 1
-
 VPATH += $(SRCDIR)/base
 
 include $(RTE_SDK)/drivers/raw/ifpga/base/Makefile
diff --git a/drivers/raw/ifpga/meson.build b/drivers/raw/ifpga/meson.build
index 0ab6fd7110..5a221cd405 100644
--- a/drivers/raw/ifpga/meson.build
+++ b/drivers/raw/ifpga/meson.build
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2018 Intel Corporation
 
-version = 1
-
 subdir('base')
 objs = [base_objs]
 
diff --git a/drivers/raw/ioat/Makefile b/drivers/raw/ioat/Makefile
index e852afb57c..1609fe5e6c 100644
--- a/drivers/raw/ioat/Makefile
+++ b/drivers/raw/ioat/Makefile
@@ -14,9 +14,6 @@ LDLIBS += -lrte_eal -lrte_rawdev
 LDLIBS += -lrte_pci -lrte_bus_pci
 LDLIBS += -lrte_mbuf -lrte_mempool
 
-# library version
-LIBABIVER := 1
-
 # versioning export map
 EXPORT_MAP := rte_rawdev_ioat_version.map
 
diff --git a/drivers/raw/ntb/Makefile b/drivers/raw/ntb/Makefile
index 814cd05ca1..d69b4306bc 100644
--- a/drivers/raw/ntb/Makefile
+++ b/drivers/raw/ntb/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_rawdev
 
 EXPORT_MAP := rte_rawdev_ntb_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/raw/octeontx2_dma/Makefile b/drivers/raw/octeontx2_dma/Makefile
index f101e4916e..c64ca3497a 100644
--- a/drivers/raw/octeontx2_dma/Makefile
+++ b/drivers/raw/octeontx2_dma/Makefile
@@ -24,8 +24,6 @@ endif
 
 EXPORT_MAP := rte_rawdev_octeontx2_dma_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/drivers/raw/skeleton/Makefile b/drivers/raw/skeleton/Makefile
index 783b1e9522..2ac66fbd45 100644
--- a/drivers/raw/skeleton/Makefile
+++ b/drivers/raw/skeleton/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -lrte_kvargs
 
 EXPORT_MAP := rte_rawdev_skeleton_version.map
 
-LIBABIVER := 1
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/examples/ethtool/lib/Makefile b/examples/ethtool/lib/Makefile
index 9da7dc3ba2..47cad4a1bc 100644
--- a/examples/ethtool/lib/Makefile
+++ b/examples/ethtool/lib/Makefile
@@ -18,8 +18,6 @@ endif
 # library name
 LIB = librte_ethtool.a
 
-LIBABIVER := 1
-
 # all source are stored in SRC-Y
 SRCS-y := rte_ethtool.c
 
diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index ea5edf00ab..f4332b0448 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_acl_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build
index 98ece7d85f..d1e2c184cc 100644
--- a/lib/librte_acl/meson.build
+++ b/lib/librte_acl/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c',
 		'rte_acl.c', 'tb_mem.c')
 headers = files('rte_acl.h', 'rte_acl_osdep.h')
diff --git a/lib/librte_bbdev/Makefile b/lib/librte_bbdev/Makefile
index 1451adb25d..cdabf64f47 100644
--- a/lib/librte_bbdev/Makefile
+++ b/lib/librte_bbdev/Makefile
@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_bbdev.a
 
-# library version
-LIBABIVER := 1
-
 # build flags
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += -O3
diff --git a/lib/librte_bitratestats/Makefile b/lib/librte_bitratestats/Makefile
index 59318388dd..4862c44b83 100644
--- a/lib/librte_bitratestats/Makefile
+++ b/lib/librte_bitratestats/Makefile
@@ -11,8 +11,6 @@ LDLIBS += -lrte_eal -lrte_metrics -lrte_ethdev
 
 EXPORT_MAP := rte_bitratestats_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_BITRATE) := rte_bitrate.c
 
diff --git a/lib/librte_bitratestats/meson.build b/lib/librte_bitratestats/meson.build
index c35b62b3dc..ede7e0a579 100644
--- a/lib/librte_bitratestats/meson.build
+++ b/lib/librte_bitratestats/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('rte_bitrate.c')
 headers = files('rte_bitrate.h')
 deps += ['ethdev', 'metrics']
diff --git a/lib/librte_bpf/Makefile b/lib/librte_bpf/Makefile
index 419a5162e0..3a20f95e74 100644
--- a/lib/librte_bpf/Makefile
+++ b/lib/librte_bpf/Makefile
@@ -18,8 +18,6 @@ endif
 
 EXPORT_MAP := rte_bpf_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_BPF) += bpf.c
 SRCS-$(CONFIG_RTE_LIBRTE_BPF) += bpf_exec.c
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 2c7115f417..d3b08420ff 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -15,8 +15,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_cfgfile_version.map
 
-LIBABIVER := 2
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/meson.build b/lib/librte_cfgfile/meson.build
index d97b38bc6f..88eb819856 100644
--- a/lib/librte_cfgfile/meson.build
+++ b/lib/librte_cfgfile/meson.build
@@ -1,6 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('rte_cfgfile.c')
 headers = files('rte_cfgfile.h')
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 04057d7c67..5bcaecc338 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -11,8 +11,6 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 EXPORT_MAP := rte_cmdline_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/meson.build b/lib/librte_cmdline/meson.build
index 07334c1b09..a7dd319664 100644
--- a/lib/librte_cmdline/meson.build
+++ b/lib/librte_cmdline/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 allow_experimental_apis = true
 sources = files('cmdline.c',
 	'cmdline_cirbuf.c',
diff --git a/lib/librte_compressdev/Makefile b/lib/librte_compressdev/Makefile
index 7ef89e6130..112cdc5b28 100644
--- a/lib/librte_compressdev/Makefile
+++ b/lib/librte_compressdev/Makefile
@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_compressdev.a
 
-# library version
-LIBABIVER := 1
-
 # build flags
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile
index 55d352a23a..7fac49afa3 100644
--- a/lib/librte_cryptodev/Makefile
+++ b/lib/librte_cryptodev/Makefile
@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_cryptodev.a
 
-# library version
-LIBABIVER := 8
-
 # build flags
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/lib/librte_cryptodev/meson.build b/lib/librte_cryptodev/meson.build
index 0a2275d75b..49bae03a88 100644
--- a/lib/librte_cryptodev/meson.build
+++ b/lib/librte_cryptodev/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017-2019 Intel Corporation
 
-version = 8
 allow_experimental_apis = true
 sources = files('rte_cryptodev.c', 'rte_cryptodev_pmd.c')
 headers = files('rte_cryptodev.h',
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 0ef80dcff4..a687f4a0f0 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_ethdev
 
 EXPORT_MAP := rte_distributor_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_v20.c
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor.c
diff --git a/lib/librte_eal/freebsd/eal/Makefile b/lib/librte_eal/freebsd/eal/Makefile
index f530f568b6..b160b57906 100644
--- a/lib/librte_eal/freebsd/eal/Makefile
+++ b/lib/librte_eal/freebsd/eal/Makefile
@@ -22,8 +22,6 @@ LDLIBS += -lrte_kvargs
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 12
-
 # specific to freebsd exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) := eal.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_cpuflags.c
diff --git a/lib/librte_eal/linux/eal/Makefile b/lib/librte_eal/linux/eal/Makefile
index 7628e57119..e70cf104a4 100644
--- a/lib/librte_eal/linux/eal/Makefile
+++ b/lib/librte_eal/linux/eal/Makefile
@@ -10,8 +10,6 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 12
-
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -DALLOW_EXPERIMENTAL_API
diff --git a/lib/librte_efd/Makefile b/lib/librte_efd/Makefile
index 5f5fcfcea2..2dc97132e0 100644
--- a/lib/librte_efd/Makefile
+++ b/lib/librte_efd/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_ring -lrte_hash
 
 EXPORT_MAP := rte_efd_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_EFD) := rte_efd.c
 
diff --git a/lib/librte_ethdev/Makefile b/lib/librte_ethdev/Makefile
index 0efcdfa64d..b627e4e23b 100644
--- a/lib/librte_ethdev/Makefile
+++ b/lib/librte_ethdev/Makefile
@@ -16,8 +16,6 @@ LDLIBS += -lrte_mbuf -lrte_kvargs -lrte_meter
 
 EXPORT_MAP := rte_ethdev_version.map
 
-LIBABIVER := 13
-
 SRCS-y += ethdev_private.c
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_class_eth.c
diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
index c22cf81401..3537f22f59 100644
--- a/lib/librte_ethdev/meson.build
+++ b/lib/librte_ethdev/meson.build
@@ -2,7 +2,6 @@
 # Copyright(c) 2017 Intel Corporation
 
 name = 'ethdev'
-version = 13
 allow_experimental_apis = true
 sources = files('ethdev_private.c',
 	'ethdev_profile.c',
diff --git a/lib/librte_eventdev/Makefile b/lib/librte_eventdev/Makefile
index 9e6a99aa15..1052ccdbb5 100644
--- a/lib/librte_eventdev/Makefile
+++ b/lib/librte_eventdev/Makefile
@@ -7,9 +7,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_eventdev.a
 
-# library version
-LIBABIVER := 8
-
 # build flags
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += -O3
diff --git a/lib/librte_eventdev/meson.build b/lib/librte_eventdev/meson.build
index 9ba6c0393b..02ac61ad2c 100644
--- a/lib/librte_eventdev/meson.build
+++ b/lib/librte_eventdev/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 8
 allow_experimental_apis = true
 
 if is_linux
diff --git a/lib/librte_fib/Makefile b/lib/librte_fib/Makefile
index 4abd80be68..7773427d19 100644
--- a/lib/librte_fib/Makefile
+++ b/lib/librte_fib/Makefile
@@ -14,8 +14,6 @@ LDLIBS += -lrte_eal -lrte_rib
 
 EXPORT_MAP := rte_fib_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_FIB) := rte_fib.c rte_fib6.c dir24_8.c trie.c
 
diff --git a/lib/librte_flow_classify/Makefile b/lib/librte_flow_classify/Makefile
index fe9fc47ab6..34298af1a4 100644
--- a/lib/librte_flow_classify/Makefile
+++ b/lib/librte_flow_classify/Makefile
@@ -12,8 +12,6 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_flow_classify_version.map
 
-LIBABIVER := 1
-
 LDLIBS += -lrte_eal -lrte_ethdev -lrte_net -lrte_table -lrte_acl
 
 # all source are stored in SRCS-y
diff --git a/lib/librte_gro/Makefile b/lib/librte_gro/Makefile
index bec248f922..e848687acd 100644
--- a/lib/librte_gro/Makefile
+++ b/lib/librte_gro/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_ethdev -lrte_net
 
 EXPORT_MAP := rte_gro_version.map
 
-LIBABIVER := 1
-
 # source files
 SRCS-$(CONFIG_RTE_LIBRTE_GRO) += rte_gro.c
 SRCS-$(CONFIG_RTE_LIBRTE_GRO) += gro_tcp4.c
diff --git a/lib/librte_gso/Makefile b/lib/librte_gso/Makefile
index 1fac53a8f4..a34846e920 100644
--- a/lib/librte_gso/Makefile
+++ b/lib/librte_gso/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_mempool
 
 EXPORT_MAP := rte_gso_version.map
 
-LIBABIVER := 1
-
 #source files
 SRCS-$(CONFIG_RTE_LIBRTE_GSO) += rte_gso.c
 SRCS-$(CONFIG_RTE_LIBRTE_GSO) += gso_common.c
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 5669d83f45..9b36097f47 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_ring
 
 EXPORT_MAP := rte_hash_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_cuckoo_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/meson.build b/lib/librte_hash/meson.build
index ebf70de890..5d02b3084f 100644
--- a/lib/librte_hash/meson.build
+++ b/lib/librte_hash/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 headers = files('rte_cmp_arm64.h',
 	'rte_cmp_x86.h',
 	'rte_crc_arm64.h',
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 4c3dc4d375..6b80d9f1f2 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -13,8 +13,6 @@ LDLIBS += -lrte_hash
 
 EXPORT_MAP := rte_ip_frag_version.map
 
-LIBABIVER := 1
-
 #source files
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv6_fragmentation.c
diff --git a/lib/librte_ipsec/Makefile b/lib/librte_ipsec/Makefile
index 161ea9e3d9..f74e8a9045 100644
--- a/lib/librte_ipsec/Makefile
+++ b/lib/librte_ipsec/Makefile
@@ -14,8 +14,6 @@ LDLIBS += -lrte_cryptodev -lrte_security -lrte_hash
 
 EXPORT_MAP := rte_ipsec_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IPSEC) += esp_inb.c
 SRCS-$(CONFIG_RTE_LIBRTE_IPSEC) += esp_outb.c
diff --git a/lib/librte_ipsec/meson.build b/lib/librte_ipsec/meson.build
index e8604dadd9..70358526b0 100644
--- a/lib/librte_ipsec/meson.build
+++ b/lib/librte_ipsec/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2018 Intel Corporation
 
-version = 2
 allow_experimental_apis = true
 
 sources = files('esp_inb.c', 'esp_outb.c', 'sa.c', 'ses.c', 'ipsec_sad.c')
diff --git a/lib/librte_jobstats/Makefile b/lib/librte_jobstats/Makefile
index 35e788f7fc..b30d046829 100644
--- a/lib/librte_jobstats/Makefile
+++ b/lib/librte_jobstats/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_jobstats_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_JOBSTATS) := rte_jobstats.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index cbd6599ec2..9d440aa135 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -11,8 +11,6 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_mbuf -lrte_ethdev
 
 EXPORT_MAP := rte_kni_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/meson.build b/lib/librte_kni/meson.build
index 41fa2e39bb..963eae6fe0 100644
--- a/lib/librte_kni/meson.build
+++ b/lib/librte_kni/meson.build
@@ -5,7 +5,6 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
 	build = false
 	reason = 'only supported on 64-bit linux'
 endif
-version = 2
 sources = files('rte_kni.c')
 headers = files('rte_kni.h')
 deps += ['ethdev', 'pci']
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index 8759395478..419be8bd7c 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -11,8 +11,6 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
 
 EXPORT_MAP := rte_kvargs_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/meson.build b/lib/librte_kvargs/meson.build
index ecaedf5a59..b746516965 100644
--- a/lib/librte_kvargs/meson.build
+++ b/lib/librte_kvargs/meson.build
@@ -3,6 +3,5 @@
 
 includes = [global_inc]
 
-version = 1
 sources = files('rte_kvargs.c')
 headers = files('rte_kvargs.h')
diff --git a/lib/librte_latencystats/Makefile b/lib/librte_latencystats/Makefile
index ae0dbd8f06..b19e0b1788 100644
--- a/lib/librte_latencystats/Makefile
+++ b/lib/librte_latencystats/Makefile
@@ -13,8 +13,6 @@ LDLIBS += -lrte_eal -lrte_metrics -lrte_ethdev -lrte_mbuf
 
 EXPORT_MAP := rte_latencystats_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LATENCY_STATS) := rte_latencystats.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index a7946a1c52..d682785b63 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_hash
 
 EXPORT_MAP := rte_lpm_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/meson.build b/lib/librte_lpm/meson.build
index 4e3920660b..27ce45b531 100644
--- a/lib/librte_lpm/meson.build
+++ b/lib/librte_lpm/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('rte_lpm.c', 'rte_lpm6.c')
 headers = files('rte_lpm.h', 'rte_lpm6.h')
 # since header files have different names, we can install all vector headers
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 019c8dd8ff..9f6e6387f9 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -13,8 +13,6 @@ LDLIBS += -lrte_eal -lrte_mempool
 
 EXPORT_MAP := rte_mbuf_version.map
 
-LIBABIVER := 5
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c rte_mbuf_ptype.c rte_mbuf_pool_ops.c
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) += rte_mbuf_dyn.c
diff --git a/lib/librte_mbuf/meson.build b/lib/librte_mbuf/meson.build
index 59fd07224d..d9b53b6ae3 100644
--- a/lib/librte_mbuf/meson.build
+++ b/lib/librte_mbuf/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 5
 sources = files('rte_mbuf.c', 'rte_mbuf_ptype.c', 'rte_mbuf_pool_ops.c',
 	'rte_mbuf_dyn.c')
 headers = files('rte_mbuf.h', 'rte_mbuf_core.h',
diff --git a/lib/librte_member/Makefile b/lib/librte_member/Makefile
index e9580c9679..ef9e2faeaf 100644
--- a/lib/librte_member/Makefile
+++ b/lib/librte_member/Makefile
@@ -14,8 +14,6 @@ LDLIBS += -lrte_eal -lrte_hash
 
 EXPORT_MAP := rte_member_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMBER) +=  rte_member.c rte_member_ht.c rte_member_vbf.c
 # install includes
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 20bf63fbca..a5649050b1 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_ring
 
 EXPORT_MAP := rte_mempool_version.map
 
-LIBABIVER := 5
-
 # memseg walk is not yet part of stable API
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
diff --git a/lib/librte_mempool/meson.build b/lib/librte_mempool/meson.build
index 38d7ae8905..f8710b61bc 100644
--- a/lib/librte_mempool/meson.build
+++ b/lib/librte_mempool/meson.build
@@ -11,7 +11,6 @@ foreach flag: extra_flags
 	endif
 endforeach
 
-version = 5
 sources = files('rte_mempool.c', 'rte_mempool_ops.c',
 		'rte_mempool_ops_default.c')
 headers = files('rte_mempool.h')
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index 79ad79744f..48366e82b0 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -16,8 +16,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_meter_version.map
 
-LIBABIVER := 3
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/meson.build b/lib/librte_meter/meson.build
index 422123e203..646fd4d43f 100644
--- a/lib/librte_meter/meson.build
+++ b/lib/librte_meter/meson.build
@@ -1,6 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 3
 sources = files('rte_meter.c')
 headers = files('rte_meter.h')
diff --git a/lib/librte_metrics/Makefile b/lib/librte_metrics/Makefile
index 20e242f736..6b385f5cf1 100644
--- a/lib/librte_metrics/Makefile
+++ b/lib/librte_metrics/Makefile
@@ -11,8 +11,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_metrics_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_METRICS) := rte_metrics.c
 
diff --git a/lib/librte_net/Makefile b/lib/librte_net/Makefile
index c79f84d7c6..aabdf4879d 100644
--- a/lib/librte_net/Makefile
+++ b/lib/librte_net/Makefile
@@ -10,8 +10,6 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 LDLIBS += -lrte_mbuf -lrte_eal -lrte_mempool
 
 EXPORT_MAP := rte_net_version.map
-LIBABIVER := 1
-
 SRCS-$(CONFIG_RTE_LIBRTE_NET) := rte_net.c
 SRCS-$(CONFIG_RTE_LIBRTE_NET) += rte_net_crc.c
 SRCS-$(CONFIG_RTE_LIBRTE_NET) += rte_ether.c
diff --git a/lib/librte_net/meson.build b/lib/librte_net/meson.build
index 090284b688..208eee2dc2 100644
--- a/lib/librte_net/meson.build
+++ b/lib/librte_net/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 1
 allow_experimental_apis = true
 headers = files('rte_ip.h',
 	'rte_tcp.h',
diff --git a/lib/librte_pci/Makefile b/lib/librte_pci/Makefile
index 4c2682eadd..7943f30cab 100644
--- a/lib/librte_pci/Makefile
+++ b/lib/librte_pci/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_pci_version.map
 
-LIBABIVER := 2
-
 SRCS-$(CONFIG_RTE_LIBRTE_PCI) += rte_pci.c
 
 SYMLINK-$(CONFIG_RTE_LIBRTE_PCI)-include += rte_pci.h
diff --git a/lib/librte_pci/meson.build b/lib/librte_pci/meson.build
index 376f04ac65..dd41cd5068 100644
--- a/lib/librte_pci/meson.build
+++ b/lib/librte_pci/meson.build
@@ -1,7 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
-
 sources = files('rte_pci.c')
 headers = files('rte_pci.h')
diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile
index 89593689a7..fde8ac92b8 100644
--- a/lib/librte_pdump/Makefile
+++ b/lib/librte_pdump/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_mbuf -lrte_ethdev
 
 EXPORT_MAP := rte_pdump_version.map
 
-LIBABIVER := 3
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c
 
diff --git a/lib/librte_pdump/meson.build b/lib/librte_pdump/meson.build
index b4b4f26c56..1173cdea34 100644
--- a/lib/librte_pdump/meson.build
+++ b/lib/librte_pdump/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 3
 sources = files('rte_pdump.c')
 headers = files('rte_pdump.h')
 allow_experimental_apis = true
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf265503f7..d2abb5f3ff 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -16,8 +16,6 @@ LDLIBS += -lrte_port -lrte_meter -lrte_sched -lrte_cryptodev
 
 EXPORT_MAP := rte_pipeline_version.map
 
-LIBABIVER := 3
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/meson.build b/lib/librte_pipeline/meson.build
index 04e5f51798..be8a3536af 100644
--- a/lib/librte_pipeline/meson.build
+++ b/lib/librte_pipeline/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 3
 allow_experimental_apis = true
 sources = files('rte_pipeline.c', 'rte_port_in_action.c', 'rte_table_action.c')
 headers = files('rte_pipeline.h', 'rte_port_in_action.h', 'rte_table_action.h')
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index de6f0428a4..57d2aedbc5 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -21,8 +21,6 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
-LIBABIVER := 3
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/meson.build b/lib/librte_port/meson.build
index a232cb587b..0d5ede44a0 100644
--- a/lib/librte_port/meson.build
+++ b/lib/librte_port/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 3
 sources = files(
 	'rte_port_ethdev.c',
 	'rte_port_fd.c',
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index ab771528fe..9a6db07e5f 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_timer
 
 EXPORT_MAP := rte_power_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_rawdev/Makefile b/lib/librte_rawdev/Makefile
index addb288d76..7dd1197dcd 100644
--- a/lib/librte_rawdev/Makefile
+++ b/lib/librte_rawdev/Makefile
@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_rawdev.a
 
-# library version
-LIBABIVER := 1
-
 # build flags
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/lib/librte_rcu/Makefile b/lib/librte_rcu/Makefile
index 6aa677bd12..c4bb28d779 100644
--- a/lib/librte_rcu/Makefile
+++ b/lib/librte_rcu/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_rcu_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RCU) := rte_rcu_qsbr.c
 
diff --git a/lib/librte_reorder/Makefile b/lib/librte_reorder/Makefile
index f19c624bd0..1914411d52 100644
--- a/lib/librte_reorder/Makefile
+++ b/lib/librte_reorder/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_mbuf
 
 EXPORT_MAP := rte_reorder_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_REORDER) := rte_reorder.c
 
diff --git a/lib/librte_rib/Makefile b/lib/librte_rib/Makefile
index 6d861adb1c..4a1df4e06a 100644
--- a/lib/librte_rib/Makefile
+++ b/lib/librte_rib/Makefile
@@ -14,8 +14,6 @@ LDLIBS += -lrte_eal -lrte_mempool
 
 EXPORT_MAP := rte_rib_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RIB) := rte_rib.c rte_rib6.c
 
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 21a36770d4..22454b0848 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -11,8 +11,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_ring_version.map
 
-LIBABIVER := 2
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/meson.build b/lib/librte_ring/meson.build
index ab8b0b469b..ca8a435e90 100644
--- a/lib/librte_ring/meson.build
+++ b/lib/librte_ring/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 2
 sources = files('rte_ring.c')
 headers = files('rte_ring.h',
 		'rte_ring_c11_mem.h',
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 6e4a72d896..aee93a1205 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -18,8 +18,6 @@ LDLIBS += -lrte_timer
 
 EXPORT_MAP := rte_sched_version.map
 
-LIBABIVER := 4
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/meson.build b/lib/librte_sched/meson.build
index 9f40a2368f..f85d64df81 100644
--- a/lib/librte_sched/meson.build
+++ b/lib/librte_sched/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 4
 sources = files('rte_sched.c', 'rte_red.c', 'rte_approx.c')
 headers = files('rte_sched.h', 'rte_sched_common.h',
 		'rte_red.h', 'rte_approx.h')
diff --git a/lib/librte_security/Makefile b/lib/librte_security/Makefile
index 6a268ee2a7..825eaeff8e 100644
--- a/lib/librte_security/Makefile
+++ b/lib/librte_security/Makefile
@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_security.a
 
-# library version
-LIBABIVER := 3
-
 # build flags
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/lib/librte_security/meson.build b/lib/librte_security/meson.build
index 6fed012731..5679c8b5c2 100644
--- a/lib/librte_security/meson.build
+++ b/lib/librte_security/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017-2019 Intel Corporation
 
-version = 3
 sources = files('rte_security.c')
 headers = files('rte_security.h', 'rte_security_driver.h')
 deps += ['mempool', 'cryptodev']
diff --git a/lib/librte_stack/Makefile b/lib/librte_stack/Makefile
index b5e5bed7cf..94ee48d4b3 100644
--- a/lib/librte_stack/Makefile
+++ b/lib/librte_stack/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_stack_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_STACK) := rte_stack.c \
 				   rte_stack_std.c \
diff --git a/lib/librte_stack/meson.build b/lib/librte_stack/meson.build
index 46fce0c20f..f420a5c223 100644
--- a/lib/librte_stack/meson.build
+++ b/lib/librte_stack/meson.build
@@ -3,7 +3,6 @@
 
 allow_experimental_apis = true
 
-version = 1
 sources = files('rte_stack.c', 'rte_stack_std.c', 'rte_stack_lf.c')
 headers = files('rte_stack.h',
 		'rte_stack_std.h',
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index f935678a52..6ad8a6b17d 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -18,8 +18,6 @@ endif
 
 EXPORT_MAP := rte_table_version.map
 
-LIBABIVER := 3
-
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/meson.build b/lib/librte_table/meson.build
index 6ae3cd6c03..71d1347687 100644
--- a/lib/librte_table/meson.build
+++ b/lib/librte_table/meson.build
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 3
 sources = files('rte_table_acl.c',
 		'rte_table_lpm.c',
 		'rte_table_lpm_ipv6.c',
diff --git a/lib/librte_telemetry/Makefile b/lib/librte_telemetry/Makefile
index 1b3fe05475..f364548556 100644
--- a/lib/librte_telemetry/Makefile
+++ b/lib/librte_telemetry/Makefile
@@ -17,8 +17,6 @@ LDLIBS += -ljansson
 
 EXPORT_MAP := rte_telemetry_version.map
 
-LIBABIVER := 1
-
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) := rte_telemetry.c
 SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += rte_telemetry_parser.c
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 8ec63f455f..1c290b4c2d 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -12,8 +12,6 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_timer_version.map
 
-LIBABIVER := 1
-
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 87ce1fb270..c5cf6632d7 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -8,8 +8,6 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
-LIBABIVER := 4
-
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 CFLAGS += -I vhost_user
diff --git a/lib/librte_vhost/meson.build b/lib/librte_vhost/meson.build
index 00435777e2..ef7a5bced4 100644
--- a/lib/librte_vhost/meson.build
+++ b/lib/librte_vhost/meson.build
@@ -17,7 +17,6 @@ elif (toolchain == 'icc' and cc.version().version_compare('>=16.0.0'))
 endif
 dpdk_conf.set('RTE_LIBRTE_VHOST_POSTCOPY',
 	      cc.has_header('linux/userfaultfd.h'))
-version = 4
 allow_experimental_apis = true
 cflags += '-fno-strict-aliasing'
 sources = files('fd_man.c', 'iotlb.c', 'socket.c', 'vdpa.c',
-- 
2.17.1

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global
  2019-11-20 13:31  9%         ` Thomas Monjalon
@ 2019-11-20 14:10  4%           ` Kinsella, Ray
  0 siblings, 0 replies; 200+ results
From: Kinsella, Ray @ 2019-11-20 14:10 UTC (permalink / raw)
  To: Thomas Monjalon, Burakov, Anatoly
  Cc: dev, Baran, MarcinX, Richardson, Bruce, Mcnamara, John,
	david.marchand, Pawel Modrak, Yigit, Ferruh

+1 - that's a plan.

Ray K

> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Wednesday 20 November 2019 13:32
> To: Kinsella, Ray <ray.kinsella@intel.com>; Burakov, Anatoly
> <anatoly.burakov@intel.com>
> Cc: dev@dpdk.org; Baran, MarcinX <marcinx.baran@intel.com>; Richardson,
> Bruce <bruce.richardson@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; david.marchand@redhat.com; Pawel Modrak
> <pawelx.modrak@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>
> Subject: Re: [PATCH v7 01/10] config: change ABI versioning to global
> 
> 20/11/2019 13:10, Kinsella, Ray:
> > From: Burakov, Anatoly <anatoly.burakov@intel.com>
> > > --- a/drivers/meson.build
> > > +++ b/drivers/meson.build
> > > +			if is_experimental != 0
> > > +				lib_version = '0.1'
> > [rk] This all makes sense - except this part.
> > [rk] I would expect the experimental major version to always be zero
> ...
> > [rk] However I would expect the minor version to increment with each
> new release or at the maintainers discretion.
> 
> Yes, the minor must be incremented with each new release if we want to
> allow 2 DPDK versions to be installed in the same system.
> 
> This policy must be changed:
> "
> Experimental libraries always have a major version of 0 to indicate
> they exist outside of ABI Versioning, with the minor version
> incremented with each ABI change to library.
> "
> 
> I propose to re-use the global ABI version for experimental by
> prefixing with "0.".
> So for ABI 20.0, it could be 0.20.0 or 0.200? Which one?
> 


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global
  2019-11-08 16:25  7%     ` [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global Anatoly Burakov
  2019-11-19 13:53  4%       ` Thomas Monjalon
@ 2019-11-20 12:10  4%       ` Kinsella, Ray
  2019-11-20 13:31  9%         ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Kinsella, Ray @ 2019-11-20 12:10 UTC (permalink / raw)
  To: Burakov, Anatoly, dev
  Cc: Baran, MarcinX, Thomas Monjalon, Richardson, Bruce, Mcnamara,
	John, david.marchand, Pawel Modrak, Yigit, Ferruh



> -----Original Message-----
> From: Burakov, Anatoly <anatoly.burakov@intel.com>
> Sent: Friday 8 November 2019 16:25
> To: dev@dpdk.org
> Cc: Baran, MarcinX <marcinx.baran@intel.com>; Thomas Monjalon
> <thomas@monjalon.net>; Richardson, Bruce <bruce.richardson@intel.com>;
> Mcnamara, John <john.mcnamara@intel.com>; Kinsella, Ray
> <ray.kinsella@intel.com>; david.marchand@redhat.com; Pawel Modrak
> <pawelx.modrak@intel.com>
> Subject: [PATCH v7 01/10] config: change ABI versioning to global
> 
> From: Marcin Baran <marcinx.baran@intel.com>
> 
> As per new ABI policy, all of the libraries are now versioned using one
> global ABI version. Changes in this patch implement the necessary steps
> to enable that.
> 
> Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> 
> Notes:
>     v6:
>     - Silenced grep error message on trying to grep a directory
> 
>     v3:
>     - Removed Windows support from Makefile changes
>     - Removed unneeded path conversions from meson files
> 
>  buildtools/meson.build |  2 ++
>  config/ABI_VERSION     |  1 +
>  config/meson.build     |  4 +++-
>  drivers/meson.build    | 20 ++++++++++++--------
>  lib/meson.build        | 18 ++++++++++++------
>  meson_options.txt      |  2 --
>  mk/rte.lib.mk          | 13 ++++---------
>  7 files changed, 34 insertions(+), 26 deletions(-)  create mode 100644
> config/ABI_VERSION
> 
> diff --git a/buildtools/meson.build b/buildtools/meson.build index
> 32c79c1308..78ce69977d 100644
> --- a/buildtools/meson.build
> +++ b/buildtools/meson.build
> @@ -12,3 +12,5 @@ if python3.found()
>  else
>  	map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
> endif
> +
> +is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
> diff --git a/config/ABI_VERSION b/config/ABI_VERSION new file mode
> 100644 index 0000000000..9a7c1e503f
> --- /dev/null
> +++ b/config/ABI_VERSION
> @@ -0,0 +1 @@
> +20.0
> diff --git a/config/meson.build b/config/meson.build index
> 2b1cb92e7e..30aa2a5313 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -18,6 +18,8 @@ endforeach
>  # depending on the configuration options  pver =
> meson.project_version().split('.')
>  major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
> +abi_version = run_command(find_program('cat', 'more'),
> +	files('ABI_VERSION')).stdout().strip()
> 
>  # extract all version information into the build configuration
> dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int()) @@ -37,7 +39,7 @@
> endif
> 
>  pmd_subdir_opt = get_option('drivers_install_subdir')
>  if pmd_subdir_opt.contains('<VERSION>')
> -	pmd_subdir_opt =
> major_version.join(pmd_subdir_opt.split('<VERSION>'))
> +	pmd_subdir_opt =
> abi_version.join(pmd_subdir_opt.split('<VERSION>'))
>  endif
>  driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt)
> eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
> diff --git a/drivers/meson.build b/drivers/meson.build index
> 156d2dc717..b03e0c3159 100644
> --- a/drivers/meson.build
> +++ b/drivers/meson.build
> @@ -124,12 +124,19 @@ foreach class:dpdk_driver_classes
>  					output: out_filename,
>  					depends: [pmdinfogen, tmp_lib])
> 
> -			if get_option('per_library_versions')
> -				lib_version = '@0@.1'.format(version)
> -				so_version = '@0@'.format(version)
> +			version_map = '@0@/@1@/@2@_version.map'.format(
> +					meson.current_source_dir(),
> +					drv_path, lib_name)
> +
> +			is_experimental = run_command(is_experimental_cmd,
> +				files(version_map)).returncode()
> +
> +			if is_experimental != 0
> +				lib_version = '0.1'
[rk] This all makes sense - except this part.
[rk] I would expect the experimental major version to always be zero ...
[rk] However I would expect the minor version to increment with each new release or at the maintainers discretion. 

> +				so_version = '0'
>  			else
> -				lib_version = major_version
> -				so_version = major_version
> +				lib_version = abi_version
> +				so_version = abi_version
>  			endif
> 
>  			# now build the static driver
> @@ -142,9 +149,6 @@ foreach class:dpdk_driver_classes
>  				install: true)
> 
>  			# now build the shared driver
> -			version_map = '@0@/@1@/@2@_version.map'.format(
> -					meson.current_source_dir(),
> -					drv_path, lib_name)
>  			shared_lib = shared_library(lib_name,
>  				sources,
>  				objects: objs,
> diff --git a/lib/meson.build b/lib/meson.build index
> b2ec9c09a9..3cff2482b1 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -106,12 +106,18 @@ foreach l:libraries
>  				cflags += '-DRTE_USE_FUNCTION_VERSIONING'
>  			endif
> 
> -			if get_option('per_library_versions')
> -				lib_version = '@0@.1'.format(version)
> -				so_version = '@0@'.format(version)
> +			version_map = '@0@/@1@/rte_@2@_version.map'.format(
> +					meson.current_source_dir(), dir_name, name)
> +
> +			is_experimental = run_command(is_experimental_cmd,
> +					files(version_map)).returncode()
> +
> +			if is_experimental != 0
> +				lib_version = '0.1'
> +				so_version = '0'
>  			else
> -				lib_version = major_version
> -				so_version = major_version
> +				lib_version = abi_version
> +				so_version = abi_version
>  			endif
> 
>  			# first build static lib
> @@ -127,7 +133,7 @@ foreach l:libraries
>  					dependencies: static_deps)
> 
>  			if not use_function_versioning
> -				# use pre-build objects to build shared lib
> +				# then use pre-build objects to build shared lib
>  				sources = []
>  				objs += static_lib.extract_all_objects(recursive:
> false)
>  			else
> diff --git a/meson_options.txt b/meson_options.txt index
> 89650b0e9c..da6a7f0302 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -30,8 +30,6 @@ option('max_lcores', type: 'integer', value: 128,
>  	description: 'maximum number of cores/threads supported by EAL')
> option('max_numa_nodes', type: 'integer', value: 4,
>  	description: 'maximum number of NUMA nodes supported by EAL') -
> option('per_library_versions', type: 'boolean', value: true,
> -	description: 'true: each lib gets its own version number, false:
> DPDK version used for each lib')
>  option('tests', type: 'boolean', value: true,
>  	description: 'build unit tests')
>  option('use_hpet', type: 'boolean', value: false, diff --git
> a/mk/rte.lib.mk b/mk/rte.lib.mk index 4df8849a08..b49af9192b 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -11,20 +11,15 @@ EXTLIB_BUILD ?= n
>  # VPATH contains at least SRCDIR
>  VPATH += $(SRCDIR)
> 
> -ifneq ($(CONFIG_RTE_MAJOR_ABI),)
> -ifneq ($(LIBABIVER),)
> -LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
> -endif
> +ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),) LIBABIVER
> :=
> +$(shell cat $(RTE_SRCDIR)/config/ABI_VERSION) else LIBABIVER := 0
>  endif
> 
>  ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))  ifeq
> ($(EXTLIB_BUILD),n) -ifeq ($(CONFIG_RTE_MAJOR_ABI),) -ifeq
> ($(CONFIG_RTE_NEXT_ABI),y) -LIB := $(LIB).1 -endif -endif  CPU_LDFLAGS
> += --version-script=$(SRCDIR)/$(EXPORT_MAP)
>  endif
>  endif
> --
> 2.17.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v8 12/12] buildtools: add ABI versioning check script
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (11 preceding siblings ...)
  2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 11/12] build: change ABI version to 20.0 Anatoly Burakov
@ 2019-11-20 17:23 23%       ` Anatoly Burakov
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand, Pawel Modrak

From: Marcin Baran <marcinx.baran@intel.com>

Add a shell script that checks whether built libraries are
versioned with expected ABI (current ABI, current ABI + 1,
or EXPERIMENTAL).

The following command was used to verify current source tree
(assuming build directory is in ./build):

find ./build/lib ./build/drivers -name  \*.so \
	-exec ./buildtools/check-abi-version.sh {} \; -print

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - Moved this to the end of the patchset
    - Fixed bug when ABI symbols were not found because the .so
      did not declare any public symbols

 buildtools/check-abi-version.sh | 54 +++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100755 buildtools/check-abi-version.sh

diff --git a/buildtools/check-abi-version.sh b/buildtools/check-abi-version.sh
new file mode 100755
index 0000000000..9a3d135463
--- /dev/null
+++ b/buildtools/check-abi-version.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+# Check whether library symbols have correct
+# version (provided ABI number or provided ABI
+# number + 1 or EXPERIMENTAL).
+# Args:
+#   $1: path of the library .so file
+#   $2: ABI major version number to check
+#       (defaults to ABI_VERSION file value)
+
+if [ -z "$1" ]; then
+    echo "Script checks whether library symbols have"
+    echo "correct version (ABI_VER/ABI_VER+1/EXPERIMENTAL)"
+    echo "Usage:"
+    echo "  $0 SO_FILE_PATH [ABI_VER]"
+    exit 1
+fi
+
+LIB="$1"
+DEFAULT_ABI=$(cat "$(dirname \
+            $(readlink -f $0))/../ABI_VERSION" | \
+            cut -d'.' -f 1)
+ABIVER="DPDK_${2-$DEFAULT_ABI}"
+NEXT_ABIVER="DPDK_$((${2-$DEFAULT_ABI}+1))"
+
+ret=0
+
+# get output of objdump
+OBJ_DUMP_OUTPUT=`objdump -TC --section=.text ${LIB} 2>&1 | grep ".text"`
+
+# there may not be any .text sections in the .so file, in which case exit early
+echo "${OBJ_DUMP_OUTPUT}" | grep "not found in any input file" -q
+if [ "$?" -eq 0 ]; then
+    exit 0
+fi
+
+# we have symbols, so let's see if the versions are correct
+for SYM in $(echo "${OBJ_DUMP_OUTPUT}" | awk '{print $(NF-1) "-" $NF}')
+do
+    version=$(echo $SYM | cut -d'-' -f 1)
+    symbol=$(echo $SYM | cut -d'-' -f 2)
+    case $version in (*"$ABIVER"*|*"$NEXT_ABIVER"*|"EXPERIMENTAL")
+        ;;
+    (*)
+        echo "Warning: symbol $symbol ($version) should be annotated " \
+             "as ABI version $ABIVER / $NEXT_ABIVER, or EXPERIMENTAL."
+        ret=1
+    ;;
+    esac
+done
+
+exit $ret
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v8 10/12] drivers/octeontx: add missing public symbol
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (9 preceding siblings ...)
  2019-11-20 17:23  6%       ` [dpdk-dev] [PATCH v8 09/12] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
@ 2019-11-20 17:23  3%       ` Anatoly Burakov
  2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 11/12] build: change ABI version to 20.0 Anatoly Burakov
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 12/12] buildtools: add ABI versioning check script Anatoly Burakov
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Jerin Jacob, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand, pbhagavatula, stable

The logtype symbol was missing from the .map file. Add it.

Fixes: d8dd31652cf4 ("common/octeontx: move mbox to common folder")
Cc: pbhagavatula@caviumnetworks.com
Cc: stable@dpdk.org

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - add this patch to avoid compile breakage when bumping ABI

 drivers/common/octeontx/rte_common_octeontx_version.map | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/common/octeontx/rte_common_octeontx_version.map b/drivers/common/octeontx/rte_common_octeontx_version.map
index f04b3b7f8a..a9b3cff9bc 100644
--- a/drivers/common/octeontx/rte_common_octeontx_version.map
+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
@@ -1,6 +1,7 @@
 DPDK_18.05 {
 	global:
 
+	octeontx_logtype_mbox;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
 	octeontx_mbox_send;
-- 
2.17.1

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v8 09/12] distributor: rename v2.0 ABI to _single suffix
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (8 preceding siblings ...)
  2019-11-20 17:23  4%       ` [dpdk-dev] [PATCH v8 08/12] distributor: " Anatoly Burakov
@ 2019-11-20 17:23  6%       ` Anatoly Burakov
  2019-11-20 17:23  3%       ` [dpdk-dev] [PATCH v8 10/12] drivers/octeontx: add missing public symbol Anatoly Burakov
                         ` (2 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, David Hunt, john.mcnamara, ray.kinsella,
	bruce.richardson, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

The original ABI versioning was slightly misleading in that the
DPDK 2.0 ABI was really a single mode for the distributor, and is
used as such throughout the distributor code.

Fix this by renaming all _v20 API's to _single API's, and remove
symbol versioning.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
---

Notes:
    v4:
    - Changed it back to how it was with v2
    - Removed remaining v2.0 symbols
    
    v3:
    - Removed single mode from distributor as per Dave's comments
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_distributor/Makefile               |  2 +-
 lib/librte_distributor/distributor_private.h  | 10 +--
 lib/librte_distributor/meson.build            |  2 +-
 lib/librte_distributor/rte_distributor.c      | 24 +++----
 ...ributor_v20.c => rte_distributor_single.c} | 64 +++++++++----------
 ...ributor_v20.h => rte_distributor_single.h} | 26 ++++----
 .../rte_distributor_version.map               | 18 +-----
 7 files changed, 66 insertions(+), 80 deletions(-)
 rename lib/librte_distributor/{rte_distributor_v20.c => rte_distributor_single.c} (87%)
 rename lib/librte_distributor/{rte_distributor_v20.h => rte_distributor_single.h} (89%)

diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index a687f4a0f0..fc32fb3a8f 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -13,7 +13,7 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_ethdev
 EXPORT_MAP := rte_distributor_version.map
 
 # all source are stored in SRCS-y
-SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_v20.c
+SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_single.c
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor.c
 ifeq ($(CONFIG_RTE_ARCH_X86),y)
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor_match_sse.c
diff --git a/lib/librte_distributor/distributor_private.h b/lib/librte_distributor/distributor_private.h
index c89371123e..489aef2acb 100644
--- a/lib/librte_distributor/distributor_private.h
+++ b/lib/librte_distributor/distributor_private.h
@@ -55,7 +55,7 @@ extern "C" {
  * the next cache line to worker 0, we pad this out to three cache lines.
  * Only 64-bits of the memory is actually used though.
  */
-union rte_distributor_buffer_v20 {
+union rte_distributor_buffer_single {
 	volatile int64_t bufptr64;
 	char pad[RTE_CACHE_LINE_SIZE*3];
 } __rte_cache_aligned;
@@ -80,8 +80,8 @@ struct rte_distributor_returned_pkts {
 	struct rte_mbuf *mbufs[RTE_DISTRIB_MAX_RETURNS];
 };
 
-struct rte_distributor_v20 {
-	TAILQ_ENTRY(rte_distributor_v20) next;    /**< Next in list. */
+struct rte_distributor_single {
+	TAILQ_ENTRY(rte_distributor_single) next;    /**< Next in list. */
 
 	char name[RTE_DISTRIBUTOR_NAMESIZE];  /**< Name of the ring. */
 	unsigned int num_workers;             /**< Number of workers polling */
@@ -96,7 +96,7 @@ struct rte_distributor_v20 {
 
 	struct rte_distributor_backlog backlog[RTE_DISTRIB_MAX_WORKERS];
 
-	union rte_distributor_buffer_v20 bufs[RTE_DISTRIB_MAX_WORKERS];
+	union rte_distributor_buffer_single bufs[RTE_DISTRIB_MAX_WORKERS];
 
 	struct rte_distributor_returned_pkts returns;
 };
@@ -154,7 +154,7 @@ struct rte_distributor {
 
 	enum rte_distributor_match_function dist_match_fn;
 
-	struct rte_distributor_v20 *d_v20;
+	struct rte_distributor_single *d_single;
 };
 
 void
diff --git a/lib/librte_distributor/meson.build b/lib/librte_distributor/meson.build
index c9617d7b14..50b91887b5 100644
--- a/lib/librte_distributor/meson.build
+++ b/lib/librte_distributor/meson.build
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-sources = files('rte_distributor.c', 'rte_distributor_v20.c')
+sources = files('rte_distributor.c', 'rte_distributor_single.c')
 if arch_subdir == 'x86'
 	sources += files('rte_distributor_match_sse.c')
 else
diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index a4c8ff6a96..6c5b0c86e8 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -17,7 +17,7 @@
 #include <rte_tailq.h>
 
 #include "rte_distributor.h"
-#include "rte_distributor_v20.h"
+#include "rte_distributor_single.h"
 #include "distributor_private.h"
 
 TAILQ_HEAD(rte_dist_burst_list, rte_distributor);
@@ -42,7 +42,7 @@ rte_distributor_request_pkt(struct rte_distributor *d,
 	volatile int64_t *retptr64;
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
-		rte_distributor_request_pkt_v20(d->d_v20,
+		rte_distributor_request_pkt_single(d->d_single,
 			worker_id, oldpkt[0]);
 		return;
 	}
@@ -93,7 +93,8 @@ rte_distributor_poll_pkt(struct rte_distributor *d,
 	unsigned int i;
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
-		pkts[0] = rte_distributor_poll_pkt_v20(d->d_v20, worker_id);
+		pkts[0] = rte_distributor_poll_pkt_single(d->d_single,
+			worker_id);
 		return (pkts[0]) ? 1 : 0;
 	}
 
@@ -133,7 +134,7 @@ rte_distributor_get_pkt(struct rte_distributor *d,
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
 		if (return_count <= 1) {
-			pkts[0] = rte_distributor_get_pkt_v20(d->d_v20,
+			pkts[0] = rte_distributor_get_pkt_single(d->d_single,
 				worker_id, oldpkt[0]);
 			return (pkts[0]) ? 1 : 0;
 		} else
@@ -163,7 +164,7 @@ rte_distributor_return_pkt(struct rte_distributor *d,
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
 		if (num == 1)
-			return rte_distributor_return_pkt_v20(d->d_v20,
+			return rte_distributor_return_pkt_single(d->d_single,
 				worker_id, oldpkt[0]);
 		else
 			return -EINVAL;
@@ -354,7 +355,8 @@ rte_distributor_process(struct rte_distributor *d,
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_process_v20(d->d_v20, mbufs, num_mbufs);
+		return rte_distributor_process_single(d->d_single,
+			mbufs, num_mbufs);
 	}
 
 	if (unlikely(num_mbufs == 0)) {
@@ -494,7 +496,7 @@ rte_distributor_returned_pkts(struct rte_distributor *d,
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_returned_pkts_v20(d->d_v20,
+		return rte_distributor_returned_pkts_single(d->d_single,
 				mbufs, max_mbufs);
 	}
 
@@ -537,7 +539,7 @@ rte_distributor_flush(struct rte_distributor *d)
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_flush_v20(d->d_v20);
+		return rte_distributor_flush_single(d->d_single);
 	}
 
 	flushed = total_outstanding(d);
@@ -568,7 +570,7 @@ rte_distributor_clear_returns(struct rte_distributor *d)
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		rte_distributor_clear_returns_v20(d->d_v20);
+		rte_distributor_clear_returns_single(d->d_single);
 		return;
 	}
 
@@ -610,9 +612,9 @@ rte_distributor_create(const char *name,
 			rte_errno = ENOMEM;
 			return NULL;
 		}
-		d->d_v20 = rte_distributor_create_v20(name,
+		d->d_single = rte_distributor_create_single(name,
 				socket_id, num_workers);
-		if (d->d_v20 == NULL) {
+		if (d->d_single == NULL) {
 			free(d);
 			/* rte_errno will have been set */
 			return NULL;
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_single.c
similarity index 87%
rename from lib/librte_distributor/rte_distributor_v20.c
rename to lib/librte_distributor/rte_distributor_single.c
index 655944bdb3..91d8824c64 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_single.c
@@ -15,10 +15,10 @@
 #include <rte_pause.h>
 #include <rte_tailq.h>
 
-#include "rte_distributor_v20.h"
+#include "rte_distributor_single.h"
 #include "distributor_private.h"
 
-TAILQ_HEAD(rte_distributor_list, rte_distributor_v20);
+TAILQ_HEAD(rte_distributor_list, rte_distributor_single);
 
 static struct rte_tailq_elem rte_distributor_tailq = {
 	.name = "RTE_DISTRIBUTOR",
@@ -27,11 +27,11 @@ EAL_REGISTER_TAILQ(rte_distributor_tailq)
 
 /**** APIs called by workers ****/
 
-void __vsym
-rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
+void
+rte_distributor_request_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	int64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_GET_BUF;
 	while (unlikely(__atomic_load_n(&buf->bufptr64, __ATOMIC_RELAXED)
@@ -42,11 +42,11 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 }
 
-struct rte_mbuf * __vsym
-rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
+struct rte_mbuf *
+rte_distributor_poll_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	/* Sync with distributor. Acquire bufptr64. */
 	if (__atomic_load_n(&buf->bufptr64, __ATOMIC_ACQUIRE)
 		& RTE_DISTRIB_GET_BUF)
@@ -57,22 +57,22 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 	return (struct rte_mbuf *)((uintptr_t)ret);
 }
 
-struct rte_mbuf * __vsym
-rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
+struct rte_mbuf *
+rte_distributor_get_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
 	struct rte_mbuf *ret;
-	rte_distributor_request_pkt_v20(d, worker_id, oldpkt);
-	while ((ret = rte_distributor_poll_pkt_v20(d, worker_id)) == NULL)
+	rte_distributor_request_pkt_single(d, worker_id, oldpkt);
+	while ((ret = rte_distributor_poll_pkt_single(d, worker_id)) == NULL)
 		rte_pause();
 	return ret;
 }
 
-int __vsym
-rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
+int
+rte_distributor_return_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	uint64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_RETURN_BUF;
 	/* Sync with distributor on RETURN_BUF flag. */
@@ -104,7 +104,7 @@ backlog_pop(struct rte_distributor_backlog *bl)
 
 /* stores a packet returned from a worker inside the returns array */
 static inline void
-store_return(uintptr_t oldbuf, struct rte_distributor_v20 *d,
+store_return(uintptr_t oldbuf, struct rte_distributor_single *d,
 		unsigned *ret_start, unsigned *ret_count)
 {
 	/* store returns in a circular buffer - code is branch-free */
@@ -115,7 +115,7 @@ store_return(uintptr_t oldbuf, struct rte_distributor_v20 *d,
 }
 
 static inline void
-handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
+handle_worker_shutdown(struct rte_distributor_single *d, unsigned int wkr)
 {
 	d->in_flight_tags[wkr] = 0;
 	d->in_flight_bitmask &= ~(1UL << wkr);
@@ -146,7 +146,7 @@ handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
 		 * Note that the tags were set before first level call
 		 * to rte_distributor_process.
 		 */
-		rte_distributor_process_v20(d, pkts, i);
+		rte_distributor_process_single(d, pkts, i);
 		bl->count = bl->start = 0;
 	}
 }
@@ -156,7 +156,7 @@ handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
  * to do a partial flush.
  */
 static int
-process_returns(struct rte_distributor_v20 *d)
+process_returns(struct rte_distributor_single *d)
 {
 	unsigned wkr;
 	unsigned flushed = 0;
@@ -200,8 +200,8 @@ process_returns(struct rte_distributor_v20 *d)
 }
 
 /* process a set of packets to distribute them to workers */
-int __vsym
-rte_distributor_process_v20(struct rte_distributor_v20 *d,
+int
+rte_distributor_process_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned num_mbufs)
 {
 	unsigned next_idx = 0;
@@ -316,8 +316,8 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 }
 
 /* return to the caller, packets returned from workers */
-int __vsym
-rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
+int
+rte_distributor_returned_pkts_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned max_mbufs)
 {
 	struct rte_distributor_returned_pkts *returns = &d->returns;
@@ -339,7 +339,7 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
  * being worked on or queued up in a backlog.
  */
 static inline unsigned
-total_outstanding(const struct rte_distributor_v20 *d)
+total_outstanding(const struct rte_distributor_single *d)
 {
 	unsigned wkr, total_outstanding;
 
@@ -353,20 +353,20 @@ total_outstanding(const struct rte_distributor_v20 *d)
 
 /* flush the distributor, so that there are no outstanding packets in flight or
  * queued up. */
-int __vsym
-rte_distributor_flush_v20(struct rte_distributor_v20 *d)
+int
+rte_distributor_flush_single(struct rte_distributor_single *d)
 {
 	const unsigned flushed = total_outstanding(d);
 
 	while (total_outstanding(d) > 0)
-		rte_distributor_process_v20(d, NULL, 0);
+		rte_distributor_process_single(d, NULL, 0);
 
 	return flushed;
 }
 
 /* clears the internal returns array in the distributor */
-void __vsym
-rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
+void
+rte_distributor_clear_returns_single(struct rte_distributor_single *d)
 {
 	d->returns.start = d->returns.count = 0;
 #ifndef __OPTIMIZE__
@@ -375,12 +375,12 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 }
 
 /* creates a distributor instance */
-struct rte_distributor_v20 * __vsym
-rte_distributor_create_v20(const char *name,
+struct rte_distributor_single *
+rte_distributor_create_single(const char *name,
 		unsigned socket_id,
 		unsigned num_workers)
 {
-	struct rte_distributor_v20 *d;
+	struct rte_distributor_single *d;
 	struct rte_distributor_list *distributor_list;
 	char mz_name[RTE_MEMZONE_NAMESIZE];
 	const struct rte_memzone *mz;
diff --git a/lib/librte_distributor/rte_distributor_v20.h b/lib/librte_distributor/rte_distributor_single.h
similarity index 89%
rename from lib/librte_distributor/rte_distributor_v20.h
rename to lib/librte_distributor/rte_distributor_single.h
index 12865658ba..2f80aa43d1 100644
--- a/lib/librte_distributor/rte_distributor_v20.h
+++ b/lib/librte_distributor/rte_distributor_single.h
@@ -2,8 +2,8 @@
  * Copyright(c) 2010-2014 Intel Corporation
  */
 
-#ifndef _RTE_DISTRIB_V20_H_
-#define _RTE_DISTRIB_V20_H_
+#ifndef _RTE_DISTRIB_SINGLE_H_
+#define _RTE_DISTRIB_SINGLE_H_
 
 /**
  * @file
@@ -19,7 +19,7 @@ extern "C" {
 
 #define RTE_DISTRIBUTOR_NAMESIZE 32 /**< Length of name for instance */
 
-struct rte_distributor_v20;
+struct rte_distributor_single;
 struct rte_mbuf;
 
 /**
@@ -38,8 +38,8 @@ struct rte_mbuf;
  * @return
  *   The newly created distributor instance
  */
-struct rte_distributor_v20 *
-rte_distributor_create_v20(const char *name, unsigned int socket_id,
+struct rte_distributor_single *
+rte_distributor_create_single(const char *name, unsigned int socket_id,
 		unsigned int num_workers);
 
 /*  *** APIS to be called on the distributor lcore ***  */
@@ -74,7 +74,7 @@ rte_distributor_create_v20(const char *name, unsigned int socket_id,
  *   The number of mbufs processed.
  */
 int
-rte_distributor_process_v20(struct rte_distributor_v20 *d,
+rte_distributor_process_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs);
 
 /**
@@ -92,7 +92,7 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
  *   The number of mbufs returned in the mbufs array.
  */
 int
-rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
+rte_distributor_returned_pkts_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs);
 
 /**
@@ -107,7 +107,7 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
  *   The number of queued/in-flight packets that were completed by this call.
  */
 int
-rte_distributor_flush_v20(struct rte_distributor_v20 *d);
+rte_distributor_flush_single(struct rte_distributor_single *d);
 
 /**
  * Clears the array of returned packets used as the source for the
@@ -119,7 +119,7 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d);
  *   The distributor instance to be used
  */
 void
-rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d);
+rte_distributor_clear_returns_single(struct rte_distributor_single *d);
 
 /*  *** APIS to be called on the worker lcores ***  */
 /*
@@ -148,7 +148,7 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d);
  *   A new packet to be processed by the worker thread.
  */
 struct rte_mbuf *
-rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_get_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *oldpkt);
 
 /**
@@ -164,7 +164,7 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
  *   The previous packet being processed by the worker
  */
 int
-rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_return_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *mbuf);
 
 /**
@@ -188,7 +188,7 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
  *   The previous packet, if any, being processed by the worker
  */
 void
-rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_request_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *oldpkt);
 
 /**
@@ -208,7 +208,7 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
  *   packet is yet available.
  */
 struct rte_mbuf *
-rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_poll_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id);
 
 #ifdef __cplusplus
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
index 3a285b394e..00e26b4804 100644
--- a/lib/librte_distributor/rte_distributor_version.map
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -1,19 +1,3 @@
-DPDK_2.0 {
-	global:
-
-	rte_distributor_clear_returns;
-	rte_distributor_create;
-	rte_distributor_flush;
-	rte_distributor_get_pkt;
-	rte_distributor_poll_pkt;
-	rte_distributor_process;
-	rte_distributor_request_pkt;
-	rte_distributor_return_pkt;
-	rte_distributor_returned_pkts;
-
-	local: *;
-};
-
 DPDK_17.05 {
 	global:
 
@@ -26,4 +10,4 @@ DPDK_17.05 {
 	rte_distributor_request_pkt;
 	rte_distributor_return_pkt;
 	rte_distributor_returned_pkts;
-} DPDK_2.0;
+};
-- 
2.17.1

^ permalink raw reply	[relevance 6%]

* [dpdk-dev] [PATCH v8 08/12] distributor: remove deprecated code
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (7 preceding siblings ...)
  2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 07/12] lpm: " Anatoly Burakov
@ 2019-11-20 17:23  4%       ` Anatoly Burakov
  2019-11-20 17:23  6%       ` [dpdk-dev] [PATCH v8 09/12] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
                         ` (3 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, David Hunt, john.mcnamara, ray.kinsella,
	bruce.richardson, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
---

Notes:
    v5:
    - Fixed shared library linking error due to versioning still enabled
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_distributor/rte_distributor.c      | 74 +++++--------------
 .../rte_distributor_v1705.h                   | 61 ---------------
 lib/librte_distributor/rte_distributor_v20.c  |  9 ---
 3 files changed, 18 insertions(+), 126 deletions(-)
 delete mode 100644 lib/librte_distributor/rte_distributor_v1705.h

diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index 2cc32ddba2..a4c8ff6a96 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -18,7 +18,6 @@
 
 #include "rte_distributor.h"
 #include "rte_distributor_v20.h"
-#include "rte_distributor_v1705.h"
 #include "distributor_private.h"
 
 TAILQ_HEAD(rte_dist_burst_list, rte_distributor);
@@ -32,8 +31,8 @@ EAL_REGISTER_TAILQ(rte_dist_burst_tailq)
 
 /**** Burst Packet APIs called by workers ****/
 
-void __vsym
-rte_distributor_request_pkt_v1705(struct rte_distributor *d,
+void
+rte_distributor_request_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt,
 		unsigned int count)
 {
@@ -83,14 +82,9 @@ rte_distributor_request_pkt_v1705(struct rte_distributor *d,
 	__atomic_store_n(retptr64, *retptr64 | RTE_DISTRIB_GET_BUF,
 			__ATOMIC_RELEASE);
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_request_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(void rte_distributor_request_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt,
-		unsigned int count),
-		rte_distributor_request_pkt_v1705);
 
-int __vsym
-rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
+int
+rte_distributor_poll_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts)
 {
 	struct rte_distributor_buffer *buf = &d->bufs[worker_id];
@@ -129,13 +123,9 @@ rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
 
 	return count;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_poll_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_poll_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **pkts),
-		rte_distributor_poll_pkt_v1705);
 
-int __vsym
-rte_distributor_get_pkt_v1705(struct rte_distributor *d,
+int
+rte_distributor_get_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts,
 		struct rte_mbuf **oldpkt, unsigned int return_count)
 {
@@ -163,14 +153,9 @@ rte_distributor_get_pkt_v1705(struct rte_distributor *d,
 	}
 	return count;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_get_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_get_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **pkts,
-		struct rte_mbuf **oldpkt, unsigned int return_count),
-		rte_distributor_get_pkt_v1705);
 
-int __vsym
-rte_distributor_return_pkt_v1705(struct rte_distributor *d,
+int
+rte_distributor_return_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt, int num)
 {
 	struct rte_distributor_buffer *buf = &d->bufs[worker_id];
@@ -202,10 +187,6 @@ rte_distributor_return_pkt_v1705(struct rte_distributor *d,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_return_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_return_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt, int num),
-		rte_distributor_return_pkt_v1705);
 
 /**** APIs called on distributor core ***/
 
@@ -359,8 +340,8 @@ release(struct rte_distributor *d, unsigned int wkr)
 
 
 /* process a set of packets to distribute them to workers */
-int __vsym
-rte_distributor_process_v1705(struct rte_distributor *d,
+int
+rte_distributor_process(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs)
 {
 	unsigned int next_idx = 0;
@@ -500,14 +481,10 @@ rte_distributor_process_v1705(struct rte_distributor *d,
 
 	return num_mbufs;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_process, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_process(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int num_mbufs),
-		rte_distributor_process_v1705);
 
 /* return to the caller, packets returned from workers */
-int __vsym
-rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
+int
+rte_distributor_returned_pkts(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs)
 {
 	struct rte_distributor_returned_pkts *returns = &d->returns;
@@ -532,10 +509,6 @@ rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
 
 	return retval;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_returned_pkts, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_returned_pkts(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int max_mbufs),
-		rte_distributor_returned_pkts_v1705);
 
 /*
  * Return the number of packets in-flight in a distributor, i.e. packets
@@ -556,8 +529,8 @@ total_outstanding(const struct rte_distributor *d)
  * Flush the distributor, so that there are no outstanding packets in flight or
  * queued up.
  */
-int __vsym
-rte_distributor_flush_v1705(struct rte_distributor *d)
+int
+rte_distributor_flush(struct rte_distributor *d)
 {
 	unsigned int flushed;
 	unsigned int wkr;
@@ -586,13 +559,10 @@ rte_distributor_flush_v1705(struct rte_distributor *d)
 
 	return flushed;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_flush, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_flush(struct rte_distributor *d),
-		rte_distributor_flush_v1705);
 
 /* clears the internal returns array in the distributor */
-void __vsym
-rte_distributor_clear_returns_v1705(struct rte_distributor *d)
+void
+rte_distributor_clear_returns(struct rte_distributor *d)
 {
 	unsigned int wkr;
 
@@ -608,13 +578,10 @@ rte_distributor_clear_returns_v1705(struct rte_distributor *d)
 		__atomic_store_n(&(d->bufs[wkr].retptr64[0]), 0,
 				__ATOMIC_RELEASE);
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_clear_returns, _v1705, 17.05);
-MAP_STATIC_SYMBOL(void rte_distributor_clear_returns(struct rte_distributor *d),
-		rte_distributor_clear_returns_v1705);
 
 /* creates a distributor instance */
-struct rte_distributor * __vsym
-rte_distributor_create_v1705(const char *name,
+struct rte_distributor *
+rte_distributor_create(const char *name,
 		unsigned int socket_id,
 		unsigned int num_workers,
 		unsigned int alg_type)
@@ -688,8 +655,3 @@ rte_distributor_create_v1705(const char *name,
 
 	return d;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_create, _v1705, 17.05);
-MAP_STATIC_SYMBOL(struct rte_distributor *rte_distributor_create(
-		const char *name, unsigned int socket_id,
-		unsigned int num_workers, unsigned int alg_type),
-		rte_distributor_create_v1705);
diff --git a/lib/librte_distributor/rte_distributor_v1705.h b/lib/librte_distributor/rte_distributor_v1705.h
deleted file mode 100644
index df4d9e8150..0000000000
--- a/lib/librte_distributor/rte_distributor_v1705.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef _RTE_DISTRIB_V1705_H_
-#define _RTE_DISTRIB_V1705_H_
-
-/**
- * @file
- * RTE distributor
- *
- * The distributor is a component which is designed to pass packets
- * one-at-a-time to workers, with dynamic load balancing.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct rte_distributor *
-rte_distributor_create_v1705(const char *name, unsigned int socket_id,
-		unsigned int num_workers,
-		unsigned int alg_type);
-
-int
-rte_distributor_process_v1705(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int num_mbufs);
-
-int
-rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int max_mbufs);
-
-int
-rte_distributor_flush_v1705(struct rte_distributor *d);
-
-void
-rte_distributor_clear_returns_v1705(struct rte_distributor *d);
-
-int
-rte_distributor_get_pkt_v1705(struct rte_distributor *d,
-	unsigned int worker_id, struct rte_mbuf **pkts,
-	struct rte_mbuf **oldpkt, unsigned int retcount);
-
-int
-rte_distributor_return_pkt_v1705(struct rte_distributor *d,
-	unsigned int worker_id, struct rte_mbuf **oldpkt, int num);
-
-void
-rte_distributor_request_pkt_v1705(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt,
-		unsigned int count);
-
-int
-rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **mbufs);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_v20.c
index 7a6fddf556..655944bdb3 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_v20.c
@@ -41,7 +41,6 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 	/* Sync with distributor on GET_BUF flag. */
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 }
-VERSION_SYMBOL(rte_distributor_request_pkt, _v20, 2.0);
 
 struct rte_mbuf * __vsym
 rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
@@ -57,7 +56,6 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 	int64_t ret = buf->bufptr64 >> RTE_DISTRIB_FLAG_BITS;
 	return (struct rte_mbuf *)((uintptr_t)ret);
 }
-VERSION_SYMBOL(rte_distributor_poll_pkt, _v20, 2.0);
 
 struct rte_mbuf * __vsym
 rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
@@ -69,7 +67,6 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
 		rte_pause();
 	return ret;
 }
-VERSION_SYMBOL(rte_distributor_get_pkt, _v20, 2.0);
 
 int __vsym
 rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
@@ -82,7 +79,6 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 	return 0;
 }
-VERSION_SYMBOL(rte_distributor_return_pkt, _v20, 2.0);
 
 /**** APIs called on distributor core ***/
 
@@ -318,7 +314,6 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 	d->returns.count = ret_count;
 	return num_mbufs;
 }
-VERSION_SYMBOL(rte_distributor_process, _v20, 2.0);
 
 /* return to the caller, packets returned from workers */
 int __vsym
@@ -339,7 +334,6 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
 
 	return retval;
 }
-VERSION_SYMBOL(rte_distributor_returned_pkts, _v20, 2.0);
 
 /* return the number of packets in-flight in a distributor, i.e. packets
  * being worked on or queued up in a backlog.
@@ -369,7 +363,6 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d)
 
 	return flushed;
 }
-VERSION_SYMBOL(rte_distributor_flush, _v20, 2.0);
 
 /* clears the internal returns array in the distributor */
 void __vsym
@@ -380,7 +373,6 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 	memset(d->returns.mbufs, 0, sizeof(d->returns.mbufs));
 #endif
 }
-VERSION_SYMBOL(rte_distributor_clear_returns, _v20, 2.0);
 
 /* creates a distributor instance */
 struct rte_distributor_v20 * __vsym
@@ -424,4 +416,3 @@ rte_distributor_create_v20(const char *name,
 
 	return d;
 }
-VERSION_SYMBOL(rte_distributor_create, _v20, 2.0);
-- 
2.17.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v8 07/12] lpm: remove deprecated code
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (6 preceding siblings ...)
  2019-11-20 17:23  3%       ` [dpdk-dev] [PATCH v8 06/12] timer: remove deprecated code Anatoly Burakov
@ 2019-11-20 17:23  2%       ` Anatoly Burakov
  2019-11-20 17:23  4%       ` [dpdk-dev] [PATCH v8 08/12] distributor: " Anatoly Burakov
                         ` (4 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Bruce Richardson, Vladimir Medvedkin,
	john.mcnamara, ray.kinsella, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_lpm/rte_lpm.c           | 1010 ++--------------------------
 lib/librte_lpm/rte_lpm.h           |   88 ---
 lib/librte_lpm/rte_lpm6.c          |  140 +---
 lib/librte_lpm/rte_lpm6.h          |   25 -
 lib/librte_lpm/rte_lpm_version.map |   11 -
 5 files changed, 59 insertions(+), 1215 deletions(-)

diff --git a/lib/librte_lpm/rte_lpm.c b/lib/librte_lpm/rte_lpm.c
index 106916dc82..b78c487447 100644
--- a/lib/librte_lpm/rte_lpm.c
+++ b/lib/librte_lpm/rte_lpm.c
@@ -90,34 +90,8 @@ depth_to_range(uint8_t depth)
 /*
  * Find an existing lpm table and return a pointer to it.
  */
-struct rte_lpm_v20 * __vsym
-rte_lpm_find_existing_v20(const char *name)
-{
-	struct rte_lpm_v20 *l = NULL;
-	struct rte_tailq_entry *te;
-	struct rte_lpm_list *lpm_list;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	rte_mcfg_tailq_read_lock();
-	TAILQ_FOREACH(te, lpm_list, next) {
-		l = te->data;
-		if (strncmp(name, l->name, RTE_LPM_NAMESIZE) == 0)
-			break;
-	}
-	rte_mcfg_tailq_read_unlock();
-
-	if (te == NULL) {
-		rte_errno = ENOENT;
-		return NULL;
-	}
-
-	return l;
-}
-VERSION_SYMBOL(rte_lpm_find_existing, _v20, 2.0);
-
-struct rte_lpm * __vsym
-rte_lpm_find_existing_v1604(const char *name)
+struct rte_lpm *
+rte_lpm_find_existing(const char *name)
 {
 	struct rte_lpm *l = NULL;
 	struct rte_tailq_entry *te;
@@ -140,88 +114,12 @@ rte_lpm_find_existing_v1604(const char *name)
 
 	return l;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_find_existing, _v1604, 16.04);
-MAP_STATIC_SYMBOL(struct rte_lpm *rte_lpm_find_existing(const char *name),
-		rte_lpm_find_existing_v1604);
 
 /*
  * Allocates memory for LPM object
  */
-struct rte_lpm_v20 * __vsym
-rte_lpm_create_v20(const char *name, int socket_id, int max_rules,
-		__rte_unused int flags)
-{
-	char mem_name[RTE_LPM_NAMESIZE];
-	struct rte_lpm_v20 *lpm = NULL;
-	struct rte_tailq_entry *te;
-	uint32_t mem_size;
-	struct rte_lpm_list *lpm_list;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	RTE_BUILD_BUG_ON(sizeof(struct rte_lpm_tbl_entry_v20) != 2);
-
-	/* Check user arguments. */
-	if ((name == NULL) || (socket_id < -1) || (max_rules == 0)) {
-		rte_errno = EINVAL;
-		return NULL;
-	}
-
-	snprintf(mem_name, sizeof(mem_name), "LPM_%s", name);
-
-	/* Determine the amount of memory to allocate. */
-	mem_size = sizeof(*lpm) + (sizeof(lpm->rules_tbl[0]) * max_rules);
-
-	rte_mcfg_tailq_write_lock();
-
-	/* guarantee there's no existing */
-	TAILQ_FOREACH(te, lpm_list, next) {
-		lpm = te->data;
-		if (strncmp(name, lpm->name, RTE_LPM_NAMESIZE) == 0)
-			break;
-	}
-
-	if (te != NULL) {
-		lpm = NULL;
-		rte_errno = EEXIST;
-		goto exit;
-	}
-
-	/* allocate tailq entry */
-	te = rte_zmalloc("LPM_TAILQ_ENTRY", sizeof(*te), 0);
-	if (te == NULL) {
-		RTE_LOG(ERR, LPM, "Failed to allocate tailq entry\n");
-		rte_errno = ENOMEM;
-		goto exit;
-	}
-
-	/* Allocate memory to store the LPM data structures. */
-	lpm = rte_zmalloc_socket(mem_name, mem_size,
-			RTE_CACHE_LINE_SIZE, socket_id);
-	if (lpm == NULL) {
-		RTE_LOG(ERR, LPM, "LPM memory allocation failed\n");
-		rte_free(te);
-		rte_errno = ENOMEM;
-		goto exit;
-	}
-
-	/* Save user arguments. */
-	lpm->max_rules = max_rules;
-	strlcpy(lpm->name, name, sizeof(lpm->name));
-
-	te->data = lpm;
-
-	TAILQ_INSERT_TAIL(lpm_list, te, next);
-
-exit:
-	rte_mcfg_tailq_write_unlock();
-
-	return lpm;
-}
-VERSION_SYMBOL(rte_lpm_create, _v20, 2.0);
-
-struct rte_lpm * __vsym
-rte_lpm_create_v1604(const char *name, int socket_id,
+struct rte_lpm *
+rte_lpm_create(const char *name, int socket_id,
 		const struct rte_lpm_config *config)
 {
 	char mem_name[RTE_LPM_NAMESIZE];
@@ -321,45 +219,12 @@ rte_lpm_create_v1604(const char *name, int socket_id,
 
 	return lpm;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_create, _v1604, 16.04);
-MAP_STATIC_SYMBOL(
-	struct rte_lpm *rte_lpm_create(const char *name, int socket_id,
-			const struct rte_lpm_config *config), rte_lpm_create_v1604);
 
 /*
  * Deallocates memory for given LPM table.
  */
-void __vsym
-rte_lpm_free_v20(struct rte_lpm_v20 *lpm)
-{
-	struct rte_lpm_list *lpm_list;
-	struct rte_tailq_entry *te;
-
-	/* Check user arguments. */
-	if (lpm == NULL)
-		return;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	rte_mcfg_tailq_write_lock();
-
-	/* find our tailq entry */
-	TAILQ_FOREACH(te, lpm_list, next) {
-		if (te->data == (void *) lpm)
-			break;
-	}
-	if (te != NULL)
-		TAILQ_REMOVE(lpm_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	rte_free(lpm);
-	rte_free(te);
-}
-VERSION_SYMBOL(rte_lpm_free, _v20, 2.0);
-
-void __vsym
-rte_lpm_free_v1604(struct rte_lpm *lpm)
+void
+rte_lpm_free(struct rte_lpm *lpm)
 {
 	struct rte_lpm_list *lpm_list;
 	struct rte_tailq_entry *te;
@@ -387,9 +252,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm)
 	rte_free(lpm);
 	rte_free(te);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_free, _v1604, 16.04);
-MAP_STATIC_SYMBOL(void rte_lpm_free(struct rte_lpm *lpm),
-		rte_lpm_free_v1604);
 
 /*
  * Adds a rule to the rule table.
@@ -402,79 +264,7 @@ MAP_STATIC_SYMBOL(void rte_lpm_free(struct rte_lpm *lpm),
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static int32_t
-rule_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth,
-	uint8_t next_hop)
-{
-	uint32_t rule_gindex, rule_index, last_rule;
-	int i;
-
-	VERIFY_DEPTH(depth);
-
-	/* Scan through rule group to see if rule already exists. */
-	if (lpm->rule_info[depth - 1].used_rules > 0) {
-
-		/* rule_gindex stands for rule group index. */
-		rule_gindex = lpm->rule_info[depth - 1].first_rule;
-		/* Initialise rule_index to point to start of rule group. */
-		rule_index = rule_gindex;
-		/* Last rule = Last used rule in this rule group. */
-		last_rule = rule_gindex + lpm->rule_info[depth - 1].used_rules;
-
-		for (; rule_index < last_rule; rule_index++) {
-
-			/* If rule already exists update its next_hop and return. */
-			if (lpm->rules_tbl[rule_index].ip == ip_masked) {
-				lpm->rules_tbl[rule_index].next_hop = next_hop;
-
-				return rule_index;
-			}
-		}
-
-		if (rule_index == lpm->max_rules)
-			return -ENOSPC;
-	} else {
-		/* Calculate the position in which the rule will be stored. */
-		rule_index = 0;
-
-		for (i = depth - 1; i > 0; i--) {
-			if (lpm->rule_info[i - 1].used_rules > 0) {
-				rule_index = lpm->rule_info[i - 1].first_rule
-						+ lpm->rule_info[i - 1].used_rules;
-				break;
-			}
-		}
-		if (rule_index == lpm->max_rules)
-			return -ENOSPC;
-
-		lpm->rule_info[depth - 1].first_rule = rule_index;
-	}
-
-	/* Make room for the new rule in the array. */
-	for (i = RTE_LPM_MAX_DEPTH; i > depth; i--) {
-		if (lpm->rule_info[i - 1].first_rule
-				+ lpm->rule_info[i - 1].used_rules == lpm->max_rules)
-			return -ENOSPC;
-
-		if (lpm->rule_info[i - 1].used_rules > 0) {
-			lpm->rules_tbl[lpm->rule_info[i - 1].first_rule
-				+ lpm->rule_info[i - 1].used_rules]
-					= lpm->rules_tbl[lpm->rule_info[i - 1].first_rule];
-			lpm->rule_info[i - 1].first_rule++;
-		}
-	}
-
-	/* Add the new rule. */
-	lpm->rules_tbl[rule_index].ip = ip_masked;
-	lpm->rules_tbl[rule_index].next_hop = next_hop;
-
-	/* Increment the used rules counter for this rule group. */
-	lpm->rule_info[depth - 1].used_rules++;
-
-	return rule_index;
-}
-
-static int32_t
-rule_add_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
+rule_add(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 	uint32_t next_hop)
 {
 	uint32_t rule_gindex, rule_index, last_rule;
@@ -550,30 +340,7 @@ rule_add_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static void
-rule_delete_v20(struct rte_lpm_v20 *lpm, int32_t rule_index, uint8_t depth)
-{
-	int i;
-
-	VERIFY_DEPTH(depth);
-
-	lpm->rules_tbl[rule_index] =
-			lpm->rules_tbl[lpm->rule_info[depth - 1].first_rule
-				+ lpm->rule_info[depth - 1].used_rules - 1];
-
-	for (i = depth; i < RTE_LPM_MAX_DEPTH; i++) {
-		if (lpm->rule_info[i].used_rules > 0) {
-			lpm->rules_tbl[lpm->rule_info[i].first_rule - 1] =
-				lpm->rules_tbl[lpm->rule_info[i].first_rule
-					+ lpm->rule_info[i].used_rules - 1];
-			lpm->rule_info[i].first_rule--;
-		}
-	}
-
-	lpm->rule_info[depth - 1].used_rules--;
-}
-
-static void
-rule_delete_v1604(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
+rule_delete(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
 {
 	int i;
 
@@ -600,28 +367,7 @@ rule_delete_v1604(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static int32_t
-rule_find_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth)
-{
-	uint32_t rule_gindex, last_rule, rule_index;
-
-	VERIFY_DEPTH(depth);
-
-	rule_gindex = lpm->rule_info[depth - 1].first_rule;
-	last_rule = rule_gindex + lpm->rule_info[depth - 1].used_rules;
-
-	/* Scan used rules at given depth to find rule. */
-	for (rule_index = rule_gindex; rule_index < last_rule; rule_index++) {
-		/* If rule is found return the rule index. */
-		if (lpm->rules_tbl[rule_index].ip == ip_masked)
-			return rule_index;
-	}
-
-	/* If rule is not found return -EINVAL. */
-	return -EINVAL;
-}
-
-static int32_t
-rule_find_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
+rule_find(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
 {
 	uint32_t rule_gindex, last_rule, rule_index;
 
@@ -645,42 +391,7 @@ rule_find_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
  * Find, clean and allocate a tbl8.
  */
 static int32_t
-tbl8_alloc_v20(struct rte_lpm_tbl_entry_v20 *tbl8)
-{
-	uint32_t group_idx; /* tbl8 group index. */
-	struct rte_lpm_tbl_entry_v20 *tbl8_entry;
-
-	/* Scan through tbl8 to find a free (i.e. INVALID) tbl8 group. */
-	for (group_idx = 0; group_idx < RTE_LPM_TBL8_NUM_GROUPS;
-			group_idx++) {
-		tbl8_entry = &tbl8[group_idx * RTE_LPM_TBL8_GROUP_NUM_ENTRIES];
-		/* If a free tbl8 group is found clean it and set as VALID. */
-		if (!tbl8_entry->valid_group) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = INVALID,
-				.depth = 0,
-				.valid_group = VALID,
-			};
-			new_tbl8_entry.next_hop = 0;
-
-			memset(&tbl8_entry[0], 0,
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES *
-					sizeof(tbl8_entry[0]));
-
-			__atomic_store(tbl8_entry, &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-
-			/* Return group index for allocated tbl8 group. */
-			return group_idx;
-		}
-	}
-
-	/* If there are no tbl8 groups free then return error. */
-	return -ENOSPC;
-}
-
-static int32_t
-tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
+tbl8_alloc(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
 {
 	uint32_t group_idx; /* tbl8 group index. */
 	struct rte_lpm_tbl_entry *tbl8_entry;
@@ -714,22 +425,7 @@ tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
 }
 
 static void
-tbl8_free_v20(struct rte_lpm_tbl_entry_v20 *tbl8, uint32_t tbl8_group_start)
-{
-	/* Set tbl8 group invalid*/
-	struct rte_lpm_tbl_entry_v20 zero_tbl8_entry = {
-		.valid = INVALID,
-		.depth = 0,
-		.valid_group = INVALID,
-	};
-	zero_tbl8_entry.next_hop = 0;
-
-	__atomic_store(&tbl8[tbl8_group_start], &zero_tbl8_entry,
-			__ATOMIC_RELAXED);
-}
-
-static void
-tbl8_free_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
+tbl8_free(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
 {
 	/* Set tbl8 group invalid*/
 	struct rte_lpm_tbl_entry zero_tbl8_entry = {0};
@@ -739,78 +435,7 @@ tbl8_free_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
 }
 
 static __rte_noinline int32_t
-add_depth_small_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	uint32_t tbl24_index, tbl24_range, tbl8_index, tbl8_group_end, i, j;
-
-	/* Calculate the index into Table24. */
-	tbl24_index = ip >> 8;
-	tbl24_range = depth_to_range(depth);
-
-	for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-		/*
-		 * For invalid OR valid and non-extended tbl 24 entries set
-		 * entry.
-		 */
-		if (!lpm->tbl24[i].valid || (lpm->tbl24[i].valid_group == 0 &&
-				lpm->tbl24[i].depth <= depth)) {
-
-			struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-				.valid = VALID,
-				.valid_group = 0,
-				.depth = depth,
-			};
-			new_tbl24_entry.next_hop = next_hop;
-
-			/* Setting tbl24 entry in one go to avoid race
-			 * conditions
-			 */
-			__atomic_store(&lpm->tbl24[i], &new_tbl24_entry,
-					__ATOMIC_RELEASE);
-
-			continue;
-		}
-
-		if (lpm->tbl24[i].valid_group == 1) {
-			/* If tbl24 entry is valid and extended calculate the
-			 *  index into tbl8.
-			 */
-			tbl8_index = lpm->tbl24[i].group_idx *
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-			tbl8_group_end = tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-			for (j = tbl8_index; j < tbl8_group_end; j++) {
-				if (!lpm->tbl8[j].valid ||
-						lpm->tbl8[j].depth <= depth) {
-					struct rte_lpm_tbl_entry_v20
-						new_tbl8_entry = {
-						.valid = VALID,
-						.valid_group = VALID,
-						.depth = depth,
-					};
-					new_tbl8_entry.next_hop = next_hop;
-
-					/*
-					 * Setting tbl8 entry in one go to avoid
-					 * race conditions
-					 */
-					__atomic_store(&lpm->tbl8[j],
-						&new_tbl8_entry,
-						__ATOMIC_RELAXED);
-
-					continue;
-				}
-			}
-		}
-	}
-
-	return 0;
-}
-
-static __rte_noinline int32_t
-add_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+add_depth_small(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
 #define group_idx next_hop
@@ -882,150 +507,7 @@ add_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 }
 
 static __rte_noinline int32_t
-add_depth_big_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth,
-		uint8_t next_hop)
-{
-	uint32_t tbl24_index;
-	int32_t tbl8_group_index, tbl8_group_start, tbl8_group_end, tbl8_index,
-		tbl8_range, i;
-
-	tbl24_index = (ip_masked >> 8);
-	tbl8_range = depth_to_range(depth);
-
-	if (!lpm->tbl24[tbl24_index].valid) {
-		/* Search for a free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v20(lpm->tbl8);
-
-		/* Check tbl8 allocation was successful. */
-		if (tbl8_group_index < 0) {
-			return tbl8_group_index;
-		}
-
-		/* Find index into tbl8 and range. */
-		tbl8_index = (tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES) +
-				(ip_masked & 0xFF);
-
-		/* Set tbl8 entry. */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop = next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		/*
-		 * Update tbl24 entry to point to new tbl8 entry. Note: The
-		 * ext_flag and tbl8_index need to be updated simultaneously,
-		 * so assign whole structure in one go
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.group_idx = (uint8_t)tbl8_group_index,
-			.valid = VALID,
-			.valid_group = 1,
-			.depth = 0,
-		};
-
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
-
-	} /* If valid entry but not extended calculate the index into Table8. */
-	else if (lpm->tbl24[tbl24_index].valid_group == 0) {
-		/* Search for free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v20(lpm->tbl8);
-
-		if (tbl8_group_index < 0) {
-			return tbl8_group_index;
-		}
-
-		tbl8_group_start = tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-		tbl8_group_end = tbl8_group_start +
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-		/* Populate new tbl8 with tbl24 value. */
-		for (i = tbl8_group_start; i < tbl8_group_end; i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = lpm->tbl24[tbl24_index].depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop =
-				lpm->tbl24[tbl24_index].next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-
-		/* Insert new rule into the tbl8 entry. */
-		for (i = tbl8_index; i < tbl8_index + tbl8_range; i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop = next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		/*
-		 * Update tbl24 entry to point to new tbl8 entry. Note: The
-		 * ext_flag and tbl8_index need to be updated simultaneously,
-		 * so assign whole structure in one go.
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-				.group_idx = (uint8_t)tbl8_group_index,
-				.valid = VALID,
-				.valid_group = 1,
-				.depth = 0,
-		};
-
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
-
-	} else { /*
-		* If it is valid, extended entry calculate the index into tbl8.
-		*/
-		tbl8_group_index = lpm->tbl24[tbl24_index].group_idx;
-		tbl8_group_start = tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-
-			if (!lpm->tbl8[i].valid ||
-					lpm->tbl8[i].depth <= depth) {
-				struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-					.valid = VALID,
-					.depth = depth,
-					.valid_group = lpm->tbl8[i].valid_group,
-				};
-				new_tbl8_entry.next_hop = next_hop;
-				/*
-				 * Setting tbl8 entry in one go to avoid race
-				 * condition
-				 */
-				__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
-
-				continue;
-			}
-		}
-	}
-
-	return 0;
-}
-
-static __rte_noinline int32_t
-add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
+add_depth_big(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 		uint32_t next_hop)
 {
 #define group_idx next_hop
@@ -1038,7 +520,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 
 	if (!lpm->tbl24[tbl24_index].valid) {
 		/* Search for a free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);
+		tbl8_group_index = tbl8_alloc(lpm->tbl8, lpm->number_tbl8s);
 
 		/* Check tbl8 allocation was successful. */
 		if (tbl8_group_index < 0) {
@@ -1084,7 +566,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 	} /* If valid entry but not extended calculate the index into Table8. */
 	else if (lpm->tbl24[tbl24_index].valid_group == 0) {
 		/* Search for free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);
+		tbl8_group_index = tbl8_alloc(lpm->tbl8, lpm->number_tbl8s);
 
 		if (tbl8_group_index < 0) {
 			return tbl8_group_index;
@@ -1177,49 +659,8 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 /*
  * Add a route
  */
-int __vsym
-rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	int32_t rule_index, status = 0;
-	uint32_t ip_masked;
-
-	/* Check user arguments. */
-	if ((lpm == NULL) || (depth < 1) || (depth > RTE_LPM_MAX_DEPTH))
-		return -EINVAL;
-
-	ip_masked = ip & depth_to_mask(depth);
-
-	/* Add the rule to the rule table. */
-	rule_index = rule_add_v20(lpm, ip_masked, depth, next_hop);
-
-	/* If the is no space available for new rule return error. */
-	if (rule_index < 0) {
-		return rule_index;
-	}
-
-	if (depth <= MAX_DEPTH_TBL24) {
-		status = add_depth_small_v20(lpm, ip_masked, depth, next_hop);
-	} else { /* If depth > RTE_LPM_MAX_DEPTH_TBL24 */
-		status = add_depth_big_v20(lpm, ip_masked, depth, next_hop);
-
-		/*
-		 * If add fails due to exhaustion of tbl8 extensions delete
-		 * rule that was added to rule table.
-		 */
-		if (status < 0) {
-			rule_delete_v20(lpm, rule_index, depth);
-
-			return status;
-		}
-	}
-
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm_add, _v20, 2.0);
-
-int __vsym
-rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+int
+rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
 	int32_t rule_index, status = 0;
@@ -1232,7 +673,7 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 	ip_masked = ip & depth_to_mask(depth);
 
 	/* Add the rule to the rule table. */
-	rule_index = rule_add_v1604(lpm, ip_masked, depth, next_hop);
+	rule_index = rule_add(lpm, ip_masked, depth, next_hop);
 
 	/* If the is no space available for new rule return error. */
 	if (rule_index < 0) {
@@ -1240,16 +681,16 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 	}
 
 	if (depth <= MAX_DEPTH_TBL24) {
-		status = add_depth_small_v1604(lpm, ip_masked, depth, next_hop);
+		status = add_depth_small(lpm, ip_masked, depth, next_hop);
 	} else { /* If depth > RTE_LPM_MAX_DEPTH_TBL24 */
-		status = add_depth_big_v1604(lpm, ip_masked, depth, next_hop);
+		status = add_depth_big(lpm, ip_masked, depth, next_hop);
 
 		/*
 		 * If add fails due to exhaustion of tbl8 extensions delete
 		 * rule that was added to rule table.
 		 */
 		if (status < 0) {
-			rule_delete_v1604(lpm, rule_index, depth);
+			rule_delete(lpm, rule_index, depth);
 
 			return status;
 		}
@@ -1257,42 +698,12 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_add, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_add(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth, uint32_t next_hop), rte_lpm_add_v1604);
 
 /*
  * Look for a rule in the high-level rules table
  */
-int __vsym
-rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-uint8_t *next_hop)
-{
-	uint32_t ip_masked;
-	int32_t rule_index;
-
-	/* Check user arguments. */
-	if ((lpm == NULL) ||
-		(next_hop == NULL) ||
-		(depth < 1) || (depth > RTE_LPM_MAX_DEPTH))
-		return -EINVAL;
-
-	/* Look for the rule using rule_find. */
-	ip_masked = ip & depth_to_mask(depth);
-	rule_index = rule_find_v20(lpm, ip_masked, depth);
-
-	if (rule_index >= 0) {
-		*next_hop = lpm->rules_tbl[rule_index].next_hop;
-		return 1;
-	}
-
-	/* If rule is not found return 0. */
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm_is_rule_present, _v20, 2.0);
-
-int __vsym
-rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+int
+rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop)
 {
 	uint32_t ip_masked;
@@ -1306,7 +717,7 @@ uint32_t *next_hop)
 
 	/* Look for the rule using rule_find. */
 	ip_masked = ip & depth_to_mask(depth);
-	rule_index = rule_find_v1604(lpm, ip_masked, depth);
+	rule_index = rule_find(lpm, ip_masked, depth);
 
 	if (rule_index >= 0) {
 		*next_hop = lpm->rules_tbl[rule_index].next_hop;
@@ -1316,12 +727,9 @@ uint32_t *next_hop)
 	/* If rule is not found return 0. */
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_is_rule_present, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth, uint32_t *next_hop), rte_lpm_is_rule_present_v1604);
 
 static int32_t
-find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
+find_previous_rule(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint8_t *sub_rule_depth)
 {
 	int32_t rule_index;
@@ -1331,7 +739,7 @@ find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 	for (prev_depth = (uint8_t)(depth - 1); prev_depth > 0; prev_depth--) {
 		ip_masked = ip & depth_to_mask(prev_depth);
 
-		rule_index = rule_find_v20(lpm, ip_masked, prev_depth);
+		rule_index = rule_find(lpm, ip_masked, prev_depth);
 
 		if (rule_index >= 0) {
 			*sub_rule_depth = prev_depth;
@@ -1343,133 +751,7 @@ find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 }
 
 static int32_t
-find_previous_rule_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-		uint8_t *sub_rule_depth)
-{
-	int32_t rule_index;
-	uint32_t ip_masked;
-	uint8_t prev_depth;
-
-	for (prev_depth = (uint8_t)(depth - 1); prev_depth > 0; prev_depth--) {
-		ip_masked = ip & depth_to_mask(prev_depth);
-
-		rule_index = rule_find_v1604(lpm, ip_masked, prev_depth);
-
-		if (rule_index >= 0) {
-			*sub_rule_depth = prev_depth;
-			return rule_index;
-		}
-	}
-
-	return -1;
-}
-
-static int32_t
-delete_depth_small_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked,
-	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
-{
-	uint32_t tbl24_range, tbl24_index, tbl8_group_index, tbl8_index, i, j;
-
-	/* Calculate the range and index into Table24. */
-	tbl24_range = depth_to_range(depth);
-	tbl24_index = (ip_masked >> 8);
-
-	/*
-	 * Firstly check the sub_rule_index. A -1 indicates no replacement rule
-	 * and a positive number indicates a sub_rule_index.
-	 */
-	if (sub_rule_index < 0) {
-		/*
-		 * If no replacement rule exists then invalidate entries
-		 * associated with this rule.
-		 */
-		for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-
-			if (lpm->tbl24[i].valid_group == 0 &&
-					lpm->tbl24[i].depth <= depth) {
-				struct rte_lpm_tbl_entry_v20
-					zero_tbl24_entry = {
-						.valid = INVALID,
-						.depth = 0,
-						.valid_group = 0,
-					};
-					zero_tbl24_entry.next_hop = 0;
-				__atomic_store(&lpm->tbl24[i],
-					&zero_tbl24_entry, __ATOMIC_RELEASE);
-			} else if (lpm->tbl24[i].valid_group == 1) {
-				/*
-				 * If TBL24 entry is extended, then there has
-				 * to be a rule with depth >= 25 in the
-				 * associated TBL8 group.
-				 */
-
-				tbl8_group_index = lpm->tbl24[i].group_idx;
-				tbl8_index = tbl8_group_index *
-						RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-				for (j = tbl8_index; j < (tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
-
-					if (lpm->tbl8[j].depth <= depth)
-						lpm->tbl8[j].valid = INVALID;
-				}
-			}
-		}
-	} else {
-		/*
-		 * If a replacement rule exists then modify entries
-		 * associated with this rule.
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.next_hop = lpm->rules_tbl[sub_rule_index].next_hop,
-			.valid = VALID,
-			.valid_group = 0,
-			.depth = sub_rule_depth,
-		};
-
-		struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-			.valid = VALID,
-			.valid_group = VALID,
-			.depth = sub_rule_depth,
-		};
-		new_tbl8_entry.next_hop =
-				lpm->rules_tbl[sub_rule_index].next_hop;
-
-		for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-
-			if (lpm->tbl24[i].valid_group == 0 &&
-					lpm->tbl24[i].depth <= depth) {
-				__atomic_store(&lpm->tbl24[i], &new_tbl24_entry,
-						__ATOMIC_RELEASE);
-			} else  if (lpm->tbl24[i].valid_group == 1) {
-				/*
-				 * If TBL24 entry is extended, then there has
-				 * to be a rule with depth >= 25 in the
-				 * associated TBL8 group.
-				 */
-
-				tbl8_group_index = lpm->tbl24[i].group_idx;
-				tbl8_index = tbl8_group_index *
-						RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-				for (j = tbl8_index; j < (tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
-
-					if (lpm->tbl8[j].depth <= depth)
-						__atomic_store(&lpm->tbl8[j],
-							&new_tbl8_entry,
-							__ATOMIC_RELAXED);
-				}
-			}
-		}
-	}
-
-	return 0;
-}
-
-static int32_t
-delete_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
+delete_depth_small(struct rte_lpm *lpm, uint32_t ip_masked,
 	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
 {
 #define group_idx next_hop
@@ -1576,7 +858,7 @@ delete_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
  * thus can be recycled
  */
 static int32_t
-tbl8_recycle_check_v20(struct rte_lpm_tbl_entry_v20 *tbl8,
+tbl8_recycle_check(struct rte_lpm_tbl_entry *tbl8,
 		uint32_t tbl8_group_start)
 {
 	uint32_t tbl8_group_end, i;
@@ -1623,140 +905,7 @@ tbl8_recycle_check_v20(struct rte_lpm_tbl_entry_v20 *tbl8,
 }
 
 static int32_t
-tbl8_recycle_check_v1604(struct rte_lpm_tbl_entry *tbl8,
-		uint32_t tbl8_group_start)
-{
-	uint32_t tbl8_group_end, i;
-	tbl8_group_end = tbl8_group_start + RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-	/*
-	 * Check the first entry of the given tbl8. If it is invalid we know
-	 * this tbl8 does not contain any rule with a depth < RTE_LPM_MAX_DEPTH
-	 *  (As they would affect all entries in a tbl8) and thus this table
-	 *  can not be recycled.
-	 */
-	if (tbl8[tbl8_group_start].valid) {
-		/*
-		 * If first entry is valid check if the depth is less than 24
-		 * and if so check the rest of the entries to verify that they
-		 * are all of this depth.
-		 */
-		if (tbl8[tbl8_group_start].depth <= MAX_DEPTH_TBL24) {
-			for (i = (tbl8_group_start + 1); i < tbl8_group_end;
-					i++) {
-
-				if (tbl8[i].depth !=
-						tbl8[tbl8_group_start].depth) {
-
-					return -EEXIST;
-				}
-			}
-			/* If all entries are the same return the tb8 index */
-			return tbl8_group_start;
-		}
-
-		return -EEXIST;
-	}
-	/*
-	 * If the first entry is invalid check if the rest of the entries in
-	 * the tbl8 are invalid.
-	 */
-	for (i = (tbl8_group_start + 1); i < tbl8_group_end; i++) {
-		if (tbl8[i].valid)
-			return -EEXIST;
-	}
-	/* If no valid entries are found then return -EINVAL. */
-	return -EINVAL;
-}
-
-static int32_t
-delete_depth_big_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked,
-	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
-{
-	uint32_t tbl24_index, tbl8_group_index, tbl8_group_start, tbl8_index,
-			tbl8_range, i;
-	int32_t tbl8_recycle_index;
-
-	/*
-	 * Calculate the index into tbl24 and range. Note: All depths larger
-	 * than MAX_DEPTH_TBL24 are associated with only one tbl24 entry.
-	 */
-	tbl24_index = ip_masked >> 8;
-
-	/* Calculate the index into tbl8 and range. */
-	tbl8_group_index = lpm->tbl24[tbl24_index].group_idx;
-	tbl8_group_start = tbl8_group_index * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-	tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-	tbl8_range = depth_to_range(depth);
-
-	if (sub_rule_index < 0) {
-		/*
-		 * Loop through the range of entries on tbl8 for which the
-		 * rule_to_delete must be removed or modified.
-		 */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (lpm->tbl8[i].depth <= depth)
-				lpm->tbl8[i].valid = INVALID;
-		}
-	} else {
-		/* Set new tbl8 entry. */
-		struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-			.valid = VALID,
-			.depth = sub_rule_depth,
-			.valid_group = lpm->tbl8[tbl8_group_start].valid_group,
-		};
-
-		new_tbl8_entry.next_hop =
-				lpm->rules_tbl[sub_rule_index].next_hop;
-		/*
-		 * Loop through the range of entries on tbl8 for which the
-		 * rule_to_delete must be modified.
-		 */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (lpm->tbl8[i].depth <= depth)
-				__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
-		}
-	}
-
-	/*
-	 * Check if there are any valid entries in this tbl8 group. If all
-	 * tbl8 entries are invalid we can free the tbl8 and invalidate the
-	 * associated tbl24 entry.
-	 */
-
-	tbl8_recycle_index = tbl8_recycle_check_v20(lpm->tbl8, tbl8_group_start);
-
-	if (tbl8_recycle_index == -EINVAL) {
-		/* Set tbl24 before freeing tbl8 to avoid race condition.
-		 * Prevent the free of the tbl8 group from hoisting.
-		 */
-		lpm->tbl24[tbl24_index].valid = 0;
-		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v20(lpm->tbl8, tbl8_group_start);
-	} else if (tbl8_recycle_index > -1) {
-		/* Update tbl24 entry. */
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.next_hop = lpm->tbl8[tbl8_recycle_index].next_hop,
-			.valid = VALID,
-			.valid_group = 0,
-			.depth = lpm->tbl8[tbl8_recycle_index].depth,
-		};
-
-		/* Set tbl24 before freeing tbl8 to avoid race condition.
-		 * Prevent the free of the tbl8 group from hoisting.
-		 */
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELAXED);
-		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v20(lpm->tbl8, tbl8_group_start);
-	}
-
-	return 0;
-}
-
-static int32_t
-delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
+delete_depth_big(struct rte_lpm *lpm, uint32_t ip_masked,
 	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
 {
 #define group_idx next_hop
@@ -1811,7 +960,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 	 * associated tbl24 entry.
 	 */
 
-	tbl8_recycle_index = tbl8_recycle_check_v1604(lpm->tbl8, tbl8_group_start);
+	tbl8_recycle_index = tbl8_recycle_check(lpm->tbl8, tbl8_group_start);
 
 	if (tbl8_recycle_index == -EINVAL) {
 		/* Set tbl24 before freeing tbl8 to avoid race condition.
@@ -1819,7 +968,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 		 */
 		lpm->tbl24[tbl24_index].valid = 0;
 		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v1604(lpm->tbl8, tbl8_group_start);
+		tbl8_free(lpm->tbl8, tbl8_group_start);
 	} else if (tbl8_recycle_index > -1) {
 		/* Update tbl24 entry. */
 		struct rte_lpm_tbl_entry new_tbl24_entry = {
@@ -1835,7 +984,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
 				__ATOMIC_RELAXED);
 		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v1604(lpm->tbl8, tbl8_group_start);
+		tbl8_free(lpm->tbl8, tbl8_group_start);
 	}
 #undef group_idx
 	return 0;
@@ -1844,8 +993,8 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 /*
  * Deletes a rule
  */
-int __vsym
-rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
+int
+rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
 {
 	int32_t rule_to_delete_index, sub_rule_index;
 	uint32_t ip_masked;
@@ -1864,7 +1013,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 	 * Find the index of the input rule, that needs to be deleted, in the
 	 * rule table.
 	 */
-	rule_to_delete_index = rule_find_v20(lpm, ip_masked, depth);
+	rule_to_delete_index = rule_find(lpm, ip_masked, depth);
 
 	/*
 	 * Check if rule_to_delete_index was found. If no rule was found the
@@ -1874,7 +1023,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 		return -EINVAL;
 
 	/* Delete the rule from the rule table. */
-	rule_delete_v20(lpm, rule_to_delete_index, depth);
+	rule_delete(lpm, rule_to_delete_index, depth);
 
 	/*
 	 * Find rule to replace the rule_to_delete. If there is no rule to
@@ -1882,100 +1031,26 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 	 * entries associated with this rule.
 	 */
 	sub_rule_depth = 0;
-	sub_rule_index = find_previous_rule_v20(lpm, ip, depth, &sub_rule_depth);
+	sub_rule_index = find_previous_rule(lpm, ip, depth, &sub_rule_depth);
 
 	/*
 	 * If the input depth value is less than 25 use function
 	 * delete_depth_small otherwise use delete_depth_big.
 	 */
 	if (depth <= MAX_DEPTH_TBL24) {
-		return delete_depth_small_v20(lpm, ip_masked, depth,
+		return delete_depth_small(lpm, ip_masked, depth,
 				sub_rule_index, sub_rule_depth);
 	} else { /* If depth > MAX_DEPTH_TBL24 */
-		return delete_depth_big_v20(lpm, ip_masked, depth, sub_rule_index,
+		return delete_depth_big(lpm, ip_masked, depth, sub_rule_index,
 				sub_rule_depth);
 	}
 }
-VERSION_SYMBOL(rte_lpm_delete, _v20, 2.0);
-
-int __vsym
-rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
-{
-	int32_t rule_to_delete_index, sub_rule_index;
-	uint32_t ip_masked;
-	uint8_t sub_rule_depth;
-	/*
-	 * Check input arguments. Note: IP must be a positive integer of 32
-	 * bits in length therefore it need not be checked.
-	 */
-	if ((lpm == NULL) || (depth < 1) || (depth > RTE_LPM_MAX_DEPTH)) {
-		return -EINVAL;
-	}
-
-	ip_masked = ip & depth_to_mask(depth);
-
-	/*
-	 * Find the index of the input rule, that needs to be deleted, in the
-	 * rule table.
-	 */
-	rule_to_delete_index = rule_find_v1604(lpm, ip_masked, depth);
-
-	/*
-	 * Check if rule_to_delete_index was found. If no rule was found the
-	 * function rule_find returns -EINVAL.
-	 */
-	if (rule_to_delete_index < 0)
-		return -EINVAL;
-
-	/* Delete the rule from the rule table. */
-	rule_delete_v1604(lpm, rule_to_delete_index, depth);
-
-	/*
-	 * Find rule to replace the rule_to_delete. If there is no rule to
-	 * replace the rule_to_delete we return -1 and invalidate the table
-	 * entries associated with this rule.
-	 */
-	sub_rule_depth = 0;
-	sub_rule_index = find_previous_rule_v1604(lpm, ip, depth, &sub_rule_depth);
-
-	/*
-	 * If the input depth value is less than 25 use function
-	 * delete_depth_small otherwise use delete_depth_big.
-	 */
-	if (depth <= MAX_DEPTH_TBL24) {
-		return delete_depth_small_v1604(lpm, ip_masked, depth,
-				sub_rule_index, sub_rule_depth);
-	} else { /* If depth > MAX_DEPTH_TBL24 */
-		return delete_depth_big_v1604(lpm, ip_masked, depth, sub_rule_index,
-				sub_rule_depth);
-	}
-}
-BIND_DEFAULT_SYMBOL(rte_lpm_delete, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth), rte_lpm_delete_v1604);
 
 /*
  * Delete all rules from the LPM table.
  */
-void __vsym
-rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm)
-{
-	/* Zero rule information. */
-	memset(lpm->rule_info, 0, sizeof(lpm->rule_info));
-
-	/* Zero tbl24. */
-	memset(lpm->tbl24, 0, sizeof(lpm->tbl24));
-
-	/* Zero tbl8. */
-	memset(lpm->tbl8, 0, sizeof(lpm->tbl8));
-
-	/* Delete all rules form the rules table. */
-	memset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);
-}
-VERSION_SYMBOL(rte_lpm_delete_all, _v20, 2.0);
-
-void __vsym
-rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
+void
+rte_lpm_delete_all(struct rte_lpm *lpm)
 {
 	/* Zero rule information. */
 	memset(lpm->rule_info, 0, sizeof(lpm->rule_info));
@@ -1990,6 +1065,3 @@ rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
 	/* Delete all rules form the rules table. */
 	memset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_delete_all, _v1604, 16.04);
-MAP_STATIC_SYMBOL(void rte_lpm_delete_all(struct rte_lpm *lpm),
-		rte_lpm_delete_all_v1604);
diff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h
index 26303e6288..b9d49ac879 100644
--- a/lib/librte_lpm/rte_lpm.h
+++ b/lib/librte_lpm/rte_lpm.h
@@ -64,31 +64,6 @@ extern "C" {
 
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
 /** @internal Tbl24 entry structure. */
-__extension__
-struct rte_lpm_tbl_entry_v20 {
-	/**
-	 * Stores Next hop (tbl8 or tbl24 when valid_group is not set) or
-	 * a group index pointing to a tbl8 structure (tbl24 only, when
-	 * valid_group is set)
-	 */
-	RTE_STD_C11
-	union {
-		uint8_t next_hop;
-		uint8_t group_idx;
-	};
-	/* Using single uint8_t to store 3 values. */
-	uint8_t valid     :1;   /**< Validation flag. */
-	/**
-	 * For tbl24:
-	 *  - valid_group == 0: entry stores a next hop
-	 *  - valid_group == 1: entry stores a group_index pointing to a tbl8
-	 * For tbl8:
-	 *  - valid_group indicates whether the current tbl8 is in use or not
-	 */
-	uint8_t valid_group :1;
-	uint8_t depth       :6; /**< Rule depth. */
-} __rte_aligned(sizeof(uint16_t));
-
 __extension__
 struct rte_lpm_tbl_entry {
 	/**
@@ -111,16 +86,6 @@ struct rte_lpm_tbl_entry {
 };
 
 #else
-__extension__
-struct rte_lpm_tbl_entry_v20 {
-	uint8_t depth       :6;
-	uint8_t valid_group :1;
-	uint8_t valid       :1;
-	union {
-		uint8_t group_idx;
-		uint8_t next_hop;
-	};
-} __rte_aligned(sizeof(uint16_t));
 
 __extension__
 struct rte_lpm_tbl_entry {
@@ -141,11 +106,6 @@ struct rte_lpm_config {
 };
 
 /** @internal Rule structure. */
-struct rte_lpm_rule_v20 {
-	uint32_t ip; /**< Rule IP address. */
-	uint8_t  next_hop; /**< Rule next hop. */
-};
-
 struct rte_lpm_rule {
 	uint32_t ip; /**< Rule IP address. */
 	uint32_t next_hop; /**< Rule next hop. */
@@ -158,21 +118,6 @@ struct rte_lpm_rule_info {
 };
 
 /** @internal LPM structure. */
-struct rte_lpm_v20 {
-	/* LPM metadata. */
-	char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
-	uint32_t max_rules; /**< Max. balanced rules per lpm. */
-	struct rte_lpm_rule_info rule_info[RTE_LPM_MAX_DEPTH]; /**< Rule info table. */
-
-	/* LPM Tables. */
-	struct rte_lpm_tbl_entry_v20 tbl24[RTE_LPM_TBL24_NUM_ENTRIES]
-			__rte_cache_aligned; /**< LPM tbl24 table. */
-	struct rte_lpm_tbl_entry_v20 tbl8[RTE_LPM_TBL8_NUM_ENTRIES]
-			__rte_cache_aligned; /**< LPM tbl8 table. */
-	struct rte_lpm_rule_v20 rules_tbl[]
-			__rte_cache_aligned; /**< LPM rules. */
-};
-
 struct rte_lpm {
 	/* LPM metadata. */
 	char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
@@ -209,11 +154,6 @@ struct rte_lpm {
 struct rte_lpm *
 rte_lpm_create(const char *name, int socket_id,
 		const struct rte_lpm_config *config);
-struct rte_lpm_v20 *
-rte_lpm_create_v20(const char *name, int socket_id, int max_rules, int flags);
-struct rte_lpm *
-rte_lpm_create_v1604(const char *name, int socket_id,
-		const struct rte_lpm_config *config);
 
 /**
  * Find an existing LPM object and return a pointer to it.
@@ -227,10 +167,6 @@ rte_lpm_create_v1604(const char *name, int socket_id,
  */
 struct rte_lpm *
 rte_lpm_find_existing(const char *name);
-struct rte_lpm_v20 *
-rte_lpm_find_existing_v20(const char *name);
-struct rte_lpm *
-rte_lpm_find_existing_v1604(const char *name);
 
 /**
  * Free an LPM object.
@@ -242,10 +178,6 @@ rte_lpm_find_existing_v1604(const char *name);
  */
 void
 rte_lpm_free(struct rte_lpm *lpm);
-void
-rte_lpm_free_v20(struct rte_lpm_v20 *lpm);
-void
-rte_lpm_free_v1604(struct rte_lpm *lpm);
 
 /**
  * Add a rule to the LPM table.
@@ -263,12 +195,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm);
  */
 int
 rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint32_t next_hop);
-int
-rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop);
-int
-rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-		uint32_t next_hop);
 
 /**
  * Check if a rule is present in the LPM table,
@@ -288,12 +214,6 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 int
 rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop);
-int
-rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-uint8_t *next_hop);
-int
-rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-uint32_t *next_hop);
 
 /**
  * Delete a rule from the LPM table.
@@ -309,10 +229,6 @@ uint32_t *next_hop);
  */
 int
 rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
-int
-rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth);
-int
-rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
 
 /**
  * Delete all rules from the LPM table.
@@ -322,10 +238,6 @@ rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
  */
 void
 rte_lpm_delete_all(struct rte_lpm *lpm);
-void
-rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm);
-void
-rte_lpm_delete_all_v1604(struct rte_lpm *lpm);
 
 /**
  * Lookup an IP into the LPM table.
diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c
index 0d161dc327..c46e557e23 100644
--- a/lib/librte_lpm/rte_lpm6.c
+++ b/lib/librte_lpm/rte_lpm6.c
@@ -809,18 +809,6 @@ add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl,
 	return 1;
 }
 
-/*
- * Add a route
- */
-int __vsym
-rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	return rte_lpm6_add_v1705(lpm, ip, depth, next_hop);
-}
-VERSION_SYMBOL(rte_lpm6_add, _v20, 2.0);
-
-
 /*
  * Simulate adding a route to LPM
  *
@@ -842,7 +830,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 
 	/* Inspect the first three bytes through tbl24 on the first step. */
 	ret = simulate_add_step(lpm, lpm->tbl24, &tbl_next, masked_ip,
-			ADD_FIRST_BYTE, 1, depth, &need_tbl_nb);
+		ADD_FIRST_BYTE, 1, depth, &need_tbl_nb);
 	total_need_tbl_nb = need_tbl_nb;
 	/*
 	 * Inspect one by one the rest of the bytes until
@@ -851,7 +839,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && ret == 1; i++) {
 		tbl = tbl_next;
 		ret = simulate_add_step(lpm, tbl, &tbl_next, masked_ip, 1,
-				(uint8_t)(i+1), depth, &need_tbl_nb);
+			(uint8_t)(i + 1), depth, &need_tbl_nb);
 		total_need_tbl_nb += need_tbl_nb;
 	}
 
@@ -862,9 +850,12 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	return 0;
 }
 
-int __vsym
-rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t next_hop)
+/*
+ * Add a route
+ */
+int
+rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
+	uint32_t next_hop)
 {
 	struct rte_lpm6_tbl_entry *tbl;
 	struct rte_lpm6_tbl_entry *tbl_next = NULL;
@@ -896,8 +887,8 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 	/* Inspect the first three bytes through tbl24 on the first step. */
 	tbl = lpm->tbl24;
 	status = add_step(lpm, tbl, TBL24_IND, &tbl_next, &tbl_next_num,
-			masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop,
-			is_new_rule);
+		masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop,
+		is_new_rule);
 	assert(status >= 0);
 
 	/*
@@ -907,17 +898,13 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 	for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && status == 1; i++) {
 		tbl = tbl_next;
 		status = add_step(lpm, tbl, tbl_next_num, &tbl_next,
-				&tbl_next_num, masked_ip, 1, (uint8_t)(i+1),
-				depth, next_hop, is_new_rule);
+			&tbl_next_num, masked_ip, 1, (uint8_t)(i + 1),
+			depth, next_hop, is_new_rule);
 		assert(status >= 0);
 	}
 
 	return status;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_add, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip,
-				uint8_t depth, uint32_t next_hop),
-		rte_lpm6_add_v1705);
 
 /*
  * Takes a pointer to a table entry and inspect one level.
@@ -955,26 +942,8 @@ lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl,
 /*
  * Looks up an IP
  */
-int __vsym
-rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop)
-{
-	uint32_t next_hop32 = 0;
-	int32_t status;
-
-	/* DEBUG: Check user input arguments. */
-	if (next_hop == NULL)
-		return -EINVAL;
-
-	status = rte_lpm6_lookup_v1705(lpm, ip, &next_hop32);
-	if (status == 0)
-		*next_hop = (uint8_t)next_hop32;
-
-	return status;
-}
-VERSION_SYMBOL(rte_lpm6_lookup, _v20, 2.0);
-
-int __vsym
-rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
+int
+rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
 		uint32_t *next_hop)
 {
 	const struct rte_lpm6_tbl_entry *tbl;
@@ -1001,56 +970,12 @@ rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
 
 	return status;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_lookup, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
-				uint32_t *next_hop), rte_lpm6_lookup_v1705);
 
 /*
  * Looks up a group of IP addresses
  */
-int __vsym
-rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int16_t * next_hops, unsigned n)
-{
-	unsigned i;
-	const struct rte_lpm6_tbl_entry *tbl;
-	const struct rte_lpm6_tbl_entry *tbl_next = NULL;
-	uint32_t tbl24_index, next_hop;
-	uint8_t first_byte;
-	int status;
-
-	/* DEBUG: Check user input arguments. */
-	if ((lpm == NULL) || (ips == NULL) || (next_hops == NULL))
-		return -EINVAL;
-
-	for (i = 0; i < n; i++) {
-		first_byte = LOOKUP_FIRST_BYTE;
-		tbl24_index = (ips[i][0] << BYTES2_SIZE) |
-				(ips[i][1] << BYTE_SIZE) | ips[i][2];
-
-		/* Calculate pointer to the first entry to be inspected */
-		tbl = &lpm->tbl24[tbl24_index];
-
-		do {
-			/* Continue inspecting following levels until success or failure */
-			status = lookup_step(lpm, tbl, &tbl_next, ips[i], first_byte++,
-					&next_hop);
-			tbl = tbl_next;
-		} while (status == 1);
-
-		if (status < 0)
-			next_hops[i] = -1;
-		else
-			next_hops[i] = (int16_t)next_hop;
-	}
-
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm6_lookup_bulk_func, _v20, 2.0);
-
-int __vsym
-rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
+int
+rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n)
 {
@@ -1090,37 +1015,12 @@ rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_lookup_bulk_func, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
-				uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-				int32_t *next_hops, unsigned int n),
-		rte_lpm6_lookup_bulk_func_v1705);
 
 /*
  * Look for a rule in the high-level rules table
  */
-int __vsym
-rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t *next_hop)
-{
-	uint32_t next_hop32 = 0;
-	int32_t status;
-
-	/* DEBUG: Check user input arguments. */
-	if (next_hop == NULL)
-		return -EINVAL;
-
-	status = rte_lpm6_is_rule_present_v1705(lpm, ip, depth, &next_hop32);
-	if (status > 0)
-		*next_hop = (uint8_t)next_hop32;
-
-	return status;
-
-}
-VERSION_SYMBOL(rte_lpm6_is_rule_present, _v20, 2.0);
-
-int __vsym
-rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
+int
+rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop)
 {
 	uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE];
@@ -1136,10 +1036,6 @@ rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 
 	return rule_find(lpm, masked_ip, depth, next_hop);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_is_rule_present, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_is_rule_present(struct rte_lpm6 *lpm,
-				uint8_t *ip, uint8_t depth, uint32_t *next_hop),
-		rte_lpm6_is_rule_present_v1705);
 
 /*
  * Delete a rule from the rule table.
diff --git a/lib/librte_lpm/rte_lpm6.h b/lib/librte_lpm/rte_lpm6.h
index 5d59ccb1fe..37dfb20249 100644
--- a/lib/librte_lpm/rte_lpm6.h
+++ b/lib/librte_lpm/rte_lpm6.h
@@ -96,12 +96,6 @@ rte_lpm6_free(struct rte_lpm6 *lpm);
 int
 rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t next_hop);
-int
-rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t next_hop);
-int
-rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t next_hop);
 
 /**
  * Check if a rule is present in the LPM table,
@@ -121,12 +115,6 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 int
 rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop);
-int
-rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t *next_hop);
-int
-rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t *next_hop);
 
 /**
  * Delete a rule from the LPM table.
@@ -184,11 +172,6 @@ rte_lpm6_delete_all(struct rte_lpm6 *lpm);
  */
 int
 rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip, uint32_t *next_hop);
-int
-rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop);
-int
-rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
-		uint32_t *next_hop);
 
 /**
  * Lookup multiple IP addresses in an LPM table.
@@ -210,14 +193,6 @@ int
 rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n);
-int
-rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int16_t *next_hops, unsigned int n);
-int
-rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int32_t *next_hops, unsigned int n);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
index 90beac853d..604ed416d1 100644
--- a/lib/librte_lpm/rte_lpm_version.map
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -1,23 +1,12 @@
 DPDK_2.0 {
 	global:
 
-	rte_lpm_add;
-	rte_lpm_create;
-	rte_lpm_delete;
-	rte_lpm_delete_all;
-	rte_lpm_find_existing;
-	rte_lpm_free;
-	rte_lpm_is_rule_present;
-	rte_lpm6_add;
 	rte_lpm6_create;
 	rte_lpm6_delete;
 	rte_lpm6_delete_all;
 	rte_lpm6_delete_bulk_func;
 	rte_lpm6_find_existing;
 	rte_lpm6_free;
-	rte_lpm6_is_rule_present;
-	rte_lpm6_lookup;
-	rte_lpm6_lookup_bulk_func;
 
 	local: *;
 };
-- 
2.17.1

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v8 06/12] timer: remove deprecated code
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (5 preceding siblings ...)
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 05/12] buildtools: add ABI update shell script Anatoly Burakov
@ 2019-11-20 17:23  3%       ` Anatoly Burakov
  2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 07/12] lpm: " Anatoly Burakov
                         ` (5 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Robert Sanford, Erik Gabriel Carrillo,
	john.mcnamara, ray.kinsella, bruce.richardson, thomas,
	david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
---
 lib/librte_timer/rte_timer.c           | 100 +++----------------------
 lib/librte_timer/rte_timer.h           |  15 ----
 lib/librte_timer/rte_timer_version.map |   5 --
 3 files changed, 10 insertions(+), 110 deletions(-)

diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c
index 381a9f43f8..ca88454ff6 100644
--- a/lib/librte_timer/rte_timer.c
+++ b/lib/librte_timer/rte_timer.c
@@ -68,9 +68,6 @@ static struct rte_timer_data *rte_timer_data_arr;
 static const uint32_t default_data_id;
 static uint32_t rte_timer_subsystem_initialized;
 
-/* For maintaining older interfaces for a period */
-static struct rte_timer_data default_timer_data;
-
 /* when debug is enabled, store some statistics */
 #ifdef RTE_LIBRTE_TIMER_DEBUG
 #define __TIMER_STAT_ADD(priv_timer, name, n) do {			\
@@ -131,30 +128,14 @@ rte_timer_data_dealloc(uint32_t id)
 	return 0;
 }
 
-void __vsym
-rte_timer_subsystem_init_v20(void)
-{
-	unsigned lcore_id;
-	struct priv_timer *priv_timer = default_timer_data.priv_timer;
-
-	/* since priv_timer is static, it's zeroed by default, so only init some
-	 * fields.
-	 */
-	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++) {
-		rte_spinlock_init(&priv_timer[lcore_id].list_lock);
-		priv_timer[lcore_id].prev_lcore = lcore_id;
-	}
-}
-VERSION_SYMBOL(rte_timer_subsystem_init, _v20, 2.0);
-
 /* Init the timer library. Allocate an array of timer data structs in shared
  * memory, and allocate the zeroth entry for use with original timer
  * APIs. Since the intersection of the sets of lcore ids in primary and
  * secondary processes should be empty, the zeroth entry can be shared by
  * multiple processes.
  */
-int __vsym
-rte_timer_subsystem_init_v1905(void)
+int
+rte_timer_subsystem_init(void)
 {
 	const struct rte_memzone *mz;
 	struct rte_timer_data *data;
@@ -209,9 +190,6 @@ rte_timer_subsystem_init_v1905(void)
 
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_timer_subsystem_init(void),
-		  rte_timer_subsystem_init_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_subsystem_init, _v1905, 19.05);
 
 void
 rte_timer_subsystem_finalize(void)
@@ -551,43 +529,14 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t expire,
 }
 
 /* Reset and start the timer associated with the timer handle tim */
-int __vsym
-rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
-		    enum rte_timer_type type, unsigned int tim_lcore,
-		    rte_timer_cb_t fct, void *arg)
-{
-	uint64_t cur_time = rte_get_timer_cycles();
-	uint64_t period;
-
-	if (unlikely((tim_lcore != (unsigned)LCORE_ID_ANY) &&
-			!(rte_lcore_is_enabled(tim_lcore) ||
-			  rte_lcore_has_role(tim_lcore, ROLE_SERVICE))))
-		return -1;
-
-	if (type == PERIODICAL)
-		period = ticks;
-	else
-		period = 0;
-
-	return __rte_timer_reset(tim,  cur_time + ticks, period, tim_lcore,
-			  fct, arg, 0, &default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_reset, _v20, 2.0);
-
-int __vsym
-rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
+int
+rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		      enum rte_timer_type type, unsigned int tim_lcore,
 		      rte_timer_cb_t fct, void *arg)
 {
 	return rte_timer_alt_reset(default_data_id, tim, ticks, type,
 				   tim_lcore, fct, arg);
 }
-MAP_STATIC_SYMBOL(int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
-				      enum rte_timer_type type,
-				      unsigned int tim_lcore,
-				      rte_timer_cb_t fct, void *arg),
-		  rte_timer_reset_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_reset, _v1905, 19.05);
 
 int
 rte_timer_alt_reset(uint32_t timer_data_id, struct rte_timer *tim,
@@ -657,21 +606,11 @@ __rte_timer_stop(struct rte_timer *tim, int local_is_locked,
 }
 
 /* Stop the timer associated with the timer handle tim */
-int __vsym
-rte_timer_stop_v20(struct rte_timer *tim)
-{
-	return __rte_timer_stop(tim, 0, &default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_stop, _v20, 2.0);
-
-int __vsym
-rte_timer_stop_v1905(struct rte_timer *tim)
+int
+rte_timer_stop(struct rte_timer *tim)
 {
 	return rte_timer_alt_stop(default_data_id, tim);
 }
-MAP_STATIC_SYMBOL(int rte_timer_stop(struct rte_timer *tim),
-		  rte_timer_stop_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_stop, _v1905, 19.05);
 
 int
 rte_timer_alt_stop(uint32_t timer_data_id, struct rte_timer *tim)
@@ -817,15 +756,8 @@ __rte_timer_manage(struct rte_timer_data *timer_data)
 	priv_timer[lcore_id].running_tim = NULL;
 }
 
-void __vsym
-rte_timer_manage_v20(void)
-{
-	__rte_timer_manage(&default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_manage, _v20, 2.0);
-
-int __vsym
-rte_timer_manage_v1905(void)
+int
+rte_timer_manage(void)
 {
 	struct rte_timer_data *timer_data;
 
@@ -835,8 +767,6 @@ rte_timer_manage_v1905(void)
 
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_timer_manage(void), rte_timer_manage_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_manage, _v1905, 19.05);
 
 int
 rte_timer_alt_manage(uint32_t timer_data_id,
@@ -1074,21 +1004,11 @@ __rte_timer_dump_stats(struct rte_timer_data *timer_data __rte_unused, FILE *f)
 #endif
 }
 
-void __vsym
-rte_timer_dump_stats_v20(FILE *f)
-{
-	__rte_timer_dump_stats(&default_timer_data, f);
-}
-VERSION_SYMBOL(rte_timer_dump_stats, _v20, 2.0);
-
-int __vsym
-rte_timer_dump_stats_v1905(FILE *f)
+int
+rte_timer_dump_stats(FILE *f)
 {
 	return rte_timer_alt_dump_stats(default_data_id, f);
 }
-MAP_STATIC_SYMBOL(int rte_timer_dump_stats(FILE *f),
-		  rte_timer_dump_stats_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_dump_stats, _v1905, 19.05);
 
 int
 rte_timer_alt_dump_stats(uint32_t timer_data_id __rte_unused, FILE *f)
diff --git a/lib/librte_timer/rte_timer.h b/lib/librte_timer/rte_timer.h
index 05d287d8f2..9dc5fc3092 100644
--- a/lib/librte_timer/rte_timer.h
+++ b/lib/librte_timer/rte_timer.h
@@ -181,8 +181,6 @@ int rte_timer_data_dealloc(uint32_t id);
  *      subsystem
  */
 int rte_timer_subsystem_init(void);
-int rte_timer_subsystem_init_v1905(void);
-void rte_timer_subsystem_init_v20(void);
 
 /**
  * @warning
@@ -250,13 +248,6 @@ void rte_timer_init(struct rte_timer *tim);
 int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		    enum rte_timer_type type, unsigned tim_lcore,
 		    rte_timer_cb_t fct, void *arg);
-int rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
-			  enum rte_timer_type type, unsigned int tim_lcore,
-			  rte_timer_cb_t fct, void *arg);
-int rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
-			enum rte_timer_type type, unsigned int tim_lcore,
-			rte_timer_cb_t fct, void *arg);
-
 
 /**
  * Loop until rte_timer_reset() succeeds.
@@ -313,8 +304,6 @@ rte_timer_reset_sync(struct rte_timer *tim, uint64_t ticks,
  *   - (-1): The timer is in the RUNNING or CONFIG state.
  */
 int rte_timer_stop(struct rte_timer *tim);
-int rte_timer_stop_v1905(struct rte_timer *tim);
-int rte_timer_stop_v20(struct rte_timer *tim);
 
 /**
  * Loop until rte_timer_stop() succeeds.
@@ -358,8 +347,6 @@ int rte_timer_pending(struct rte_timer *tim);
  *   - -EINVAL: timer subsystem not yet initialized
  */
 int rte_timer_manage(void);
-int rte_timer_manage_v1905(void);
-void rte_timer_manage_v20(void);
 
 /**
  * Dump statistics about timers.
@@ -371,8 +358,6 @@ void rte_timer_manage_v20(void);
  *   - -EINVAL: timer subsystem not yet initialized
  */
 int rte_timer_dump_stats(FILE *f);
-int rte_timer_dump_stats_v1905(FILE *f);
-void rte_timer_dump_stats_v20(FILE *f);
 
 /**
  * @warning
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
index 72f75c8181..92c69b2e29 100644
--- a/lib/librte_timer/rte_timer_version.map
+++ b/lib/librte_timer/rte_timer_version.map
@@ -1,15 +1,10 @@
 DPDK_2.0 {
 	global:
 
-	rte_timer_dump_stats;
 	rte_timer_init;
-	rte_timer_manage;
 	rte_timer_pending;
-	rte_timer_reset;
 	rte_timer_reset_sync;
-	rte_timer_stop;
 	rte_timer_stop_sync;
-	rte_timer_subsystem_init;
 
 	local: *;
 };
-- 
2.17.1

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v8 05/12] buildtools: add ABI update shell script
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (4 preceding siblings ...)
  2019-11-20 17:23 16%       ` [dpdk-dev] [PATCH v8 04/12] buildtools: add script for updating symbols abi version Anatoly Burakov
@ 2019-11-20 17:23 23%       ` Anatoly Burakov
  2019-11-20 17:23  3%       ` [dpdk-dev] [PATCH v8 06/12] timer: remove deprecated code Anatoly Burakov
                         ` (6 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, ray.kinsella, bruce.richardson, thomas, david.marchand

In order to facilitate mass updating of version files, add a shell
script that recurses into lib/ and drivers/ directories and calls
the ABI version update script.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v3:
    - Switch to sh rather than bash, and remove bash-isms
    - Address review comments
    
    v2:
    - Add this patch to split the shell script from previous commit
    - Fixup miscellaneous bugs

 buildtools/update-abi.sh | 46 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100755 buildtools/update-abi.sh

diff --git a/buildtools/update-abi.sh b/buildtools/update-abi.sh
new file mode 100755
index 0000000000..15bc6feab1
--- /dev/null
+++ b/buildtools/update-abi.sh
@@ -0,0 +1,46 @@
+#!/bin/sh -e
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+abi_version=$1
+abi_version_file="./ABI_VERSION"
+update_path="lib drivers"
+
+# check ABI version format string
+check_abi_version() {
+      echo $1 | grep -q -e "^[[:digit:]]\{1,2\}\.[[:digit:]]\{1,2\}$"
+}
+
+if [ -z "$1" ]; then
+      # output to stderr
+      >&2 echo "Please provide ABI version"
+      exit 1
+fi
+
+# check version string format
+if ! check_abi_version $abi_version ; then
+      # output to stderr
+      >&2 echo "ABI version must be formatted as MAJOR.MINOR version"
+      exit 1
+fi
+
+if [ -n "$2" ]; then
+      abi_version_file=$2
+fi
+
+if [ -n "$3" ]; then
+      # drop $1 and $2
+      shift 2
+      # assign all other arguments as update paths
+      update_path=$@
+fi
+
+echo "New ABI version:" $abi_version
+echo "ABI_VERSION path:" $abi_version_file
+echo "Path to update:" $update_path
+
+echo $abi_version > $abi_version_file
+
+find $update_path -name  \*version.map -exec \
+      ./buildtools/update_version_map_abi.py {} \
+      $abi_version \; -print
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v8 04/12] buildtools: add script for updating symbols abi version
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                         ` (3 preceding siblings ...)
  2019-11-20 17:23  1%       ` [dpdk-dev] [PATCH v8 03/12] build: remove individual library versions Anatoly Burakov
@ 2019-11-20 17:23 16%       ` Anatoly Burakov
  2019-11-20 20:05  7%         ` David Marchand
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 05/12] buildtools: add ABI update shell script Anatoly Burakov
                         ` (7 subsequent siblings)
  12 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Pawel Modrak, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand

From: Pawel Modrak <pawelx.modrak@intel.com>

Add a script that automatically merges all stable ABI's under one
ABI section with the new version, while leaving experimental
section exactly as it is.

Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v7:
    - Do not remove stable ABI if it was empty
    
    v6:
    - Split map file generation function in two
    - Do not print stable ABI if it wasn't present
    
    v3:
    - Add comments to regex patterns
    
    v2:
    - Reworked script to be pep8-compliant and more reliable

 buildtools/update_version_map_abi.py | 175 +++++++++++++++++++++++++++
 1 file changed, 175 insertions(+)
 create mode 100755 buildtools/update_version_map_abi.py

diff --git a/buildtools/update_version_map_abi.py b/buildtools/update_version_map_abi.py
new file mode 100755
index 0000000000..87fed54653
--- /dev/null
+++ b/buildtools/update_version_map_abi.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+"""
+A Python program that updates and merges all available stable ABI versions into
+one ABI version, while leaving experimental ABI exactly as it is. The intended
+ABI version is supplied via command-line parameter. This script is to be called
+from the buildtools/update_abi.sh utility.
+"""
+
+from __future__ import print_function
+import argparse
+import sys
+import re
+
+
+def __parse_map_file(f_in):
+    # match function name, followed by semicolon, followed by EOL, optionally
+    # with whitespace inbetween each item
+    func_line_regex = re.compile(r"\s*"
+                                 r"(?P<func>[a-zA-Z_0-9]+)"
+                                 r"\s*"
+                                 r";"
+                                 r"\s*"
+                                 r"$")
+    # match section name, followed by opening bracked, followed by EOL,
+    # optionally with whitespace inbetween each item
+    section_begin_regex = re.compile(r"\s*"
+                                     r"(?P<version>[a-zA-Z0-9_\.]+)"
+                                     r"\s*"
+                                     r"{"
+                                     r"\s*"
+                                     r"$")
+    # match closing bracket, optionally followed by section name (for when we
+    # inherit from another ABI version), followed by semicolon, followed by
+    # EOL, optionally with whitespace inbetween each item
+    section_end_regex = re.compile(r"\s*"
+                                   r"}"
+                                   r"\s*"
+                                   r"(?P<parent>[a-zA-Z0-9_\.]+)?"
+                                   r"\s*"
+                                   r";"
+                                   r"\s*"
+                                   r"$")
+
+    # for stable ABI, we don't care about which version introduced which
+    # function, we just flatten the list. there are dupes in certain files, so
+    # use a set instead of a list
+    stable_lines = set()
+    # copy experimental section as is
+    experimental_lines = []
+    in_experimental = False
+    has_stable = False
+
+    # gather all functions
+    for line in f_in:
+        # clean up the line
+        line = line.strip('\n').strip()
+
+        # is this an end of section?
+        match = section_end_regex.match(line)
+        if match:
+            # whatever section this was, it's not active any more
+            in_experimental = False
+            continue
+
+        # if we're in the middle of experimental section, we need to copy
+        # the section verbatim, so just add the line
+        if in_experimental:
+            experimental_lines += [line]
+            continue
+
+        # skip empty lines
+        if not line:
+            continue
+
+        # is this a beginning of a new section?
+        match = section_begin_regex.match(line)
+        if match:
+            cur_section = match.group("version")
+            # is it experimental?
+            in_experimental = cur_section == "EXPERIMENTAL"
+            if not in_experimental:
+                has_stable = True
+            continue
+
+        # is this a function?
+        match = func_line_regex.match(line)
+        if match:
+            stable_lines.add(match.group("func"))
+
+    return has_stable, stable_lines, experimental_lines
+
+
+def __generate_stable_abi(f_out, abi_version, lines):
+    # print ABI version header
+    print("DPDK_{} {{".format(abi_version), file=f_out)
+
+    # print global section if it exists
+    if lines:
+        print("\tglobal:", file=f_out)
+        # blank line
+        print(file=f_out)
+
+        # print all stable lines, alphabetically sorted
+        for line in sorted(lines):
+            print("\t{};".format(line), file=f_out)
+
+        # another blank line
+        print(file=f_out)
+
+    # print local section
+    print("\tlocal: *;", file=f_out)
+
+    # end stable version
+    print("};", file=f_out)
+
+
+def __generate_experimental_abi(f_out, lines):
+    # start experimental section
+    print("EXPERIMENTAL {", file=f_out)
+
+    # print all experimental lines as they were
+    for line in lines:
+        # don't print empty whitespace
+        if not line:
+            print("", file=f_out)
+        else:
+            print("\t{}".format(line), file=f_out)
+
+    # end section
+    print("};", file=f_out)
+
+
+def __main():
+    arg_parser = argparse.ArgumentParser(
+        description='Merge versions in linker version script.')
+
+    arg_parser.add_argument("map_file", type=str,
+                            help='path to linker version script file '
+                                 '(pattern: *version.map)')
+    arg_parser.add_argument("abi_version", type=str,
+                            help='target ABI version (pattern: MAJOR.MINOR)')
+
+    parsed = arg_parser.parse_args()
+
+    if not parsed.map_file.endswith('version.map'):
+        print("Invalid input file: {}".format(parsed.map_file),
+              file=sys.stderr)
+        arg_parser.print_help()
+        sys.exit(1)
+
+    if not re.match(r"\d{1,2}\.\d{1,2}", parsed.abi_version):
+        print("Invalid ABI version: {}".format(parsed.abi_version),
+              file=sys.stderr)
+        arg_parser.print_help()
+        sys.exit(1)
+
+    with open(parsed.map_file) as f_in:
+        has_stable, stable_lines, experimental_lines = __parse_map_file(f_in)
+
+    with open(parsed.map_file, 'w') as f_out:
+        need_newline = has_stable and experimental_lines
+        if has_stable:
+            __generate_stable_abi(f_out, parsed.abi_version, stable_lines)
+        if need_newline:
+            # separate sections with a newline
+            print(file=f_out)
+        if experimental_lines:
+            __generate_experimental_abi(f_out, experimental_lines)
+
+
+if __name__ == "__main__":
+    __main()
-- 
2.17.1

^ permalink raw reply	[relevance 16%]

* [dpdk-dev] [PATCH v8 02/12] config: remove CONFIG_RTE_MAJOR_ABI option
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
  2019-11-20 17:23  7%       ` [dpdk-dev] [PATCH v8 00/12] " Anatoly Burakov
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global Anatoly Burakov
@ 2019-11-20 17:23  9%       ` Anatoly Burakov
  2019-11-20 17:23  1%       ` [dpdk-dev] [PATCH v8 03/12] build: remove individual library versions Anatoly Burakov
                         ` (9 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Thomas Monjalon, john.mcnamara, ray.kinsella, bruce.richardson,
	david.marchand

The CONFIG_RTE_MAJOR_ABI option was introduced to permit multiple
DPDK versions installed side by side. The problem is now addressed
through the new ABI policy, and thus can be removed.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 config/common_base | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/config/common_base b/config/common_base
index 914277856d..4948e1c572 100644
--- a/config/common_base
+++ b/config/common_base
@@ -64,11 +64,6 @@ CONFIG_RTE_BUILD_SHARED_LIB=n
 #
 CONFIG_RTE_NEXT_ABI=y
 
-#
-# Major ABI to overwrite library specific LIBABIVER
-#
-CONFIG_RTE_MAJOR_ABI=
-
 #
 # Machine's cache line size
 #
-- 
2.17.1

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
  2019-11-20 17:23  7%       ` [dpdk-dev] [PATCH v8 00/12] " Anatoly Burakov
@ 2019-11-20 17:23 23%       ` Anatoly Burakov
  2019-11-20 19:51  4%         ` David Marchand
  2019-11-20 17:23  9%       ` [dpdk-dev] [PATCH v8 02/12] config: remove CONFIG_RTE_MAJOR_ABI option Anatoly Burakov
                         ` (10 subsequent siblings)
  12 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Thomas Monjalon, Ray Kinsella, John McNamara,
	Marko Kovacevic, Bruce Richardson, ray.kinsella, david.marchand,
	Pawel Modrak

From: Marcin Baran <marcinx.baran@intel.com>

As per new ABI policy [1], all of the libraries are now versioned using
one global ABI version. Stable libraries use the MAJOR.MINOR ABI
version for their shared objects, while experimental libraries
use the 0.MAJORMINOR convention for their versioning.
Experimental library versioning is managed globally. Changes in this
patch implement the necessary steps to enable that.

[1] https://doc.dpdk.org/guides/contributing/abi_policy.html

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v6:
    - Silenced grep error message on trying to grep a directory
    
    v3:
    - Removed Windows support from Makefile changes
    - Removed unneeded path conversions from meson files
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 ABI_VERSION                                |  1 +
 buildtools/meson.build                     |  3 +++
 config/meson.build                         |  7 ++++++-
 doc/guides/contributing/abi_versioning.rst | 17 +++++++++--------
 doc/guides/contributing/coding_style.rst   |  8 +-------
 drivers/meson.build                        | 18 ++++++++++++------
 lib/meson.build                            | 17 +++++++++++------
 meson_options.txt                          |  2 --
 mk/rte.lib.mk                              | 14 +++++---------
 9 files changed, 48 insertions(+), 39 deletions(-)
 create mode 100644 ABI_VERSION

diff --git a/ABI_VERSION b/ABI_VERSION
new file mode 100644
index 0000000000..9a7c1e503f
--- /dev/null
+++ b/ABI_VERSION
@@ -0,0 +1 @@
+20.0
diff --git a/buildtools/meson.build b/buildtools/meson.build
index 8d0b9e0cd0..6ef2c5721c 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -14,3 +14,6 @@ if python3.found()
 else
 	map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
 endif
+
+# stable ABI always starts with "DPDK_"
+is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
diff --git a/config/meson.build b/config/meson.build
index 2b1cb92e7e..3ffb73ab9c 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -18,6 +18,11 @@ endforeach
 # depending on the configuration options
 pver = meson.project_version().split('.')
 major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+abi_version = run_command(find_program('cat', 'more'),
+	files('../ABI_VERSION')).stdout().strip()
+# experimental libraries are versioned as 0.majorminor versions, e.g. 0.201
+ever = abi_version.split('.')
+experimental_abi_version = '0.@0@@1@'.format(ever.get(0), ever.get(1))
 
 # extract all version information into the build configuration
 dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
@@ -37,7 +42,7 @@ endif
 
 pmd_subdir_opt = get_option('drivers_install_subdir')
 if pmd_subdir_opt.contains('<VERSION>')
-	pmd_subdir_opt = major_version.join(pmd_subdir_opt.split('<VERSION>'))
+	pmd_subdir_opt = abi_version.join(pmd_subdir_opt.split('<VERSION>'))
 endif
 driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt)
 eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
index 050c971dd8..a21f4e7a41 100644
--- a/doc/guides/contributing/abi_versioning.rst
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -111,16 +111,17 @@ how this may be done.
  ...
 
 At the same time, the major ABI version is changed atomically across all
-libraries by incrementing the major version in individual library's soname, e.g.
-``libacl.so.21``. This is done by bumping the LIBABIVER number in the libraries
-Makefile to indicate to dynamic linking applications that this is a later, and
-possibly incompatible library version:
+libraries by incrementing the major version in the ABI_VERSION file. This is
+done globally for all libraries that declare a stable ABI. For libraries marked
+as EXPERIMENTAL, their major ABI version is always set to 0.
 
-.. code-block:: c
-
-   -LIBABIVER := 20
-   +LIBABIVER := 21
+Minor ABI versions
+~~~~~~~~~~~~~~~~~~
 
+Each non-LTS release will also increment minor ABI version, to permit multiple
+DPDK versions being installed alongside each other. Both stable and
+experimental ABI's are versioned using the global version file that is updated
+at the start of each release cycle, and are managed at the project level.
 
 Versioning Macros
 -----------------
diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index a6843de5ad..841ef6d5c8 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -803,9 +803,8 @@ lpm, etc. For drivers, the same format of Makefile is used.
 	CFLAGS += -O3
 	CFLAGS += $(WERROR_FLAGS)
 
-	# the symbol version information for the library, and .so version
+	# the symbol version information for the library
 	EXPORT_MAP := rte_<name>_version.map
-	LIBABIVER := 1
 
 	# all source filenames are stored in SRCS-y
 	SRCS-$(CONFIG_RTE_LIBRTE_<NAME>) += rte_<name>.c
@@ -955,11 +954,6 @@ use_function_versioning
 	twice with suitable parameters for each of shared or static library
 	builds.
 
-version
-	**Default Value = 1**.
-	Specifies the ABI version of the library, and is used as the major
-	version number of the resulting ``.so`` library.
-
 Meson Build File Contents - Drivers
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/drivers/meson.build b/drivers/meson.build
index 823e3ef839..80cc7001fe 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -41,7 +41,6 @@ foreach class:dpdk_driver_classes
 		build = true # set to false to disable, e.g. missing deps
 		reason = '<unknown reason>' # set if build == false to explain
 		name = drv
-		version = 1
 		allow_experimental_apis = false
 		sources = []
 		objs = []
@@ -124,12 +123,19 @@ foreach class:dpdk_driver_classes
 					output: out_filename,
 					depends: [pmdinfogen, tmp_lib])
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/@2@_version.map'.format(
+					meson.current_source_dir(),
+					drv_path, lib_name)
+
+			is_experimental = run_command(is_experimental_cmd,
+				files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = experimental_abi_version
+				so_version = experimental_abi_version
 			else
-				lib_version = major_version
-				so_version = major_version
+				lib_version = abi_version
+				so_version = abi_version
 			endif
 
 			# now build the static driver
diff --git a/lib/meson.build b/lib/meson.build
index bc8eb1d218..6ceb5e756e 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -47,7 +47,6 @@ foreach l:libraries
 	build = true
 	reason = '<unknown reason>' # set if build == false to explain why
 	name = l
-	version = 1
 	allow_experimental_apis = false
 	use_function_versioning = false
 	sources = []
@@ -106,12 +105,18 @@ foreach l:libraries
 				cflags += '-DRTE_USE_FUNCTION_VERSIONING'
 			endif
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/rte_@2@_version.map'.format(
+					meson.current_source_dir(), dir_name, name)
+
+			is_experimental = run_command(is_experimental_cmd,
+					files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = experimental_abi_version
+				so_version = experimental_abi_version
 			else
-				lib_version = major_version
-				so_version = major_version
+				lib_version = abi_version
+				so_version = abi_version
 			endif
 
 			# first build static lib
diff --git a/meson_options.txt b/meson_options.txt
index e6fcb884be..bc369d06c9 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -28,8 +28,6 @@ option('max_lcores', type: 'integer', value: 128,
 	description: 'maximum number of cores/threads supported by EAL')
 option('max_numa_nodes', type: 'integer', value: 4,
 	description: 'maximum number of NUMA nodes supported by EAL')
-option('per_library_versions', type: 'boolean', value: true,
-	description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
 option('tests', type: 'boolean', value: true,
 	description: 'build unit tests')
 option('use_hpet', type: 'boolean', value: false,
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 4df8849a08..3b318a5306 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -11,20 +11,16 @@ EXTLIB_BUILD ?= n
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
 
-ifneq ($(CONFIG_RTE_MAJOR_ABI),)
-ifneq ($(LIBABIVER),)
-LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
-endif
+ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
+LIBABIVER := $(shell cat $(RTE_SRCDIR)/ABI_VERSION)
+else
+# EXPERIMENTAL ABI is versioned as 0.major+minor, e.g. 0.201 for 20.1 ABI
+LIBABIVER := 0.$(shell cat $(RTE_SRCDIR)/ABI_VERSION | td -d '.')
 endif
 
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 ifeq ($(EXTLIB_BUILD),n)
-ifeq ($(CONFIG_RTE_MAJOR_ABI),)
-ifeq ($(CONFIG_RTE_NEXT_ABI),y)
-LIB := $(LIB).1
-endif
-endif
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 endif
 endif
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v8 00/12] Implement the new ABI policy and add helper scripts
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
@ 2019-11-20 17:23  7%       ` Anatoly Burakov
  2019-11-20 20:17  4%         ` Thomas Monjalon
  2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global Anatoly Burakov
                         ` (11 subsequent siblings)
  12 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-20 17:23 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, ray.kinsella, bruce.richardson, thomas, david.marchand

This patchset prepares the codebase for the new ABI policy and
adds a few helper scripts.

There are two new scripts for managing ABI versions added. The
first one is a Python script that will read in a .map file,
flatten it and update the ABI version to the ABI version
specified on the command-line.

The second one is a shell script that will run the above mentioned
Python script recursively over the source tree and set the ABI
version to either that which is defined in ABI_VERSION, or a 
user-specified one.

Example of its usage: buildtools/update-abi.sh 20.0

This will recurse into lib/ and drivers/ directory and update
whatever .map files it can find.

The other shell script that's added is one that can take in a .so
file and ensure that its declared public ABI matches either
current ABI, next ABI, or EXPERIMENTAL. This was moved to the
last commit because it made no sense to have it beforehand.

The source tree was verified to follow the new ABI policy using
the following command (assuming built binaries are in build/):

find ./build/lib ./build/drivers -name  \*.so \
	-exec ./buildtools/check-abi-version.sh {} \; -print

This returns 0.

Changes since v7:
- Addressed review feedback from Thomas regarding scripts
- Addressed David's suggestion to remove old ABI from timer/lpm
- Changed the way that experimental libraries are versioned (they are 
  now versioned using the same major/minor ABI versions, but are 
  constructed differently (e.g. 0.201 for 20.1 release)
- Removed CONFIG_RTE_MAJOR_ABI from base config
- Removed traces of individual library versioning
- Adjusted the ABI policy documentation to state that minor ABI version
  is bumped every release for both stable and experimental ABI

Changes since v6:
- Rebase on top of latest master
- Fixed map file generation to generate stable ABI if it was there,
  even if it was empty

Changes since v5:
- Addressed David's comments regarding libtool error messages
- Fixed map file generation to not generate empty stable ABI if
  it wasn't there before

Changes since v4:
- Fixed shared library build issue for distributor

Changes since v3:
- Put distributor code back and cleaned it up
- Rebased on latest master and regenerated commit 9

Changes since v2:
- Addressed Bruce's review comments
- Removed single distributor mode as per Dave's suggestion

Changes since v1:
- Reordered patchset to have removal of old ABI's before introducing
  the new one to avoid compile breakages between patches
- Added a new patch fixing missing symbol in octeontx common
- Split script commits into multiple commits and reordered them
- Re-generated the ABI bump commit
- Verified all scripts to work

Anatoly Burakov (4):
  config: remove CONFIG_RTE_MAJOR_ABI option
  build: remove individual library versions
  buildtools: add ABI update shell script
  drivers/octeontx: add missing public symbol

Marcin Baran (6):
  config: change ABI versioning to global
  timer: remove deprecated code
  lpm: remove deprecated code
  distributor: remove deprecated code
  distributor: rename v2.0 ABI to _single suffix
  buildtools: add ABI versioning check script

Pawel Modrak (2):
  buildtools: add script for updating symbols abi version
  build: change ABI version to 20.0

 ABI_VERSION                                   |    1 +
 buildtools/check-abi-version.sh               |   54 +
 buildtools/meson.build                        |    3 +
 buildtools/update-abi.sh                      |   46 +
 buildtools/update_version_map_abi.py          |  175 +++
 config/common_base                            |    5 -
 config/meson.build                            |    7 +-
 doc/guides/contributing/abi_versioning.rst    |   17 +-
 doc/guides/contributing/coding_style.rst      |    8 +-
 drivers/baseband/fpga_lte_fec/Makefile        |    3 -
 .../rte_pmd_bbdev_fpga_lte_fec_version.map    |    8 +-
 drivers/baseband/null/Makefile                |    3 -
 .../null/rte_pmd_bbdev_null_version.map       |    2 +-
 drivers/baseband/turbo_sw/Makefile            |    3 -
 .../rte_pmd_bbdev_turbo_sw_version.map        |    2 +-
 drivers/bus/dpaa/Makefile                     |    2 -
 drivers/bus/dpaa/meson.build                  |    2 -
 drivers/bus/dpaa/rte_bus_dpaa_version.map     |  113 +-
 drivers/bus/fslmc/Makefile                    |    3 -
 drivers/bus/fslmc/meson.build                 |    2 -
 drivers/bus/fslmc/rte_bus_fslmc_version.map   |  154 +--
 drivers/bus/ifpga/Makefile                    |    3 -
 drivers/bus/ifpga/meson.build                 |    2 -
 drivers/bus/ifpga/rte_bus_ifpga_version.map   |   14 +-
 drivers/bus/pci/Makefile                      |    1 -
 drivers/bus/pci/meson.build                   |    2 -
 drivers/bus/pci/rte_bus_pci_version.map       |    2 +-
 drivers/bus/vdev/Makefile                     |    3 -
 drivers/bus/vdev/meson.build                  |    2 -
 drivers/bus/vdev/rte_bus_vdev_version.map     |   12 +-
 drivers/bus/vmbus/Makefile                    |    1 -
 drivers/bus/vmbus/meson.build                 |    2 -
 drivers/bus/vmbus/rte_bus_vmbus_version.map   |   12 +-
 drivers/common/cpt/Makefile                   |    2 -
 drivers/common/cpt/rte_common_cpt_version.map |    9 +-
 drivers/common/dpaax/Makefile                 |    3 -
 .../common/dpaax/rte_common_dpaax_version.map |   14 +-
 drivers/common/mvep/Makefile                  |    3 -
 .../common/mvep/rte_common_mvep_version.map   |    6 +-
 drivers/common/octeontx/Makefile              |    2 -
 .../octeontx/rte_common_octeontx_version.map  |    7 +-
 drivers/common/octeontx2/Makefile             |    2 -
 .../rte_common_octeontx2_version.map          |   16 +-
 drivers/compress/isal/Makefile                |    3 -
 .../compress/isal/rte_pmd_isal_version.map    |    2 +-
 drivers/compress/octeontx/Makefile            |    3 -
 .../rte_pmd_octeontx_compress_version.map     |    2 +-
 drivers/compress/qat/rte_pmd_qat_version.map  |    2 +-
 drivers/compress/zlib/Makefile                |    3 -
 .../compress/zlib/rte_pmd_zlib_version.map    |    2 +-
 drivers/crypto/aesni_gcm/Makefile             |    3 -
 .../aesni_gcm/rte_pmd_aesni_gcm_version.map   |    2 +-
 drivers/crypto/aesni_mb/Makefile              |    3 -
 .../aesni_mb/rte_pmd_aesni_mb_version.map     |    2 +-
 drivers/crypto/armv8/Makefile                 |    3 -
 .../crypto/armv8/rte_pmd_armv8_version.map    |    2 +-
 drivers/crypto/caam_jr/Makefile               |    3 -
 .../caam_jr/rte_pmd_caam_jr_version.map       |    3 +-
 drivers/crypto/ccp/Makefile                   |    3 -
 drivers/crypto/ccp/rte_pmd_ccp_version.map    |    3 +-
 drivers/crypto/dpaa2_sec/Makefile             |    3 -
 drivers/crypto/dpaa2_sec/meson.build          |    2 -
 .../dpaa2_sec/rte_pmd_dpaa2_sec_version.map   |   10 +-
 drivers/crypto/dpaa_sec/Makefile              |    3 -
 .../dpaa_sec/rte_pmd_dpaa_sec_version.map     |   10 +-
 drivers/crypto/kasumi/Makefile                |    3 -
 .../crypto/kasumi/rte_pmd_kasumi_version.map  |    2 +-
 drivers/crypto/mvsam/Makefile                 |    3 -
 .../crypto/mvsam/rte_pmd_mvsam_version.map    |    2 +-
 drivers/crypto/nitrox/Makefile                |    3 -
 .../crypto/nitrox/rte_pmd_nitrox_version.map  |    2 +-
 drivers/crypto/null/Makefile                  |    3 -
 .../null/rte_pmd_null_crypto_version.map      |    2 +-
 drivers/crypto/octeontx/Makefile              |    3 -
 .../rte_pmd_octeontx_crypto_version.map       |    3 +-
 drivers/crypto/octeontx2/Makefile             |    3 -
 .../rte_pmd_octeontx2_crypto_version.map      |    3 +-
 drivers/crypto/openssl/Makefile               |    3 -
 .../openssl/rte_pmd_openssl_version.map       |    2 +-
 drivers/crypto/scheduler/Makefile             |    3 -
 .../rte_pmd_crypto_scheduler_version.map      |   19 +-
 drivers/crypto/snow3g/Makefile                |    3 -
 .../crypto/snow3g/rte_pmd_snow3g_version.map  |    2 +-
 drivers/crypto/virtio/Makefile                |    2 -
 .../virtio/rte_pmd_virtio_crypto_version.map  |    2 +-
 drivers/crypto/zuc/Makefile                   |    3 -
 drivers/crypto/zuc/rte_pmd_zuc_version.map    |    2 +-
 drivers/event/dpaa/Makefile                   |    2 -
 .../event/dpaa/rte_pmd_dpaa_event_version.map |    3 +-
 drivers/event/dpaa2/Makefile                  |    2 -
 drivers/event/dpaa2/meson.build               |    2 -
 .../dpaa2/rte_pmd_dpaa2_event_version.map     |    2 +-
 drivers/event/dsw/Makefile                    |    2 -
 .../event/dsw/rte_pmd_dsw_event_version.map   |    2 +-
 drivers/event/octeontx/Makefile               |    2 -
 .../rte_pmd_octeontx_event_version.map        |    2 +-
 drivers/event/octeontx2/Makefile              |    2 -
 .../rte_pmd_octeontx2_event_version.map       |    3 +-
 drivers/event/opdl/Makefile                   |    3 -
 .../event/opdl/rte_pmd_opdl_event_version.map |    2 +-
 drivers/event/skeleton/Makefile               |    2 -
 .../rte_pmd_skeleton_event_version.map        |    3 +-
 drivers/event/sw/Makefile                     |    3 -
 drivers/event/sw/rte_pmd_sw_event_version.map |    2 +-
 drivers/mempool/bucket/Makefile               |    2 -
 .../bucket/rte_mempool_bucket_version.map     |    3 +-
 drivers/mempool/dpaa/Makefile                 |    3 -
 .../mempool/dpaa/rte_mempool_dpaa_version.map |    2 +-
 drivers/mempool/dpaa2/Makefile                |    3 -
 drivers/mempool/dpaa2/meson.build             |    2 -
 .../dpaa2/rte_mempool_dpaa2_version.map       |   12 +-
 drivers/mempool/octeontx/Makefile             |    2 -
 .../octeontx/rte_mempool_octeontx_version.map |    2 +-
 drivers/mempool/octeontx2/Makefile            |    2 -
 .../rte_mempool_octeontx2_version.map         |    4 +-
 drivers/mempool/ring/Makefile                 |    2 -
 .../mempool/ring/rte_mempool_ring_version.map |    3 +-
 drivers/mempool/stack/Makefile                |    2 -
 .../stack/rte_mempool_stack_version.map       |    3 +-
 drivers/meson.build                           |   18 +-
 drivers/net/af_packet/Makefile                |    2 -
 .../af_packet/rte_pmd_af_packet_version.map   |    3 +-
 drivers/net/af_xdp/Makefile                   |    2 -
 drivers/net/af_xdp/rte_pmd_af_xdp_version.map |    2 +-
 drivers/net/ark/Makefile                      |    2 -
 drivers/net/ark/rte_pmd_ark_version.map       |    5 +-
 drivers/net/atlantic/Makefile                 |    2 -
 .../net/atlantic/rte_pmd_atlantic_version.map |    4 +-
 drivers/net/avp/Makefile                      |    2 -
 drivers/net/avp/rte_pmd_avp_version.map       |    2 +-
 drivers/net/axgbe/Makefile                    |    2 -
 drivers/net/axgbe/rte_pmd_axgbe_version.map   |    2 +-
 drivers/net/bnx2x/Makefile                    |    2 -
 drivers/net/bnx2x/rte_pmd_bnx2x_version.map   |    3 +-
 drivers/net/bnxt/Makefile                     |    2 -
 drivers/net/bnxt/meson.build                  |    1 -
 drivers/net/bnxt/rte_pmd_bnxt_version.map     |    4 +-
 drivers/net/bonding/Makefile                  |    2 -
 drivers/net/bonding/meson.build               |    1 -
 drivers/net/bonding/rte_pmd_bond_version.map  |   47 +-
 drivers/net/cxgbe/Makefile                    |    2 -
 drivers/net/cxgbe/rte_pmd_cxgbe_version.map   |    3 +-
 drivers/net/dpaa/Makefile                     |    2 -
 drivers/net/dpaa/rte_pmd_dpaa_version.map     |   11 +-
 drivers/net/dpaa2/Makefile                    |    3 -
 drivers/net/dpaa2/meson.build                 |    2 -
 drivers/net/dpaa2/rte_pmd_dpaa2_version.map   |   12 +-
 drivers/net/e1000/Makefile                    |    2 -
 drivers/net/e1000/rte_pmd_e1000_version.map   |    3 +-
 drivers/net/ena/Makefile                      |    2 -
 drivers/net/ena/rte_pmd_ena_version.map       |    3 +-
 drivers/net/enetc/Makefile                    |    2 -
 drivers/net/enetc/rte_pmd_enetc_version.map   |    3 +-
 drivers/net/enic/Makefile                     |    2 -
 drivers/net/enic/rte_pmd_enic_version.map     |    3 +-
 drivers/net/failsafe/Makefile                 |    2 -
 .../net/failsafe/rte_pmd_failsafe_version.map |    3 +-
 drivers/net/fm10k/Makefile                    |    2 -
 drivers/net/fm10k/rte_pmd_fm10k_version.map   |    3 +-
 drivers/net/hinic/Makefile                    |    2 -
 drivers/net/hinic/rte_pmd_hinic_version.map   |    3 +-
 drivers/net/hns3/Makefile                     |    2 -
 drivers/net/hns3/rte_pmd_hns3_version.map     |    4 +-
 drivers/net/i40e/Makefile                     |    2 -
 drivers/net/i40e/meson.build                  |    2 -
 drivers/net/i40e/rte_pmd_i40e_version.map     |   65 +-
 drivers/net/iavf/Makefile                     |    2 -
 drivers/net/iavf/rte_pmd_iavf_version.map     |    3 +-
 drivers/net/ice/Makefile                      |    2 -
 drivers/net/ice/rte_pmd_ice_version.map       |    3 +-
 drivers/net/ifc/Makefile                      |    2 -
 drivers/net/ifc/rte_pmd_ifc_version.map       |    3 +-
 drivers/net/ipn3ke/Makefile                   |    2 -
 drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map |    3 +-
 drivers/net/ixgbe/Makefile                    |    2 -
 drivers/net/ixgbe/meson.build                 |    2 -
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map   |   62 +-
 drivers/net/kni/Makefile                      |    2 -
 drivers/net/kni/rte_pmd_kni_version.map       |    3 +-
 drivers/net/liquidio/Makefile                 |    2 -
 .../net/liquidio/rte_pmd_liquidio_version.map |    3 +-
 drivers/net/memif/Makefile                    |    2 -
 drivers/net/memif/rte_pmd_memif_version.map   |    5 +-
 drivers/net/mlx4/Makefile                     |    2 -
 drivers/net/mlx4/rte_pmd_mlx4_version.map     |    3 +-
 drivers/net/mlx5/Makefile                     |    2 -
 drivers/net/mlx5/rte_pmd_mlx5_version.map     |    2 +-
 drivers/net/mvneta/Makefile                   |    3 -
 drivers/net/mvneta/rte_pmd_mvneta_version.map |    2 +-
 drivers/net/mvpp2/Makefile                    |    3 -
 drivers/net/mvpp2/rte_pmd_mvpp2_version.map   |    2 +-
 drivers/net/netvsc/Makefile                   |    2 -
 drivers/net/netvsc/meson.build                |    1 -
 drivers/net/netvsc/rte_pmd_netvsc_version.map |    4 +-
 drivers/net/nfb/Makefile                      |    2 -
 drivers/net/nfb/rte_pmd_nfb_version.map       |    3 +-
 drivers/net/nfp/Makefile                      |    2 -
 drivers/net/nfp/rte_pmd_nfp_version.map       |    2 +-
 drivers/net/null/Makefile                     |    2 -
 drivers/net/null/meson.build                  |    1 -
 drivers/net/null/rte_pmd_null_version.map     |    3 +-
 drivers/net/octeontx/Makefile                 |    2 -
 .../net/octeontx/rte_pmd_octeontx_version.map |   10 +-
 drivers/net/octeontx2/Makefile                |    2 -
 .../octeontx2/rte_pmd_octeontx2_version.map   |    3 +-
 drivers/net/pcap/Makefile                     |    2 -
 drivers/net/pcap/rte_pmd_pcap_version.map     |    3 +-
 drivers/net/pfe/Makefile                      |    2 -
 drivers/net/pfe/rte_pmd_pfe_version.map       |    3 +-
 drivers/net/qede/Makefile                     |    2 -
 drivers/net/qede/rte_pmd_qede_version.map     |    3 +-
 drivers/net/ring/Makefile                     |    2 -
 drivers/net/ring/meson.build                  |    1 -
 drivers/net/ring/rte_pmd_ring_version.map     |   10 +-
 drivers/net/sfc/Makefile                      |    2 -
 drivers/net/sfc/rte_pmd_sfc_version.map       |    3 +-
 drivers/net/softnic/Makefile                  |    2 -
 .../net/softnic/rte_pmd_softnic_version.map   |    2 +-
 drivers/net/szedata2/Makefile                 |    2 -
 .../net/szedata2/rte_pmd_szedata2_version.map |    2 +-
 drivers/net/tap/Makefile                      |    2 -
 drivers/net/tap/rte_pmd_tap_version.map       |    3 +-
 drivers/net/thunderx/Makefile                 |    2 -
 .../net/thunderx/rte_pmd_thunderx_version.map |    3 +-
 drivers/net/vdev_netvsc/Makefile              |    1 -
 .../rte_pmd_vdev_netvsc_version.map           |    3 +-
 drivers/net/vhost/Makefile                    |    2 -
 drivers/net/vhost/meson.build                 |    1 -
 drivers/net/vhost/rte_pmd_vhost_version.map   |   11 +-
 drivers/net/virtio/Makefile                   |    2 -
 drivers/net/virtio/rte_pmd_virtio_version.map |    3 +-
 drivers/net/vmxnet3/Makefile                  |    2 -
 .../net/vmxnet3/rte_pmd_vmxnet3_version.map   |    3 +-
 drivers/raw/dpaa2_cmdif/Makefile              |    2 -
 drivers/raw/dpaa2_cmdif/meson.build           |    2 -
 .../rte_rawdev_dpaa2_cmdif_version.map        |    3 +-
 drivers/raw/dpaa2_qdma/Makefile               |    2 -
 drivers/raw/dpaa2_qdma/meson.build            |    2 -
 .../rte_rawdev_dpaa2_qdma_version.map         |    4 +-
 drivers/raw/ifpga/Makefile                    |    2 -
 drivers/raw/ifpga/meson.build                 |    2 -
 .../raw/ifpga/rte_rawdev_ifpga_version.map    |    3 +-
 drivers/raw/ioat/Makefile                     |    3 -
 drivers/raw/ioat/rte_rawdev_ioat_version.map  |    3 +-
 drivers/raw/ntb/Makefile                      |    2 -
 drivers/raw/ntb/rte_rawdev_ntb_version.map    |    5 +-
 drivers/raw/octeontx2_dma/Makefile            |    2 -
 .../rte_rawdev_octeontx2_dma_version.map      |    3 +-
 drivers/raw/skeleton/Makefile                 |    2 -
 .../skeleton/rte_rawdev_skeleton_version.map  |    3 +-
 examples/ethtool/lib/Makefile                 |    2 -
 lib/librte_acl/Makefile                       |    2 -
 lib/librte_acl/meson.build                    |    1 -
 lib/librte_acl/rte_acl_version.map            |    2 +-
 lib/librte_bbdev/Makefile                     |    3 -
 lib/librte_bitratestats/Makefile              |    2 -
 lib/librte_bitratestats/meson.build           |    1 -
 .../rte_bitratestats_version.map              |    2 +-
 lib/librte_bpf/Makefile                       |    2 -
 lib/librte_cfgfile/Makefile                   |    2 -
 lib/librte_cfgfile/meson.build                |    1 -
 lib/librte_cfgfile/rte_cfgfile_version.map    |   34 +-
 lib/librte_cmdline/Makefile                   |    2 -
 lib/librte_cmdline/meson.build                |    1 -
 lib/librte_cmdline/rte_cmdline_version.map    |   10 +-
 lib/librte_compressdev/Makefile               |    3 -
 lib/librte_cryptodev/Makefile                 |    3 -
 lib/librte_cryptodev/meson.build              |    1 -
 .../rte_cryptodev_version.map                 |  102 +-
 lib/librte_distributor/Makefile               |    4 +-
 lib/librte_distributor/distributor_private.h  |   10 +-
 lib/librte_distributor/meson.build            |    2 +-
 lib/librte_distributor/rte_distributor.c      |   98 +-
 ...ributor_v20.c => rte_distributor_single.c} |   73 +-
 ...ributor_v20.h => rte_distributor_single.h} |   26 +-
 .../rte_distributor_v1705.h                   |   61 -
 .../rte_distributor_version.map               |   16 +-
 lib/librte_eal/freebsd/eal/Makefile           |    2 -
 lib/librte_eal/linux/eal/Makefile             |    2 -
 lib/librte_eal/rte_eal_version.map            |  324 ++----
 lib/librte_efd/Makefile                       |    2 -
 lib/librte_efd/rte_efd_version.map            |    2 +-
 lib/librte_ethdev/Makefile                    |    2 -
 lib/librte_ethdev/meson.build                 |    1 -
 lib/librte_ethdev/rte_ethdev_version.map      |  160 +--
 lib/librte_eventdev/Makefile                  |    3 -
 lib/librte_eventdev/meson.build               |    1 -
 lib/librte_eventdev/rte_eventdev_version.map  |  130 +--
 lib/librte_fib/Makefile                       |    2 -
 lib/librte_flow_classify/Makefile             |    2 -
 lib/librte_gro/Makefile                       |    2 -
 lib/librte_gro/rte_gro_version.map            |    2 +-
 lib/librte_gso/Makefile                       |    2 -
 lib/librte_gso/rte_gso_version.map            |    2 +-
 lib/librte_hash/Makefile                      |    2 -
 lib/librte_hash/meson.build                   |    1 -
 lib/librte_hash/rte_hash_version.map          |   43 +-
 lib/librte_ip_frag/Makefile                   |    2 -
 lib/librte_ip_frag/rte_ip_frag_version.map    |   10 +-
 lib/librte_ipsec/Makefile                     |    2 -
 lib/librte_ipsec/meson.build                  |    1 -
 lib/librte_jobstats/Makefile                  |    2 -
 lib/librte_jobstats/rte_jobstats_version.map  |   10 +-
 lib/librte_kni/Makefile                       |    2 -
 lib/librte_kni/meson.build                    |    1 -
 lib/librte_kni/rte_kni_version.map            |    2 +-
 lib/librte_kvargs/Makefile                    |    2 -
 lib/librte_kvargs/meson.build                 |    1 -
 lib/librte_kvargs/rte_kvargs_version.map      |    4 +-
 lib/librte_latencystats/Makefile              |    2 -
 .../rte_latencystats_version.map              |    2 +-
 lib/librte_lpm/Makefile                       |    2 -
 lib/librte_lpm/meson.build                    |    1 -
 lib/librte_lpm/rte_lpm.c                      | 1010 +----------------
 lib/librte_lpm/rte_lpm.h                      |   88 --
 lib/librte_lpm/rte_lpm6.c                     |  140 +--
 lib/librte_lpm/rte_lpm6.h                     |   25 -
 lib/librte_lpm/rte_lpm_version.map            |   39 +-
 lib/librte_mbuf/Makefile                      |    2 -
 lib/librte_mbuf/meson.build                   |    1 -
 lib/librte_mbuf/rte_mbuf_version.map          |   49 +-
 lib/librte_member/Makefile                    |    2 -
 lib/librte_member/rte_member_version.map      |    2 +-
 lib/librte_mempool/Makefile                   |    2 -
 lib/librte_mempool/meson.build                |    1 -
 lib/librte_mempool/rte_mempool_version.map    |   44 +-
 lib/librte_meter/Makefile                     |    2 -
 lib/librte_meter/meson.build                  |    1 -
 lib/librte_meter/rte_meter_version.map        |   13 +-
 lib/librte_metrics/Makefile                   |    2 -
 lib/librte_metrics/rte_metrics_version.map    |    2 +-
 lib/librte_net/Makefile                       |    2 -
 lib/librte_net/meson.build                    |    1 -
 lib/librte_net/rte_net_version.map            |   23 +-
 lib/librte_pci/Makefile                       |    2 -
 lib/librte_pci/meson.build                    |    2 -
 lib/librte_pci/rte_pci_version.map            |    2 +-
 lib/librte_pdump/Makefile                     |    2 -
 lib/librte_pdump/meson.build                  |    1 -
 lib/librte_pdump/rte_pdump_version.map        |    2 +-
 lib/librte_pipeline/Makefile                  |    2 -
 lib/librte_pipeline/meson.build               |    1 -
 lib/librte_pipeline/rte_pipeline_version.map  |   36 +-
 lib/librte_port/Makefile                      |    2 -
 lib/librte_port/meson.build                   |    1 -
 lib/librte_port/rte_port_version.map          |   64 +-
 lib/librte_power/Makefile                     |    2 -
 lib/librte_power/rte_power_version.map        |   24 +-
 lib/librte_rawdev/Makefile                    |    3 -
 lib/librte_rawdev/rte_rawdev_version.map      |    4 +-
 lib/librte_rcu/Makefile                       |    2 -
 lib/librte_reorder/Makefile                   |    2 -
 lib/librte_reorder/rte_reorder_version.map    |    8 +-
 lib/librte_rib/Makefile                       |    2 -
 lib/librte_ring/Makefile                      |    2 -
 lib/librte_ring/meson.build                   |    1 -
 lib/librte_ring/rte_ring_version.map          |   10 +-
 lib/librte_sched/Makefile                     |    2 -
 lib/librte_sched/meson.build                  |    1 -
 lib/librte_sched/rte_sched_version.map        |   14 +-
 lib/librte_security/Makefile                  |    3 -
 lib/librte_security/meson.build               |    1 -
 lib/librte_security/rte_security_version.map  |    2 +-
 lib/librte_stack/Makefile                     |    2 -
 lib/librte_stack/meson.build                  |    1 -
 lib/librte_table/Makefile                     |    2 -
 lib/librte_table/meson.build                  |    1 -
 lib/librte_table/rte_table_version.map        |    2 +-
 lib/librte_telemetry/Makefile                 |    2 -
 lib/librte_timer/Makefile                     |    2 -
 lib/librte_timer/rte_timer.c                  |  100 +-
 lib/librte_timer/rte_timer.h                  |   15 -
 lib/librte_timer/rte_timer_version.map        |   12 +-
 lib/librte_vhost/Makefile                     |    2 -
 lib/librte_vhost/meson.build                  |    1 -
 lib/librte_vhost/rte_vhost_version.map        |   52 +-
 lib/meson.build                               |   17 +-
 meson_options.txt                             |    2 -
 mk/rte.lib.mk                                 |   14 +-
 379 files changed, 1172 insertions(+), 3409 deletions(-)
 create mode 100644 ABI_VERSION
 create mode 100755 buildtools/check-abi-version.sh
 create mode 100755 buildtools/update-abi.sh
 create mode 100755 buildtools/update_version_map_abi.py
 rename lib/librte_distributor/{rte_distributor_v20.c => rte_distributor_single.c} (84%)
 rename lib/librte_distributor/{rte_distributor_v20.h => rte_distributor_single.h} (89%)
 delete mode 100644 lib/librte_distributor/rte_distributor_v1705.h

-- 
2.17.1

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [RFC 0/4] cpu-crypto API choices
  2019-11-18 11:57  0%   ` Ananyev, Konstantin
@ 2019-11-20 14:27  0%     ` Jerin Jacob
  0 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2019-11-20 14:27 UTC (permalink / raw)
  To: Ananyev, Konstantin
  Cc: dpdk-dev, techboard, Zhang, Roy Fan, Doherty, Declan, Akhil Goyal

On Mon, Nov 18, 2019 at 5:27 PM Ananyev, Konstantin
<konstantin.ananyev@intel.com> wrote:
>
> Hi Jerin,

Hi Konstantin,

>
> Thanks for input, my answers inline.
> Other guys - please provide your input.
> Thanks
> Konstantin
>
> > > Originally both SW and HW crypto PMDs use rte_crypot_op based API to
> > > process the crypto workload asynchronously. This way provides uniformity
> > > to both PMD types, but also introduce unnecessary performance penalty to
> > > SW PMDs that have to "simulate" HW async behavior
> > > (crypto-ops enqueue/dequeue, HW addresses computations,
> > > storing/dereferencing user provided data (mbuf) for each crypto-op,
> > > etc).
> > >
> > > The aim is to introduce a new optional API for SW crypto-devices
> > > to perform crypto processing in a synchronous manner.
> > > As summarized by Akhil, we need a synchronous API to perform crypto
> > > operations on raw data using SW PMDs, that provides:
> > >  - no crypto-ops.
> > >  - avoid using mbufs inside this API, use raw data buffers instead.
> > >  - no separate enqueue-dequeue, only single process() API for data path.
> > >  - input data buffers should be grouped by session,
> > >    i.e. each process() call takes one session and group of input buffers
> > >    that  belong to that session.
> > >  - All parameters that are constant accross session, should be stored
> > >    inside the session itself and reused by all incoming data buffers.
> > >
> > > While there seems no controversy about need of such functionality,
> > > there seems to be no agreement on what would be the best API for that.
> > > So I am requesting for TB input on that matter.
> > >
> > > Series structure:
> > > - patch #1 - intorduce basic data structures to be used by sync API
> > >   (no controversy here, I hope ..)
> > >   [RFC 1/4] cpu-crypto: Introduce basic data structures
> > > - patch #2 - Intel initial approach for new API (via rte_security)
> > >   [RFC 2/4] security: introduce cpu-crypto API
> > > - patch #3 - approach that reuses existing rte_cryptodev API as much as
> > >   possible
> > >   [RFC 3/4] cryptodev: introduce cpu-crypto API
> > > - patch #4 - approach via introducing new session data structure and API
> > >   [RFC 4/4] cryptodev: introduce rte_crypto_cpu_sym_session API
> > >
> > > Patches 2,3,4 are mutually exclusive,
> > > and we probably have to choose which one to go forward with.
> > > I put some explanations in each of the patches, hopefully that will help
> > > to  understand pros and cons of each one.
> > >
> > > Akhil strongly supports #3, AFAIK mainly because it allows PMDs to
> > > reuse existing API and minimize API level changes.
> > > My favorite is #4, #2 is less preferable but ok too.
> > > #3 seems problematic to me by the reasons I outlined in #4 patch
> > > description.
> > >
> > > Please provide your opinion.
> >
> > I spend some time on the proposal and I agree that sync API is needed
> > and it makes sense to remove queue emulation and allocating/freeing
> > the crypto_ops
> > in case of sync API.
> >
> > # I would prefer to not duplicate the session. If the newly added
> > fields are for optimization
> > then those can be applicable for HW too. For example, if we consider,
> > offset to be
> > constant for one session HW PMD will be able to leverage this. ref:
> > rte_crypto_aead_xfrom::cpu_crypto:offset
>
> It might, but right for async API we pass this info in crypto_op instead.
> So if I get you right your preference is sort of #3 approach
> that reuses existing rte_cryptodev API as much as possible:
> reuse existing rte_cryptodev_sym structure with new sync process() API?

Yes.

> > # I would prefer to not duplicate ops parameters, instead of the
> > existing rte_crypto_ops  can be updated.
> > I see that most members introduced in rte_crypto_sym_vec &
> > rte_crypto_vec are already existing in rte_crypto_op.
>
> rte_crypto_ops is way too generic/excessive.
> Filling/reading it seems one of the main slowdowns that  we trying to
> avoid in new API.

It does not look like it is going over 1 CL. Regarding the filling
case, I think,
We need to form the rte_crypto_ops in the slow path and change only in
mutable fields need to update per packet.

> >
> > Also, since we are agreeing that the ops for SYNC API can be from
> > stack/one time allocated, the size shouldn't matter.
>
> I can be on stack, but it means user will still have to fill them
> and PMD will have to read/process/overwrite them.
>
> > I understand that this would cause ABI breakage, but for this release,
> > we can work together and add some reserved fields
> > that we can implement later. I believe that's the reason why you want
> > to introduce new structures. I think that will bloat
> > the existing crypto lib.
>
> It will increase the lib code, but I don't think it will be significant.
> Honestly, I think messing with crypto_op and other existing structures
> might have much more negative effect.

Yes. We need to change it carefully.

>
> > If I understand it correctly, this will be used in conjunction with
> > IXGBE to handle fragmented IPsec traffic. If that's the fundamental
> > reasoning, then there is an alternate path possible.
>
> No, it's just one of the use-case.
> Pretty important, but not the only one.
> The main reason - current cryptodev API (crypto_op based) is suboptimal for SW based PMDs.
> We wasting too many cycles to pretend that it is a lookaside device underneath.

That I agree. I think, it should be fixed by the process() API.

> I think makes more sense to admit that it is SW based and exploit it nature,
> instead of trying to hide it.

Yes. I thought the separate process() device op will solve the major problems.

This is just my _personal_ opinion.  I leave crypto code contributors
to define specifics of API.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global
  2019-11-20 12:10  4%       ` Kinsella, Ray
@ 2019-11-20 13:31  9%         ` Thomas Monjalon
  2019-11-20 14:10  4%           ` Kinsella, Ray
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-20 13:31 UTC (permalink / raw)
  To: Kinsella, Ray, Burakov, Anatoly
  Cc: dev, Baran, MarcinX, Richardson, Bruce, Mcnamara, John,
	david.marchand, Pawel Modrak, Yigit, Ferruh

20/11/2019 13:10, Kinsella, Ray:
> From: Burakov, Anatoly <anatoly.burakov@intel.com>
> > --- a/drivers/meson.build
> > +++ b/drivers/meson.build
> > +			if is_experimental != 0
> > +				lib_version = '0.1'
> [rk] This all makes sense - except this part.
> [rk] I would expect the experimental major version to always be zero ...
> [rk] However I would expect the minor version to increment with each new release or at the maintainers discretion. 

Yes, the minor must be incremented with each new release
if we want to allow 2 DPDK versions to be installed in the same system.

This policy must be changed:
"
Experimental libraries always have a major version of 0
to indicate they exist outside of ABI Versioning,
with the minor version incremented with each ABI change to library.
"

I propose to re-use the global ABI version for experimental
by prefixing with "0.".
So for ABI 20.0, it could be 0.20.0 or 0.200? Which one?



^ permalink raw reply	[relevance 9%]

* Re: [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script
  2019-11-19 17:38  4%       ` Thomas Monjalon
@ 2019-11-20 11:50  4%         ` Burakov, Anatoly
  0 siblings, 0 replies; 200+ results
From: Burakov, Anatoly @ 2019-11-20 11:50 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, john.mcnamara, ray.kinsella, bruce.richardson, david.marchand

On 19-Nov-19 5:38 PM, Thomas Monjalon wrote:
> 08/11/2019 17:25, Anatoly Burakov:
>> In order to facilitate mass updating of version files, add a shell
>> script that recurses into lib/ and drivers/ directories and calls
>> the ABI version update script.
>>
>> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
>> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
>> --- /dev/null
>> +++ b/buildtools/update-abi.sh
>> @@ -0,0 +1,42 @@
>> +#!/bin/sh
> 
> For such script, I think -e is mandatory, so we do not miss any error.
> It would just require merge following check in the "if":
> 

As was discussed on IRC, i'm fine with -e added to shebang, but i don't 
like if statements that take half of my monitor :) I would rather put it 
into a function. I just tested it:

```
#!/bin/sh -e

func() {
         false
}

if [ !func ]; then
         echo "Error"
fi
func
echo "This is never reached"
```

This outputs "Error". So i think i'll go ahead and make it into a 
function. This would still leave the code readable, *and* satisfy the 
"#!/bin/sh -e" shebang requirement :)

-- 
Thanks,
Anatoly

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure
  2019-11-19 23:50  3%       ` Stephen Hemminger
@ 2019-11-20  7:01  0%         ` Shahaf Shuler
  0 siblings, 0 replies; 200+ results
From: Shahaf Shuler @ 2019-11-20  7:01 UTC (permalink / raw)
  To: Stephen Hemminger, Thomas Monjalon; +Cc: olivier.matz, dev

Wednesday, November 20, 2019 1:51 AM, Stephen Hemminger:
> Subject: Re: [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private
> structure
> 
> On Tue, 19 Nov 2019 23:30:15 +0100
> Thomas Monjalon <thomas@monjalon.net> wrote:
> 
> > 19/11/2019 17:25, Stephen Hemminger:
> > > On Tue, 19 Nov 2019 15:23:50 +0000
> > > Shahaf Shuler <shahafs@mellanox.com> wrote:
> > >
> > > > Tuesday, November 19, 2019 11:33 AM, Thomas Monjalon:
> > > > > Subject: Re: [PATCH] mbuf: extend pktmbuf pool private structure
> > > > >
> > > > > 18/11/2019 11:02, Shahaf Shuler:
> > > > > >  struct rte_pktmbuf_pool_private {
> > > > > >  	uint16_t mbuf_data_room_size; /**< Size of data space in
> each
> > > > > mbuf. */
> > > > > >  	uint16_t mbuf_priv_size;      /**< Size of private area in each
> mbuf.
> > > > > */
> > > > > > +	uint32_t reserved; /**< reserved for future use. */
> > > > >
> > > > > Maybe simpler to give the future name "flags" and keep the
> comment
> > > > > "reserved for future use".
> > > >
> > > > I'm am OK w/ changing to flags.
> > > > If Olivier accepts maybe you can change while applying?
> > >
> > > After the Linux openat experience if you want to add flags.
> > > Then all usage of API needs to validate that flags is 0.
> >
> > Sorry Stephen, I don't understand what you mean.
> > Please could you explain?
> >
> >
> 
> Any time a new field is added that maybe used later you can not guarantee
> that existing code correctly initializes the value to zero. What happened with
> openat() was that there was a flag value that was originally unused, but since
> kernel did not enforce that it was zero; it could not later be used for
> extensions.
> 
> You need to make sure that all reserved fields are initialized.
> That means when a private pool is created it is zeroed. And if a flag is new
> argument to an API, check for zero at create time.

I guess we can hard code the value for 0 on the rte_pktmbuf_pool_create function and have some assert on the rte_pktmbuf_pool_init callback (we cannot fail as this function returns void).
Any other places you find problematic? 

> 
> An example of how DPDK failed at this is the filter field in rte_pdump. Since it
> is not checked for NULL, it can't safely be used now (and still claim API/ABI
> compatiablity).

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] Minutes of Technical Board Meeting, 2019-11-06
@ 2019-11-20  5:26  4% Jerin Jacob Kollanukkaran
  0 siblings, 0 replies; 200+ results
From: Jerin Jacob Kollanukkaran @ 2019-11-20  5:26 UTC (permalink / raw)
  To: dev; +Cc: techboard

Minutes of Technical Board Meeting, 2019-11-06

Members Attending
-----------------
-Bruce
-Ferruh
-Hemant
-Honnappa
-Jerin (Chair)
-Kevin
-Konstantin
-Maxime
-Olivier
-Thomas

NOTE: The technical board meetings every second Wednesday on IRC  channel  #dpdk-board, at 3pm UTC. Meetings are public and DPDK community members  are welcome to attend.
 
NOTE: Next meeting will be on Wednesday 2019-11-20 @3pm UTC, and will be chaired by Honnappa

1) ABI policy review
- Reviewed API policy (http://inbox.dpdk.org/dev/2325188.Q6BSOo8498@xps/T/#u)
- Thomas sent the techboard's feedback on the mailing list
http://mails.dpdk.org/archives/dev/2019-November/150468.html

2) cpu-crypto API choices (http://patches.dpdk.org/cover/62489/)
- Decided to form a subgroup (Konstantin, Akhil, Honnappa, Hemant, Anoob, Jerin) for the discussion
- If there is no a clear majority then come back to the techboard for next level of discussions.
- Option provided to have reserved field in the public data structures to avoid ABI break for
future releases.

3)  vfio-pf out of tree module discussion follow-up
Following has been decided
- Disable all kmods in 20.02 by default
- Move igb_uio kernel module to new repo hosted by dpdk.org in v20.11
- The kernel VFIO maintainer thinks there _can_ be a solution for the DPDK use case.
Action item to send the kernel patch and discuss with kernel community.
Now, vfio_pf patch-set put on hold. It will not be not merged in v19.11 release.

4) VF port representor ops to ethdev (http://patches.dpdk.org/patch/62176/)

For the benefit of existing application and driver which implemented this API,
It's been decided to follow the existing logic. i.e. No change in ethdev API for
V19.11 release.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure
  @ 2019-11-19 23:50  3%       ` Stephen Hemminger
  2019-11-20  7:01  0%         ` Shahaf Shuler
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2019-11-19 23:50 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: Shahaf Shuler, olivier.matz, dev

On Tue, 19 Nov 2019 23:30:15 +0100
Thomas Monjalon <thomas@monjalon.net> wrote:

> 19/11/2019 17:25, Stephen Hemminger:
> > On Tue, 19 Nov 2019 15:23:50 +0000
> > Shahaf Shuler <shahafs@mellanox.com> wrote:
> >   
> > > Tuesday, November 19, 2019 11:33 AM, Thomas Monjalon:  
> > > > Subject: Re: [PATCH] mbuf: extend pktmbuf pool private structure
> > > > 
> > > > 18/11/2019 11:02, Shahaf Shuler:    
> > > > >  struct rte_pktmbuf_pool_private {
> > > > >  	uint16_t mbuf_data_room_size; /**< Size of data space in each    
> > > > mbuf. */    
> > > > >  	uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf.    
> > > > */    
> > > > > +	uint32_t reserved; /**< reserved for future use. */    
> > > > 
> > > > Maybe simpler to give the future name "flags" and keep the comment
> > > > "reserved for future use".    
> > > 
> > > I'm am OK w/ changing to flags.
> > > If Olivier accepts maybe you can change while applying?   
> > 
> > After the Linux openat experience if you want to add flags.
> > Then all usage of API needs to validate that flags is 0.  
> 
> Sorry Stephen, I don't understand what you mean.
> Please could you explain?
> 
> 

Any time a new field is added that maybe used later you can
not guarantee that existing code correctly initializes the value to
zero. What happened with openat() was that there was a flag value
that was originally unused, but since kernel did not enforce that
it was zero; it could not later be used for extensions.

You need to make sure that all reserved fields are initialized.
That means when a private pool is created it is zeroed. And if
a flag is new argument to an API, check for zero at create time.

An example of how DPDK failed at this is the filter field in
rte_pdump. Since it is not checked for NULL, it can't safely
be used now (and still claim API/ABI compatiablity).

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0 Anatoly Burakov
@ 2019-11-19 17:46  3%       ` Thomas Monjalon
  2019-11-19 21:50  7%       ` David Marchand
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-19 17:46 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Pawel Modrak, Nicolas Chautru, Hemant Agrawal,
	Sachin Saxena, Rosen Xu, Stephen Hemminger, Anoob Joseph,
	Tomasz Duszynski, Liron Himi, Jerin Jacob, Nithin Dabilpuram,
	Vamsi Attunuru, Lee Daly, Fiona Trahe, Ashish Gupta, Sunila Sahu,
	Declan Doherty, Pablo de Lara, Gagandeep Singh, Ravi Kumar,
	Akhil Goyal, Michael Shamis, Nagadheeraj Rottela,
	Srikanth Jampala, Ankur Dwivedi, Fan Zhang, Jay Zhou,
	Nipun Gupta, Mattias Rönnblom, Pavan Nikhilesh, Liang Ma,
	Peter Mccarthy, Harry van Haaren, Artem V. Andreev,
	Andrew Rybchenko, Olivier Matz, Gage Eads, John W. Linville,
	Xiaolong Ye, Qi Zhang, Shepard Siegel, Ed Czeck, John Miller,
	Igor Russkikh, Pavel Belous, Allain Legacy, Matt Peters,
	Rasesh Mody, Shahed Shaikh, Ajit Khaparde, Somnath Kotur,
	Chas Williams, Rahul Lakkireddy, Wenzhuo Lu, Marcin Wojtas,
	Michal Krawczyk, Guy Tzalik, Evgeny Schemeilin, Igor Chauskin,
	John Daley, Hyong Youb Kim, Gaetan Rivet, Xiao Wang, Ziyang Xuan,
	Xiaoyun Wang, Guoyang Zhou, Wei Hu (Xavier), Min Hu (Connor),
	Yisen Zhuang, Beilei Xing, Jingjing Wu, Qiming Yang,
	Konstantin Ananyev, Ferruh Yigit, Shijith Thotton,
	Srisivasubramanian Srinivasan, Jakub Grajciar, Matan Azrad,
	Shahaf Shuler, Viacheslav Ovsiienko, Zyta Szpak,
	K. Y. Srinivasan, Haiyang Zhang, Rastislav Cernay, Jan Remes,
	Alejandro Lucero, Tetsuya Mukawa, Kiran Kumar K,
	Bruce Richardson, Jasvinder Singh, Cristian Dumitrescu,
	Keith Wiles, Maciej Czekaj, Maxime Coquelin, Tiwei Bie,
	Zhihong Wang, Yong Wang, Tianfei zhang, Xiaoyun Li, Satha Rao,
	Shreyansh Jain, David Hunt, Byron Marohn, Yipeng Wang, Jiayu Hu,
	Sameh Gobriel, Reshma Pattan, Vladimir Medvedkin, Robert Sanford,
	Erik Gabriel Carrillo, john.mcnamara, ray.kinsella,
	david.marchand

08/11/2019 17:25, Anatoly Burakov:
> From: Pawel Modrak <pawelx.modrak@intel.com>
> 
> Merge all vesions in linker version script files to DPDK_20.0.
> 
> This commit was generated by running the following command:
> 
> :~/DPDK$ buildtools/update-abi.sh 20.0
> 
> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  148 files changed, 698 insertions(+), 1433 deletions(-)

That's really fantastic to have a tool doing that job!
Hopefully the diff will be smaller in next versions.

Question: should we run this script at the beginning of each version,
while incrementing the version numbers?



^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0 Anatoly Burakov
  2019-11-19 17:46  3%       ` Thomas Monjalon
@ 2019-11-19 21:50  7%       ` David Marchand
  2019-11-22  7:07  4%         ` Sachin Saxena
  1 sibling, 1 reply; 200+ results
From: David Marchand @ 2019-11-19 21:50 UTC (permalink / raw)
  To: Anatoly Burakov, Thomas Monjalon
  Cc: dev, Hemant Agrawal, Sachin Saxena, Stephen Hemminger, Mcnamara,
	John, Kinsella, Ray, Bruce Richardson

Reduced the Cc: list.

On Fri, Nov 8, 2019 at 5:26 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> From: Pawel Modrak <pawelx.modrak@intel.com>
>
> Merge all vesions in linker version script files to DPDK_20.0.
>
> This commit was generated by running the following command:
>
> :~/DPDK$ buildtools/update-abi.sh 20.0
>

I inspected the changes.
I caught just 3 oddities.
The first two were reported in the patches on timer and lpm.

The last one is in the dpaa bus driver:

> diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map
> index cf428a54dc..e6ca4361e0 100644
> --- a/drivers/bus/dpaa/rte_bus_dpaa_version.map
> +++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map
> -DPDK_18.08 {
> -       global:
> -
> -       fman_if_get_sg_enable;
> -       fman_if_set_sg;
> -
> -} DPDK_18.02;
> -
> -DPDK_18.11 {
> -       global:
> -
> -       bman_thread_irq;
> -       fman_if_get_sg_enable;
> -       fman_if_set_sg;
> -       qman_clear_irq;
> -
> -       qman_irqsource_add;
> -       qman_irqsource_remove;
>         qman_thread_fd;
>         qman_thread_irq;
> -

Here, we had fman_if_get_sg_enable and fman_if_set_sg in 18.08 and
18.11 sections, but no symbols for 18.08 were in the code.
I'd say this is fine, as there was no ABI change between 18.08 and
18.11 on them.


The rest of the series looks good to me.
Thanks Anatoly.


-- 
David Marchand


^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v7 05/10] lpm: remove deprecated code
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 05/10] lpm: " Anatoly Burakov
@ 2019-11-19 21:43  0%       ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-19 21:43 UTC (permalink / raw)
  To: Anatoly Burakov, Thomas Monjalon
  Cc: dev, Marcin Baran, Bruce Richardson, Vladimir Medvedkin,
	Mcnamara, John, Kinsella, Ray

On Fri, Nov 8, 2019 at 5:25 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> From: Marcin Baran <marcinx.baran@intel.com>
>
> Remove code for old ABI versions ahead of ABI version bump.
>
> Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>
> Notes:
>     v2:
>     - Moved this to before ABI version bump to avoid compile breakage

Idem, those symbols must be removed from the lib .map.

--- a/lib/librte_lpm/rte_lpm_version.map
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -1,23 +1,12 @@
 DPDK_2.0 {
        global:

-       rte_lpm_add;
-       rte_lpm_create;
-       rte_lpm_delete;
-       rte_lpm_delete_all;
-       rte_lpm_find_existing;
-       rte_lpm_free;
-       rte_lpm_is_rule_present;
-       rte_lpm6_add;
        rte_lpm6_create;
        rte_lpm6_delete;
        rte_lpm6_delete_all;
        rte_lpm6_delete_bulk_func;
        rte_lpm6_find_existing;
        rte_lpm6_free;
-       rte_lpm6_is_rule_present;
-       rte_lpm6_lookup;
-       rte_lpm6_lookup_bulk_func;

        local: *;
 };




--
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 04/10] timer: remove deprecated code
  2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 04/10] timer: remove deprecated code Anatoly Burakov
@ 2019-11-19 21:42  0%       ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-19 21:42 UTC (permalink / raw)
  To: Anatoly Burakov, Thomas Monjalon
  Cc: dev, Marcin Baran, Robert Sanford, Erik Gabriel Carrillo,
	Mcnamara, John, Kinsella, Ray, Bruce Richardson

On Fri, Nov 8, 2019 at 5:25 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> From: Marcin Baran <marcinx.baran@intel.com>
>
> Remove code for old ABI versions ahead of ABI version bump.
>
> Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> Acked-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
> ---
>
> Notes:
>     v2:
>     - Moved this to before ABI version bump to avoid compile breakage

The .map should have been cleaned up at the same time those symbols are removed.

diff --git a/lib/librte_timer/rte_timer_version.map
b/lib/librte_timer/rte_timer_version.map
index 72f75c818..92c69b2e2 100644
--- a/lib/librte_timer/rte_timer_version.map
+++ b/lib/librte_timer/rte_timer_version.map
@@ -1,15 +1,10 @@
 DPDK_2.0 {
        global:

-       rte_timer_dump_stats;
        rte_timer_init;
-       rte_timer_manage;
        rte_timer_pending;
-       rte_timer_reset;
        rte_timer_reset_sync;
-       rte_timer_stop;
        rte_timer_stop_sync;
-       rte_timer_subsystem_init;

        local: *;
 };



--
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 10/10] buildtools: add ABI versioning check script
  2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 10/10] buildtools: add ABI versioning check script Anatoly Burakov
@ 2019-11-19 18:16  8%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-19 18:16 UTC (permalink / raw)
  To: Anatoly Burakov, ray.kinsella
  Cc: dev, Marcin Baran, john.mcnamara, bruce.richardson,
	david.marchand, Pawel Modrak

08/11/2019 17:25, Anatoly Burakov:
> From: Marcin Baran <marcinx.baran@intel.com>
> +    echo "correct version (ABI_VER/ABI_VER+1/EXPERIMENTAL)"

I don't get why a symbol could be versioned for the next ABI?
Assuming we upgrade the ABI version at the beginning of the cycle,
every symbols should have the same version, right?

> +for SYM in `echo "${OBJ_DUMP_OUTPUT}" | awk '{print $(NF-1) "-" $NF}'`

Please, I really prefer we use the modern $() instead of backquotes.




^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script
  2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script Anatoly Burakov
@ 2019-11-19 17:38  4%       ` Thomas Monjalon
  2019-11-20 11:50  4%         ` Burakov, Anatoly
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-19 17:38 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, john.mcnamara, ray.kinsella, bruce.richardson, david.marchand

08/11/2019 17:25, Anatoly Burakov:
> In order to facilitate mass updating of version files, add a shell
> script that recurses into lib/ and drivers/ directories and calls
> the ABI version update script.
> 
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> --- /dev/null
> +++ b/buildtools/update-abi.sh
> @@ -0,0 +1,42 @@
> +#!/bin/sh

For such script, I think -e is mandatory, so we do not miss any error.
It would just require merge following check in the "if":

> +# check version string format
> +echo $abi_version | grep -q -e "^[[:digit:]]\{1,2\}\.[[:digit:]]\{1,2\}$"
> +if [ "$?" -ne 0 ]; then
> +      # output to stderr
> +      >&2 echo "ABI version must be formatted as MAJOR.MINOR version"
> +      exit 1
> +fi




^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version
  2019-11-19 15:38  4%         ` Burakov, Anatoly
@ 2019-11-19 16:05  7%           ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-19 16:05 UTC (permalink / raw)
  To: Burakov, Anatoly
  Cc: dev, Pawel Modrak, john.mcnamara, ray.kinsella, bruce.richardson,
	david.marchand

19/11/2019 16:38, Burakov, Anatoly:
> On 19-Nov-19 2:01 PM, Thomas Monjalon wrote:
> > 08/11/2019 17:25, Anatoly Burakov:
> >> From: Pawel Modrak <pawelx.modrak@intel.com>
> >>
> >> Add a script that automatically merges all stable ABI's under one
> >> ABI section with the new version, while leaving experimental
> >> section exactly as it is.
> >>
> >> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> >> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> >> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> >> ---
> >> --- /dev/null
> >> +++ b/buildtools/update_version_map_abi.py
> >> +"""
> >> +A Python program to update the ABI version and function names in a DPDK
> >> +lib_*_version.map file. Called from the buildtools/update_abi.sh utility.
> >> +"""
> > 
> > Clearly this script is doing more than updating a version number and names.
> > I already see more in the commit log.
> > Please would you like to add something in this description?
> 
> Not sure what you're referring to. That's exactly what it's doing. What 
> else is there that i'm missing?

"merges all stable ABI's under one ABI section"
"while leaving experimental section exactly as it is"

I think this needs to be in the comment at the top of the file,
so we have an introduction for the code in the rest of the file.



^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global
  2019-11-19 13:53  4%       ` Thomas Monjalon
@ 2019-11-19 15:48  8%         ` Burakov, Anatoly
  0 siblings, 0 replies; 200+ results
From: Burakov, Anatoly @ 2019-11-19 15:48 UTC (permalink / raw)
  To: Thomas Monjalon, Marcin Baran
  Cc: dev, Bruce Richardson, john.mcnamara, ray.kinsella,
	david.marchand, Pawel Modrak

On 19-Nov-19 1:53 PM, Thomas Monjalon wrote:
> 08/11/2019 17:25, Anatoly Burakov:
>> From: Marcin Baran <marcinx.baran@intel.com>
>>
>> As per new ABI policy, all of the libraries are now versioned using
>> one global ABI version. Changes in this patch implement the
>> necessary steps to enable that.
> 
> For the history, would be nice to describe the "why" of each change here.

Here and other review comments:

I never really touched this script because my meson-foo and ABI-foo is 
non-existent. I would really appreciate some help here on what the 
changes are supposed to do (esp. with regards to ABI versioning 
mechanics), because i understand very little of what this patch does.

> Please do not be lazy :)

Says the guy who waited until last moment to review it!

-- 
Thanks,
Anatoly

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version
  2019-11-19 14:01  4%       ` Thomas Monjalon
@ 2019-11-19 15:38  4%         ` Burakov, Anatoly
  2019-11-19 16:05  7%           ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Burakov, Anatoly @ 2019-11-19 15:38 UTC (permalink / raw)
  To: Thomas Monjalon, Pawel Modrak
  Cc: dev, john.mcnamara, ray.kinsella, bruce.richardson, david.marchand

On 19-Nov-19 2:01 PM, Thomas Monjalon wrote:
> 08/11/2019 17:25, Anatoly Burakov:
>> From: Pawel Modrak <pawelx.modrak@intel.com>
>>
>> Add a script that automatically merges all stable ABI's under one
>> ABI section with the new version, while leaving experimental
>> section exactly as it is.
>>
>> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
>> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
>> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
>> ---
>> --- /dev/null
>> +++ b/buildtools/update_version_map_abi.py
>> +"""
>> +A Python program to update the ABI version and function names in a DPDK
>> +lib_*_version.map file. Called from the buildtools/update_abi.sh utility.
>> +"""
> 
> Clearly this script is doing more than updating a version number and names.
> I already see more in the commit log.
> Please would you like to add something in this description?
> 
> 

Not sure what you're referring to. That's exactly what it's doing. What 
else is there that i'm missing?

-- 
Thanks,
Anatoly

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: update git fixline alias with cc to stable
  @ 2019-11-19 14:40  3%   ` Kevin Traynor
  0 siblings, 0 replies; 200+ results
From: Kevin Traynor @ 2019-11-19 14:40 UTC (permalink / raw)
  To: Bruce Richardson, Reshma Pattan; +Cc: dev, ferruh.yigit

On 19/11/2019 11:22, Bruce Richardson wrote:
> On Tue, Nov 19, 2019 at 11:03:57AM +0000, Reshma Pattan wrote:
>> Update git fixline alias to add stable@dpdk.org to Cc
>>
>> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
>> ---
>>  doc/guides/contributing/patches.rst | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
>> index 214030346..fa19d2eb5 100644
>> --- a/doc/guides/contributing/patches.rst
>> +++ b/doc/guides/contributing/patches.rst
>> @@ -255,7 +255,7 @@ Here are some guidelines for the body of a commit message:
>>    You can generate the required lines using the following git alias, which prints
>>    the commit SHA and the author of the original code::
>>  
>> -     git config alias.fixline "log -1 --abbrev=12 --format='Fixes: %h (\"%s\")%nCc: %ae'"
>> +     git config alias.fixline "log -1 --abbrev=12 --format='Fixes: %h (\"%s\")%nCc: %ae%nCc: stable@dpdk.org'"
>>  
>>    The output of ``git fixline <SHA>`` must then be added to the commit message::
>>  
> 
> While a good idea, we don't always want to CC stable for all fixes, as
> fixes for commits in the current release obviously don't need backports.
> I suggest the stable maintainers comment on whether receiving these
> additional patches would be a problem for them, or if their tooling is
> sufficiency advanced for them to ignore these without issue...
> 

If it were just applied to every fix, the tooling would catch the cases
where the offending commit is not in the stable tree. However, there are
times when authors don't want patches backported. For example, if it was
invasive and had no practical relevance in the older code, or it caused
an ABI change etc.

'Cc: stable@dpdk.org' is an indication that the patch is a candidate for
backporting. With a tag missing in error there can be follow up at
backport time, with a tag added in error the patch would be backported
and it could be a problem further down the line. Given that, I would
like to keep the current meaning of the tag so authors can indicate
their intentions.

thanks,
Kevin.

> /Bruce
> 


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version
  2019-11-08 16:25 15%     ` [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
@ 2019-11-19 14:01  4%       ` Thomas Monjalon
  2019-11-19 15:38  4%         ` Burakov, Anatoly
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-19 14:01 UTC (permalink / raw)
  To: Anatoly Burakov, Pawel Modrak
  Cc: dev, john.mcnamara, ray.kinsella, bruce.richardson, david.marchand

08/11/2019 17:25, Anatoly Burakov:
> From: Pawel Modrak <pawelx.modrak@intel.com>
> 
> Add a script that automatically merges all stable ABI's under one
> ABI section with the new version, while leaving experimental
> section exactly as it is.
> 
> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> --- /dev/null
> +++ b/buildtools/update_version_map_abi.py
> +"""
> +A Python program to update the ABI version and function names in a DPDK
> +lib_*_version.map file. Called from the buildtools/update_abi.sh utility.
> +"""

Clearly this script is doing more than updating a version number and names.
I already see more in the commit log.
Please would you like to add something in this description?



^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global
  2019-11-08 16:25  7%     ` [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global Anatoly Burakov
@ 2019-11-19 13:53  4%       ` Thomas Monjalon
  2019-11-19 15:48  8%         ` Burakov, Anatoly
  2019-11-20 12:10  4%       ` Kinsella, Ray
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-19 13:53 UTC (permalink / raw)
  To: Anatoly Burakov, Marcin Baran
  Cc: dev, Bruce Richardson, john.mcnamara, ray.kinsella,
	david.marchand, Pawel Modrak

08/11/2019 17:25, Anatoly Burakov:
> From: Marcin Baran <marcinx.baran@intel.com>
> 
> As per new ABI policy, all of the libraries are now versioned using
> one global ABI version. Changes in this patch implement the
> necessary steps to enable that.

For the history, would be nice to describe the "why" of each change here.
Please do not be lazy :)

> --- a/buildtools/meson.build
> +++ b/buildtools/meson.build
> +is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']

A comment is missing to explain the relationship between
"experimental" and "^DPDK_".


> --- /dev/null
> +++ b/config/ABI_VERSION
> +20.0

Why in config/ directory and not in root as for VERSION file?


> +			if is_experimental != 0
> +				lib_version = '0.1'

Why 0.1 and not 0.0?
How do we increment the minor version of experimental libs?

> +				so_version = '0'

How so_version is incremented?
It would deserve a comment here.

>  			if not use_function_versioning
> -				# use pre-build objects to build shared lib
> +				# then use pre-build objects to build shared lib

Is this change relevant?

> -option('per_library_versions', type: 'boolean', value: true,
> -	description: 'true: each lib gets its own version number, false: DPDK version used for each lib')

Good to see this option removed.




^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v6 0/1] Fix secondary process issue
@ 2019-11-19 12:31  3% Xiaoyun wang
  0 siblings, 0 replies; 200+ results
From: Xiaoyun wang @ 2019-11-19 12:31 UTC (permalink / raw)
  To: dev
  Cc: ferruh.yigit, shahar.belkar, luoxianjun, xuanziyang2,
	zhouguoyang, wulike1, tanya.brokhman, Xiaoyun wang

This patch removes rte_intr_callback_register from 
secondary process branch.

--
V5->V6:
  - Fix secondary process issue
  
V4->V5:
  - Fix code style check issue
  - Fix l2_len calculate errs for TSO
  - Replace mbuf alloc function with initialized

V3->v4:
  - Fix receive performance code review comments
  - Fix 32-bit build errs for mbox logs
  - Modify skb description as mbuf
 
V2->v3:
  - Split hinic.ini and hinic.rst to related feature patches
  - Add min_mtu & max_mtu initialization for hinic_dev_infos_get
  - Fix fdir config patch with net/hinic/base
  - Split link patch into link and fw version getting 2 patches
  - Update pmd doc files to new next version 
  - Add comments for cover letter patch
  - Add rxq & txq info getting interfaces
  - Fix load intrinsics for receiving packets
  
v1->v2:
  - Fix RSS bugs for vxlan packets inner type
  - Add comments for new added func interface
  - Fix code review comments from patch v1
  - Fix code style problems
  - Remove ceq interfaces and definitions that not used
  - Fix aeq init bugs, firstly alloc aeq resource, then set aeq ctrl len
  - Fix bar map bugs for VF Page size larger than PF
  - Modify link state set, add enable or disable fiber in tx direction 
  - Fix mbox and mgmt channel sync lock mechanism to reduce CPU usage
  - Fix FDIR bugs for VRRP packets
  - Fit ABI changes from dpdk lib

v1:
  - Support SR-IOV function
  - Support FLOW API for packet filter
  - Support allmulticast mode
  - Support MTU set
  - Support unicast and multicast MAC set
  - Support setting link down and up
  - Support get firmware version
  - Support inner L3 checksum offload
  - Support LRO offload
  - Add hinic PMD doc files

Xiaoyun wang (1):
  net/hinic: fix secondary process issue

 drivers/net/hinic/hinic_pmd_ethdev.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure
  2019-11-18 16:12  0% ` Stephen Hemminger
@ 2019-11-19  6:35  0%   ` Shahaf Shuler
  0 siblings, 0 replies; 200+ results
From: Shahaf Shuler @ 2019-11-19  6:35 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: olivier.matz, Thomas Monjalon, dev

Monday, November 18, 2019 6:12 PM, Stephen Hemminger:
> Subject: Re: [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private
> structure
> 
> On Mon, 18 Nov 2019 10:02:55 +0000
> Shahaf Shuler <shahafs@mellanox.com> wrote:
> 
> > With the API and ABI freeze ahead, it will be good to reserve some
> > bits on the private structure for future use.
> >
> > Otherwise we will potentially need to maintain two different private
> > structure during 2020 period.
> >
> > There is already one use case for those reserved bits[1]
> >
> > The reserved field should be set to 0 by the user.
> >
> > [1]
> >
> https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> >
> hes.dpdk.org%2Fpatch%2F63077%2F&amp;data=02%7C01%7Cshahafs%40m
> ellanox.
> >
> com%7C261be5d5bd344538663c08d76c420fcb%7Ca652971c7d2e4d9ba6a4d14
> 9256f4
> >
> 61b%7C0%7C0%7C637096903295807188&amp;sdata=ruzHICpeUCNXbw4XXD
> Xj1ZOP35Z
> > ZoUtgWbSPHYSKDFo%3D&amp;reserved=0
> >
> > Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> > ---
> 
> Understand the motivation but in my experience until you know what it is
> for, this doesn't work. And it creates lots of dead ends.

See cross reference [1]. I already have use case for it and understand how it is going to be used.
This is exactly why I am pushing this patch for 19.11. 

> 
> https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fen.wi
> kipedia.org%2Fwiki%2FYou_aren%2527t_gonna_need_it&amp;data=02%7C0
> 1%7Cshahafs%40mellanox.com%7C261be5d5bd344538663c08d76c420fcb%7C
> a652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C637096903295807188&a
> mp;sdata=U8wYu7M85a9F%2BrGxaaxpOce6Pedh4THo4%2Fi03Sj2OV0%3D&
> amp;reserved=0

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure
  2019-11-18 10:02  3% [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure Shahaf Shuler
@ 2019-11-18 16:12  0% ` Stephen Hemminger
  2019-11-19  6:35  0%   ` Shahaf Shuler
    2019-11-21 12:28  3% ` [dpdk-dev] [PATCH v2] " Shahaf Shuler
  2 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2019-11-18 16:12 UTC (permalink / raw)
  To: Shahaf Shuler; +Cc: olivier.matz, Thomas Monjalon, dev

On Mon, 18 Nov 2019 10:02:55 +0000
Shahaf Shuler <shahafs@mellanox.com> wrote:

> With the API and ABI freeze ahead, it will be good to reserve
> some bits on the private structure for future use.
> 
> Otherwise we will potentially need to maintain two different
> private structure during 2020 period.
> 
> There is already one use case for those reserved bits[1]
> 
> The reserved field should be set to 0 by the user.
> 
> [1]
> https://patches.dpdk.org/patch/63077/
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> ---

Understand the motivation but in my experience until you know
what it is for, this doesn't work. And it creates lots of dead ends.

https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] doc: add abi policy changes to release notes
@ 2019-11-18 13:15 22% Ray Kinsella
  2019-11-25 10:55  4% ` Mcnamara, John
  0 siblings, 1 reply; 200+ results
From: Ray Kinsella @ 2019-11-18 13:15 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, marko.kovacevic, Ray Kinsella

Add some pointers to the releases notes on the changes to the abi policy,
the introduction of project-level ABI management and the deprecation of
library-level management.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
---
 doc/guides/rel_notes/release_19_11.rst | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index c0045a9..9a2518c 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -308,6 +308,11 @@ Removed Items
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* Removed library-level ABI versions. These have been replaced with a single
+  project-level ABI version for non-experimental libraries and an ABI version of
+  ``0`` for experimental libraries. Review the :doc:`../contributing/abi_policy`
+  and :doc:`../contributing/abi_versioning` guides for more information.
+
 * Removed duplicated set of commands for Rx offload configuration from testpmd::
 
     port config all crc-strip|scatter|rx-cksum|rx-timestamp|
@@ -446,6 +451,12 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* policy: Please note the revisions to the :doc:`../contributing/abi_policy`
+  introducing major ABI versions, with DPDK 19.11 becoming the first major
+  version ``v20``. ABI changes to add new features continue to be permitted in
+  subsequent releases, with the condition that ABI compatibility with the major
+  ABI version is maintained.
+
 * net: The Ethernet address and other header definitions have changed
   attributes. They have been modified to be aligned on 2-byte boundaries.
   These changes should not impact normal usage because drivers naturally
-- 
2.7.4


^ permalink raw reply	[relevance 22%]

* Re: [dpdk-dev] [RFC 0/4] cpu-crypto API choices
  2019-11-14  5:46  3% ` Jerin Jacob
@ 2019-11-18 11:57  0%   ` Ananyev, Konstantin
  2019-11-20 14:27  0%     ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-18 11:57 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: dpdk-dev, techboard, Zhang, Roy Fan, Doherty, Declan, Akhil Goyal

Hi Jerin,

Thanks for input, my answers inline.
Other guys - please provide your input.
Thanks
Konstantin

> > Originally both SW and HW crypto PMDs use rte_crypot_op based API to
> > process the crypto workload asynchronously. This way provides uniformity
> > to both PMD types, but also introduce unnecessary performance penalty to
> > SW PMDs that have to "simulate" HW async behavior
> > (crypto-ops enqueue/dequeue, HW addresses computations,
> > storing/dereferencing user provided data (mbuf) for each crypto-op,
> > etc).
> >
> > The aim is to introduce a new optional API for SW crypto-devices
> > to perform crypto processing in a synchronous manner.
> > As summarized by Akhil, we need a synchronous API to perform crypto
> > operations on raw data using SW PMDs, that provides:
> >  - no crypto-ops.
> >  - avoid using mbufs inside this API, use raw data buffers instead.
> >  - no separate enqueue-dequeue, only single process() API for data path.
> >  - input data buffers should be grouped by session,
> >    i.e. each process() call takes one session and group of input buffers
> >    that  belong to that session.
> >  - All parameters that are constant accross session, should be stored
> >    inside the session itself and reused by all incoming data buffers.
> >
> > While there seems no controversy about need of such functionality,
> > there seems to be no agreement on what would be the best API for that.
> > So I am requesting for TB input on that matter.
> >
> > Series structure:
> > - patch #1 - intorduce basic data structures to be used by sync API
> >   (no controversy here, I hope ..)
> >   [RFC 1/4] cpu-crypto: Introduce basic data structures
> > - patch #2 - Intel initial approach for new API (via rte_security)
> >   [RFC 2/4] security: introduce cpu-crypto API
> > - patch #3 - approach that reuses existing rte_cryptodev API as much as
> >   possible
> >   [RFC 3/4] cryptodev: introduce cpu-crypto API
> > - patch #4 - approach via introducing new session data structure and API
> >   [RFC 4/4] cryptodev: introduce rte_crypto_cpu_sym_session API
> >
> > Patches 2,3,4 are mutually exclusive,
> > and we probably have to choose which one to go forward with.
> > I put some explanations in each of the patches, hopefully that will help
> > to  understand pros and cons of each one.
> >
> > Akhil strongly supports #3, AFAIK mainly because it allows PMDs to
> > reuse existing API and minimize API level changes.
> > My favorite is #4, #2 is less preferable but ok too.
> > #3 seems problematic to me by the reasons I outlined in #4 patch
> > description.
> >
> > Please provide your opinion.
> 
> I spend some time on the proposal and I agree that sync API is needed
> and it makes sense to remove queue emulation and allocating/freeing
> the crypto_ops
> in case of sync API.
> 
> # I would prefer to not duplicate the session. If the newly added
> fields are for optimization
> then those can be applicable for HW too. For example, if we consider,
> offset to be
> constant for one session HW PMD will be able to leverage this. ref:
> rte_crypto_aead_xfrom::cpu_crypto:offset

It might, but right for async API we pass this info in crypto_op instead.
So if I get you right your preference is sort of #3 approach
that reuses existing rte_cryptodev API as much as possible:
reuse existing rte_cryptodev_sym structure with new sync process() API?
 
> # I would prefer to not duplicate ops parameters, instead of the
> existing rte_crypto_ops  can be updated.
> I see that most members introduced in rte_crypto_sym_vec &
> rte_crypto_vec are already existing in rte_crypto_op.

rte_crypto_ops is way too generic/excessive.
Filling/reading it seems one of the main slowdowns that  we trying to
avoid in new API. 

> 
> Also, since we are agreeing that the ops for SYNC API can be from
> stack/one time allocated, the size shouldn't matter.

I can be on stack, but it means user will still have to fill them
and PMD will have to read/process/overwrite them. 
 
> I understand that this would cause ABI breakage, but for this release,
> we can work together and add some reserved fields
> that we can implement later. I believe that's the reason why you want
> to introduce new structures. I think that will bloat
> the existing crypto lib.

It will increase the lib code, but I don't think it will be significant.
Honestly, I think messing with crypto_op and other existing structures
might have much more negative effect. 
 
> If I understand it correctly, this will be used in conjunction with
> IXGBE to handle fragmented IPsec traffic. If that's the fundamental
> reasoning, then there is an alternate path possible.

No, it's just one of the use-case.
Pretty important, but not the only one.
The main reason - current cryptodev API (crypto_op based) is suboptimal for SW based PMDs.
We wasting too many cycles to pretend that it is a lookaside device underneath.
I think makes more sense to admit that it is SW based and exploit it nature,
instead of trying to hide it.

> Currently, the  issue is, rte_security doesn't define the treatment for fragmented
> packets. Maybe let's define it and then a similar CPU crypto
> processing can be done inside the PMD. By creating an internal
> function in S/W PMDs and calling it from the inline crypto enabled eth
> PMDs, fragmentation support for inline crypto devices can
> be achieved. This way the application would look clean. All the
> fragmentation related configuration (no of fragmentation contexts
> needed,
> reassembly timeout etc) need to be added in rte_security library and
> the result for that operation will come as dynamic fields in the mbuf.
> 
> Just my 2c.
> 
 


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 1/6] lib/eal: implement the family of rte bit operation APIs
  @ 2019-11-18 10:06  2%   ` Joyce Kong
  0 siblings, 0 replies; 200+ results
From: Joyce Kong @ 2019-11-18 10:06 UTC (permalink / raw)
  To: dev
  Cc: nd, thomas, jerinj, stephen, mb, david.marchand,
	honnappa.nagarahalli, gavin.hu, ravi1.kumar, rmody, shshaikh,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang

There are a lot functions of bit operations scattered and
duplicated in PMDs, consolidating them into a common API
family is necessary. Furthermore, when the bit operation
is applied to the IO devices, use __ATOMIC_ACQ_REL to
ensure the ordering for io bit operation.

Signed-off-by: Joyce Kong <joyce.kong@arm.com>
Reviewed-by: Gavin Hu <gavin.hu@arm.com>
Reviewed-by: Phil Yang <phil.yang@arm.com>
---
 doc/api/doxy-api-index.md                  |   3 +-
 lib/librte_eal/common/Makefile             |   1 +
 lib/librte_eal/common/include/rte_bitops.h | 474 +++++++++++++++++++++
 lib/librte_eal/common/meson.build          |   1 +
 4 files changed, 478 insertions(+), 1 deletion(-)
 create mode 100644 lib/librte_eal/common/include/rte_bitops.h

diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index dff496be0..1aed266d3 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -181,4 +181,5 @@ The public API headers are grouped by topics:
   [common]             (@ref rte_common.h),
   [experimental APIs]  (@ref rte_compat.h),
   [ABI versioning]     (@ref rte_function_versioning.h),
-  [version]            (@ref rte_version.h)
+  [version]            (@ref rte_version.h),
+  [bitops]             (@ref rte_bitops.h)
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index c2c6d92cd..dd025c130 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -19,6 +19,7 @@ INC += rte_malloc.h rte_keepalive.h rte_time.h
 INC += rte_service.h rte_service_component.h
 INC += rte_bitmap.h rte_vfio.h rte_hypervisor.h rte_test.h
 INC += rte_reciprocal.h rte_fbarray.h rte_uuid.h
+INC += rte_bitops.h
 
 GENERIC_INC := rte_atomic.h rte_byteorder.h rte_cycles.h rte_prefetch.h
 GENERIC_INC += rte_memcpy.h rte_cpuflags.h
diff --git a/lib/librte_eal/common/include/rte_bitops.h b/lib/librte_eal/common/include/rte_bitops.h
new file mode 100644
index 000000000..16c0a23f7
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_bitops.h
@@ -0,0 +1,474 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2019 Arm Limited
+ */
+
+#ifndef _RTE_BITOPS_H_
+#define _RTE_BITOPS_H_
+
+/**
+ * @file
+ * Bit Operations
+ *
+ * This file defines a API for bit operations without/with memory ordering.
+ */
+
+#include <stdint.h>
+#include <assert.h>
+#include <rte_compat.h>
+
+/*---------------------------- 32 bit operations ----------------------------*/
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Get the target bit from a 32-bit value without memory ordering.
+ *
+ * @param nr
+ *   The target bit to get.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The target bit.
+ */
+__rte_experimental
+static inline uint32_t
+rte_get_bit32_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	return __atomic_load_n(addr, __ATOMIC_RELAXED) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Set the target bit in a 32-bit value to 1 without memory ordering.
+ *
+ * @param nr
+ *   The target bit to set.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_set_bit32_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	__atomic_fetch_or(addr, mask, __ATOMIC_RELAXED);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Clear the target bit in a 32-bit value to 0 without memory ordering.
+ *
+ * @param nr
+ *   The target bit to clear.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_clear_bit32_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	__atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 32-bit value, then set it to 1 without
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and set.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint32_t
+rte_test_and_set_bit32_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	return __atomic_fetch_or(addr, mask, __ATOMIC_RELAXED) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 32-bit value, then clear it to 0 without
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and clear.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint32_t
+rte_test_and_clear_bit32_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	return __atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Get the target bit from a 32-bit value with memory ordering.
+ *
+ * @param nr
+ *   The target bit to get.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The target bit.
+ */
+__rte_experimental
+static inline uint32_t
+rte_get_bit32(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	return __atomic_load_n(addr, __ATOMIC_ACQUIRE) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Set the target bit in a 32-bit value to 1 with memory ordering.
+ *
+ * @param nr
+ *   The target bit to set.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_set_bit32(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	__atomic_fetch_or(addr, mask, __ATOMIC_ACQ_REL);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Clear the target bit in a 32-bit value to 0 with memory ordering.
+ *
+ * @param nr
+ *   The target bit to clear.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_clear_bit32(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	__atomic_fetch_and(addr, ~mask, __ATOMIC_ACQ_REL);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 32-bit value, then set it to 1 with
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and set.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint32_t
+rte_test_and_set_bit32(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	return __atomic_fetch_or(addr, mask, __ATOMIC_ACQ_REL) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 32-bit value, then clear it to 0 with
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and clear.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint32_t
+rte_test_and_clear_bit32(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 32);
+
+	uint32_t mask = 1UL << nr;
+	return __atomic_fetch_and(addr, ~mask, __ATOMIC_ACQ_REL) & mask;
+}
+
+/*---------------------------- 64 bit operations ----------------------------*/
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Get the target bit from a 64-bit value without memory ordering.
+ *
+ * @param nr
+ *   The target bit to get.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The target bit.
+ */
+__rte_experimental
+static inline uint64_t
+rte_get_bit64_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	return __atomic_load_n(addr, __ATOMIC_RELAXED) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Set the target bit in a 64-bit value to 1 without memory ordering.
+ *
+ * @param nr
+ *   The target bit to set.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_set_bit64_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	__atomic_fetch_or(addr, mask, __ATOMIC_RELAXED);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Clear the target bit in a 64-bit value to 0 without memory ordering.
+ *
+ * @param nr
+ *   The target bit to clear.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_clear_bit64_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	__atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 64-bit value, then set it to 1 without
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and set.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint64_t
+rte_test_and_set_bit64_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	return __atomic_fetch_or(addr, mask, __ATOMIC_RELAXED) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 64-bit value, then clear it to 0 without
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and clear.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint64_t
+rte_test_and_clear_bit64_relaxed(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	return __atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Get the target bit from a 64-bit value with memory ordering.
+ *
+ * @param nr
+ *   The target bit to get.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The target bit.
+ */
+__rte_experimental
+static inline uint64_t
+rte_get_bit64(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	return __atomic_load_n(addr, __ATOMIC_ACQUIRE) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Set the target bit in a 64-bit value to 1 with memory ordering.
+ *
+ * @param nr
+ *   The target bit to set.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_set_bit64(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	__atomic_fetch_or(addr, mask, __ATOMIC_ACQ_REL);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Clear the target bit in a 64-bit value to 0 with memory ordering.
+ *
+ * @param nr
+ *   The target bit to clear.
+ * @param addr
+ *   The address holding the bit.
+ */
+__rte_experimental
+static inline void
+rte_clear_bit64(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	__atomic_fetch_and(addr, ~mask, __ATOMIC_ACQ_REL);
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 64-bit value, then set it to 1 with
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and set.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint64_t
+rte_test_and_set_bit64(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	return __atomic_fetch_or(addr, mask, __ATOMIC_ACQ_REL) & mask;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Return the original bit from a 64-bit value, then clear it to 0 with
+ * memory ordering.
+ *
+ * @param nr
+ *   The target bit to get and clear.
+ * @param addr
+ *   The address holding the bit.
+ * @return
+ *   The original bit.
+ */
+__rte_experimental
+static inline uint64_t
+rte_test_and_clear_bit64(unsigned int nr, unsigned long *addr)
+{
+	assert(nr < 64);
+
+	uint64_t mask = 1UL << nr;
+	return __atomic_fetch_and(addr, ~mask, __ATOMIC_ACQ_REL) & mask;
+}
+#endif /* _RTE_BITOPS_H_ */
diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build
index d6a149bec..e2f9c163c 100644
--- a/lib/librte_eal/common/meson.build
+++ b/lib/librte_eal/common/meson.build
@@ -52,6 +52,7 @@ common_headers = files(
 	'include/rte_alarm.h',
 	'include/rte_branch_prediction.h',
 	'include/rte_bus.h',
+	'include/rte_bitops.h',
 	'include/rte_bitmap.h',
 	'include/rte_class.h',
 	'include/rte_common.h',
-- 
2.17.1


^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure
@ 2019-11-18 10:02  3% Shahaf Shuler
  2019-11-18 16:12  0% ` Stephen Hemminger
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Shahaf Shuler @ 2019-11-18 10:02 UTC (permalink / raw)
  To: olivier.matz, Thomas Monjalon, dev

With the API and ABI freeze ahead, it will be good to reserve
some bits on the private structure for future use.

Otherwise we will potentially need to maintain two different
private structure during 2020 period.

There is already one use case for those reserved bits[1]

The reserved field should be set to 0 by the user.

[1]
https://patches.dpdk.org/patch/63077/

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---

Note - am aware no proper RFC was sent before the proposal
deadline of 19.11. However i hope this small change can be
accepeted for the sake of simpler maintainance in the future.

---
 lib/librte_mbuf/rte_mbuf.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 92d81972ab..6912594d57 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -303,6 +303,7 @@ rte_mbuf_to_priv(struct rte_mbuf *m)
 struct rte_pktmbuf_pool_private {
 	uint16_t mbuf_data_room_size; /**< Size of data space in each mbuf. */
 	uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf. */
+	uint32_t reserved; /**< reserved for future use. */
 };
 
 #ifdef RTE_LIBRTE_MBUF_DEBUG
-- 
2.12.0


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] net/ice: add flow mark hint support
  @ 2019-11-16  1:52  3%   ` Zhang, Qi Z
  0 siblings, 0 replies; 200+ results
From: Zhang, Qi Z @ 2019-11-16  1:52 UTC (permalink / raw)
  To: Stillwell Jr, Paul M, Ye, Xiaolong; +Cc: dev



> -----Original Message-----
> From: Stillwell Jr, Paul M <paul.m.stillwell.jr@intel.com>
> Sent: Saturday, November 16, 2019 12:37 AM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Ye, Xiaolong <xiaolong.ye@intel.com>
> Cc: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> Subject: RE: [dpdk-dev] [PATCH v2] net/ice: add flow mark hint support
> 
> 
> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Qi Zhang
> > Sent: Thursday, November 14, 2019 7:42 PM
> > To: Ye, Xiaolong <xiaolong.ye@intel.com>
> > Cc: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>
> > Subject: [dpdk-dev] [PATCH v2] net/ice: add flow mark hint support
> >
> > Since not all data paths support flow mark, the driver need a hint
> > from application to select the correct data path if flow mark is
> > required. The patch introduce a devarg "flow-mark-support" as a
> > workaround solution, since a standard way is still ongoing.
> >
> 
> I understand the need for this, but this seems problematic. Once a customer
> starts using this, then it has to be in the code forever because they are going to
> expect it to work forever. Maybe this should be marked with something that
> indicates it is temporary? Something like the experimental tagging that is done
> in other parts of the code?

Yes, since this is a workaround solution, claim it as an experimental looks like a good idea.
But I didn't see there is any documented standard way to claim a devarg as experimental.
Not sure if that should be part of the ABI policy or already some effort to standardize devargs is on the way.

Anyway as you can see, I have below statement in ice.rst to claim this is a workaround solution, 

	This hint should be removed when any of below condition ready.
	1) all data path support flow mark (currently vPMD does not)
	2) a new offload like RTE_DEV_RX_OFFLOAD_FLOW_MARK be introduced as a standard way to hint. 

And I can add words "This is experimental" to emphasized it.
 
Regards
Qi
> 
> > Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> > ---
> >
> > v2:
> > - fix typo
> >
> >  doc/guides/nics/ice.rst               | 10 ++++++++++
> >  drivers/net/ice/ice_ethdev.c          | 11 ++++++++++-
> >  drivers/net/ice/ice_ethdev.h          |  1 +
> >  drivers/net/ice/ice_rxtx_vec_common.h |  5 +++++
> >  4 files changed, 26 insertions(+), 1 deletion(-)
> >
> > diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst index
> > 1a426438d..f7016d338 100644
> > --- a/doc/guides/nics/ice.rst
> > +++ b/doc/guides/nics/ice.rst
> > @@ -80,6 +80,16 @@ Runtime Config Options
> >
> >      -w 80:00.0,pipeline-mode-support=1
> >
> > +- ``Flow Mark Support`` (default ``0``)
> > +
> > +  This is a hint to the driver to select the data path that support
> > + flow mark extraction  by default. This hint should be removed when
> > + any of
> > below condition ready.
> > +  1) all data path support flow mark (currently vPMD does not)
> > +  2) a new offload like RTE_DEV_RX_OFFLOAD_FLOW_MARK be introduced
> > as a standard way to hint.
> > +  Example::
> > +
> > +    -w 80:00.0,flow-mark-support=1
> > +
> >  - ``Protocol extraction for per queue``
> >
> >    Configure the RX queues to do protocol extraction into mbuf for
> > protocol diff --git a/drivers/net/ice/ice_ethdev.c
> > b/drivers/net/ice/ice_ethdev.c index abf00d404..9f2cb2f40 100644
> > --- a/drivers/net/ice/ice_ethdev.c
> > +++ b/drivers/net/ice/ice_ethdev.c
> > @@ -23,11 +23,13 @@
> >  /* devargs */
> >  #define ICE_SAFE_MODE_SUPPORT_ARG "safe-mode-support"
> >  #define ICE_PIPELINE_MODE_SUPPORT_ARG  "pipeline-mode-support"
> > +#define ICE_FLOW_MARK_SUPPORT_ARG"flow-mark-support"
> >  #define ICE_PROTO_XTR_ARG         "proto_xtr"
> >
> >  static const char * const ice_valid_args[] = {
> > ICE_SAFE_MODE_SUPPORT_ARG,  ICE_PIPELINE_MODE_SUPPORT_ARG,
> > +ICE_FLOW_MARK_SUPPORT_ARG,
> >  ICE_PROTO_XTR_ARG,
> >  NULL
> >  };
> > @@ -1987,6 +1989,12 @@ static int ice_parse_devargs(struct rte_eth_dev
> > *dev)
> >
> >  ret = rte_kvargs_process(kvlist,
> > ICE_PIPELINE_MODE_SUPPORT_ARG,
> >   &parse_bool, &ad-
> > >devargs.pipe_mode_support);
> > +if (ret)
> > +goto bail;
> > +
> > +ret = rte_kvargs_process(kvlist, ICE_FLOW_MARK_SUPPORT_ARG,
> > +&parse_bool, &ad-
> > >devargs.flow_mark_support);
> > +printf("flow_mark = %d\n", ad->devargs.flow_mark_support);
> >
> >  bail:
> >  rte_kvargs_free(kvlist);
> > @@ -4571,7 +4579,8 @@ RTE_PMD_REGISTER_KMOD_DEP(net_ice, "*
> igb_uio |
> > uio_pci_generic | vfio-pci"); RTE_PMD_REGISTER_PARAM_STRING(net_ice,
> >        ICE_PROTO_XTR_ARG
> > "=[queue:]<vlan|ipv4|ipv6|ipv6_flow|tcp>"
> >        ICE_SAFE_MODE_SUPPORT_ARG "=<0|1>"
> > -      ICE_PIPELINE_MODE_SUPPORT_ARG "=<0|1>");
> > +      ICE_PIPELINE_MODE_SUPPORT_ARG "=<0|1>"
> > +      ICE_FLOW_MARK_SUPPORT_ARG "=<0|1>");
> >
> >  RTE_INIT(ice_init_log)
> >  {
> > diff --git a/drivers/net/ice/ice_ethdev.h
> > b/drivers/net/ice/ice_ethdev.h index 4a0d37b32..4d35339a7 100644
> > --- a/drivers/net/ice/ice_ethdev.h
> > +++ b/drivers/net/ice/ice_ethdev.h
> > @@ -391,6 +391,7 @@ struct ice_devargs {  int safe_mode_support;
> > uint8_t proto_xtr_dflt;  int pipe_mode_support;
> > +int flow_mark_support;
> >  uint8_t proto_xtr[ICE_MAX_QUEUE_NUM];  };
> >
> > diff --git a/drivers/net/ice/ice_rxtx_vec_common.h
> > b/drivers/net/ice/ice_rxtx_vec_common.h
> > index 080ca4175..086428898 100644
> > --- a/drivers/net/ice/ice_rxtx_vec_common.h
> > +++ b/drivers/net/ice/ice_rxtx_vec_common.h
> > @@ -268,6 +268,11 @@ ice_rx_vec_dev_check_default(struct rte_eth_dev
> > *dev)  {
> >  int i;
> >  struct ice_rx_queue *rxq;
> > +struct ice_adapter *ad =
> > +ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
> > +
> > +if (ad->devargs.flow_mark_support)
> > +return -1;
> >
> >  for (i = 0; i < dev->data->nb_rx_queues; i++) {  rxq =
> > dev->data->rx_queues[i];
> > --
> > 2.13.6
> 


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] DPDK Release Status Meeting 14/11/2019
@ 2019-11-14 12:43  4% Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2019-11-14 12:43 UTC (permalink / raw)
  To: dpdk-dev; +Cc: Thomas Monjalon

Minutes 14 November 2019
------------------------

Agenda:
* Release Dates
* RC2 Status
* Subtrees
* OvS
* Opens

Participants:
* Arm
* Debian/Microsoft
* Intel
* NXP
* Red Hat


Release Dates
-------------

* v19.11 dates:
  * RC2 is released on Tuesday 12 November
    * https://mails.dpdk.org/archives/announce/2019-November/000288.html
  * RC3	pushed to *Wednesday 20 November*
    * Sub-trees should be ready on *Tuesday 19 November*
  * Release pushed to *Wednesday 27 November*

* Proposed dates for 20.02 :
  * Proposal/V1:		Friday 6 December 2019
  * Integration/Merge/RC1:	Wednesday 15 January 2020
  * Release:			Friday 14 February 2020
  * Should we move v1 a few days because of 19.11 release date changes?


RC2 Status
----------

* Intel validation not reported any critical issue, some defects submitted


Subtrees
--------

* main
  * ABI/API tooling, Thomas will deal with scripts
  * KNI iova=va patchset waiting for techboard approval

* next-net
  * No more ethdev features will be merged, only PMD & testpmd patches
  * Pulled from some sub-trees, there will be more
  * Backlog seems under control for the rc3

* next-net-crypto
  * Most of the patches have been merged to rc2, 4-5 patches in rc3
  * CPU crypto patches are deferred to next release, dummy APIs can be provided
    on this release since ABI breakage is not allowed in next release.
  * arm v8 crypto code planned to be in external library, its maintenance
    needs to be clarified

* next-net-eventdev
  * no update

* next-net-virtio
  * There is a regression that is under investigation
  * dynamic logging patch can be deferred to next version

* next-net-intel
  * ipn3ke PMD new version will be merged
  * Will get some more fixes

* LTS
  * Regression on CVE-2019-14818 fixes.
    * Affects when VHOST_USER_VRING_NOFD_MASK is set use cases,
      looks common enough to make new versions of the stable releases
    * More testing will be done before proceeding


OvS
---

* pdump support is broken and causing crash, heading to deprecate it in ovs-dpdk
* There are some build issues with 19.11-rc2, working on it


Opens
-----

* A regression found on the CVE-2019-14818, working on it:
  https://mails.dpdk.org/archives/announce/2019-November/000295.html


DPDK Release Status Meetings
============================

The DPDK Release Status Meeting is intended for DPDK Committers to discuss
the status of the master tree and sub-trees, and for project managers to
track progress or milestone dates.

The meeting occurs on Thursdays at 8:30 UTC. If you wish to attend just
send an email to "John McNamara <john.mcnamara@intel.com>" for the invite.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [RFC 0/4] cpu-crypto API choices
  @ 2019-11-14  5:46  3% ` Jerin Jacob
  2019-11-18 11:57  0%   ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2019-11-14  5:46 UTC (permalink / raw)
  To: Konstantin Ananyev
  Cc: dpdk-dev, techboard, roy.fan.zhang, declan.doherty, Akhil Goyal

On Wed, Nov 6, 2019 at 12:11 AM Konstantin Ananyev
<konstantin.ananyev@intel.com> wrote:
>
> Originally both SW and HW crypto PMDs use rte_crypot_op based API to
> process the crypto workload asynchronously. This way provides uniformity
> to both PMD types, but also introduce unnecessary performance penalty to
> SW PMDs that have to "simulate" HW async behavior
> (crypto-ops enqueue/dequeue, HW addresses computations,
> storing/dereferencing user provided data (mbuf) for each crypto-op,
> etc).
>
> The aim is to introduce a new optional API for SW crypto-devices
> to perform crypto processing in a synchronous manner.
> As summarized by Akhil, we need a synchronous API to perform crypto
> operations on raw data using SW PMDs, that provides:
>  - no crypto-ops.
>  - avoid using mbufs inside this API, use raw data buffers instead.
>  - no separate enqueue-dequeue, only single process() API for data path.
>  - input data buffers should be grouped by session,
>    i.e. each process() call takes one session and group of input buffers
>    that  belong to that session.
>  - All parameters that are constant accross session, should be stored
>    inside the session itself and reused by all incoming data buffers.
>
> While there seems no controversy about need of such functionality,
> there seems to be no agreement on what would be the best API for that.
> So I am requesting for TB input on that matter.
>
> Series structure:
> - patch #1 - intorduce basic data structures to be used by sync API
>   (no controversy here, I hope ..)
>   [RFC 1/4] cpu-crypto: Introduce basic data structures
> - patch #2 - Intel initial approach for new API (via rte_security)
>   [RFC 2/4] security: introduce cpu-crypto API
> - patch #3 - approach that reuses existing rte_cryptodev API as much as
>   possible
>   [RFC 3/4] cryptodev: introduce cpu-crypto API
> - patch #4 - approach via introducing new session data structure and API
>   [RFC 4/4] cryptodev: introduce rte_crypto_cpu_sym_session API
>
> Patches 2,3,4 are mutually exclusive,
> and we probably have to choose which one to go forward with.
> I put some explanations in each of the patches, hopefully that will help
> to  understand pros and cons of each one.
>
> Akhil strongly supports #3, AFAIK mainly because it allows PMDs to
> reuse existing API and minimize API level changes.
> My favorite is #4, #2 is less preferable but ok too.
> #3 seems problematic to me by the reasons I outlined in #4 patch
> description.
>
> Please provide your opinion.

I spend some time on the proposal and I agree that sync API is needed
and it makes sense to remove queue emulation and allocating/freeing
the crypto_ops
in case of sync API.

# I would prefer to not duplicate the session. If the newly added
fields are for optimization
then those can be applicable for HW too. For example, if we consider,
offset to be
constant for one session HW PMD will be able to leverage this. ref:
rte_crypto_aead_xfrom::cpu_crypto:offset

# I would prefer to not duplicate ops parameters, instead of the
existing rte_crypto_ops  can be updated.
I see that most members introduced in rte_crypto_sym_vec &
rte_crypto_vec are already existing in rte_crypto_op.

Also, since we are agreeing that the ops for SYNC API can be from
stack/one time allocated, the size shouldn't matter.

I understand that this would cause ABI breakage, but for this release,
we can work together and add some reserved fields
that we can implement later. I believe that's the reason why you want
to introduce new structures. I think that will bloat
the existing crypto lib.

If I understand it correctly, this will be used in conjunction with
IXGBE to handle fragmented IPsec traffic. If that's the fundamental
reasoning, then there is an alternate path possible. Currently, the
issue is, rte_security doesn't define the treatment for fragmented
packets. Maybe let's define it and then a similar CPU crypto
processing can be done inside the PMD. By creating an internal
function in S/W PMDs and calling it from the inline crypto enabled eth
PMDs, fragmentation support for inline crypto devices can
be achieved. This way the application would look clean. All the
fragmentation related configuration (no of fragmentation contexts
needed,
reassembly timeout etc) need to be added in rte_security library and
the result for that operation will come as dynamic fields in the mbuf.

Just my 2c.







>
> Konstantin Ananyev (4):
>   cpu-crypto: Introduce basic data structures
>   security: introduce cpu-crypto API
>   cryptodev: introduce cpu-crypto API
>   cryptodev: introduce rte_crypto_cpu_sym_session API
>
>  lib/librte_cryptodev/rte_crypto_sym.h     | 63 +++++++++++++++++++++--
>  lib/librte_cryptodev/rte_cryptodev.c      | 14 +++++
>  lib/librte_cryptodev/rte_cryptodev.h      | 24 +++++++++
>  lib/librte_cryptodev/rte_cryptodev_pmd.h  | 22 ++++++++
>  lib/librte_security/rte_security.c        | 11 ++++
>  lib/librte_security/rte_security.h        | 28 +++++++++-
>  lib/librte_security/rte_security_driver.h | 20 +++++++
>  7 files changed, 177 insertions(+), 5 deletions(-)
>
> --
> 2.17.1
>

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v7 0/1] fbarray: fix duplicated fbarray file in secondary
    @ 2019-11-13 21:43  3% ` yasufum.o
    2019-11-27  8:48  3%   ` [dpdk-dev] [PATCH v8 0/1] " Yasufumi Ogawa
  1 sibling, 2 replies; 200+ results
From: yasufum.o @ 2019-11-13 21:43 UTC (permalink / raw)
  To: anatoly.burakov, david.marchand, konstantin.ananyev
  Cc: dev, stable, yasufum.o

From: Yasufumi Ogawa <yasufum.o@gmail.com>

In secondary_msl_create_walk(), it creates a file for fbarrays with its
PID for reserving unique name among secondary processes. However, it
does not work if several secondaries run as app containers because each
of containerized secondary has PID 1, and failed to reserve unique name
other than first one. To reserve unique name in each of containers, use
hostname in addition to PID.

---
v2:
  * fix typo in commit message
v3:
  * add fclose() after if getting hostname with fscan() is failed
v4:
  * Increase the size of proc_id to 33 and add boundary in calling
    fscan()
v5:
  * revise title to reflect the issue
  * use gethostname() instead of getting from `etc/hostname`
  * use HOST_NAME_MAX for size of string for hostname
v6:
  * change to use hostname and pid to cover both of host and container
    cases
  * change RTE_FBARRAY_NAME_LEN to NAME_MAX to reserve enough size for
    filename
v7:
  * discard changing RTE_FBARRAY_NAME_LEN to NAME_MAX to avoid breaking
    ABI
  * introduce int fbarray_sec_name_len instead of RTE_FBARRAY_NAME_LEN
    to define long filename only for secondary process
  * replace the order of postfixes of pid and hostname
---

Yasufumi Ogawa (1):
  fbarray: fix duplicated fbarray file in secondary

 lib/librte_eal/linux/eal/eal_memalloc.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

-- 
2.17.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc/guides: clean repeated words
  2019-11-12 19:33  2% [dpdk-dev] [PATCH] doc/guides: clean repeated words David Marchand
@ 2019-11-13 10:47  0% ` Kevin Traynor
  0 siblings, 0 replies; 200+ results
From: Kevin Traynor @ 2019-11-13 10:47 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: John McNamara, Marko Kovacevic, Pablo de Lara, Qi Zhang,
	Xiao Wang, Nicolas Chautru, Anatoly Burakov, Jiayu Hu,
	Ferruh Yigit, Konstantin Ananyev, Adrien Mazarguil, Akhil Goyal,
	Declan Doherty, Ori Kam, Bruce Richardson, Radu Nicolau,
	Tomasz Kantecki, Sunil Kumar Kori, Pavan Nikhilesh, Xiaoyun Li,
	Jingjing Wu, Harry van Haaren, Wenzhuo Lu, Bernard Iremonger,
	Maryam Tahhan, Reshma Pattan

On 12/11/2019 19:33, David Marchand wrote:
> Shoot repeated words in all our guides.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Can add 'Cc: stable@dpdk.org' and whatever applies applies.

Acked-by: Kevin Traynor <ktraynor@redhat.com>

> ---
>  doc/guides/contributing/coding_style.rst                   | 8 ++++----
>  doc/guides/cryptodevs/zuc.rst                              | 2 +-
>  doc/guides/linux_gsg/nic_perf_intel_platform.rst           | 2 +-
>  doc/guides/nics/fm10k.rst                                  | 2 +-
>  doc/guides/prog_guide/bbdev.rst                            | 2 +-
>  doc/guides/prog_guide/cryptodev_lib.rst                    | 4 ++--
>  doc/guides/prog_guide/env_abstraction_layer.rst            | 2 +-
>  doc/guides/prog_guide/generic_segmentation_offload_lib.rst | 2 +-
>  doc/guides/prog_guide/kernel_nic_interface.rst             | 2 +-
>  doc/guides/prog_guide/packet_classif_access_ctrl.rst       | 4 ++--
>  doc/guides/prog_guide/rte_flow.rst                         | 2 +-
>  doc/guides/prog_guide/rte_security.rst                     | 4 ++--
>  doc/guides/rel_notes/release_17_11.rst                     | 2 +-
>  doc/guides/rel_notes/release_18_02.rst                     | 2 +-
>  doc/guides/rel_notes/release_19_02.rst                     | 4 ++--
>  doc/guides/rel_notes/release_19_11.rst                     | 2 +-
>  doc/guides/sample_app_ug/ethtool.rst                       | 2 +-
>  doc/guides/sample_app_ug/ipsec_secgw.rst                   | 2 +-
>  doc/guides/sample_app_ug/ntb.rst                           | 2 +-
>  doc/guides/sample_app_ug/performance_thread.rst            | 2 +-
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst                | 4 ++--
>  doc/guides/tools/proc_info.rst                             | 2 +-
>  22 files changed, 30 insertions(+), 30 deletions(-)
> 
> diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
> index e95a1a2..a6843de 100644
> --- a/doc/guides/contributing/coding_style.rst
> +++ b/doc/guides/contributing/coding_style.rst
> @@ -631,10 +631,10 @@ In the DPDK environment, use the logging interface provided:
>  
>   /* log in debug level */
>   rte_log_set_global_level(RTE_LOG_DEBUG);
> - RTE_LOG(DEBUG, my_logtype1, "this is is a debug level message\n");
> - RTE_LOG(INFO, my_logtype1, "this is is a info level message\n");
> - RTE_LOG(WARNING, my_logtype1, "this is is a warning level message\n");
> - RTE_LOG(WARNING, my_logtype2, "this is is a debug level message (not displayed)\n");
> + RTE_LOG(DEBUG, my_logtype1, "this is a debug level message\n");
> + RTE_LOG(INFO, my_logtype1, "this is a info level message\n");
> + RTE_LOG(WARNING, my_logtype1, "this is a warning level message\n");
> + RTE_LOG(WARNING, my_logtype2, "this is a debug level message (not displayed)\n");
>  
>   /* log in info level */
>   rte_log_set_global_level(RTE_LOG_INFO);
> diff --git a/doc/guides/cryptodevs/zuc.rst b/doc/guides/cryptodevs/zuc.rst
> index 69a5218..002e986 100644
> --- a/doc/guides/cryptodevs/zuc.rst
> +++ b/doc/guides/cryptodevs/zuc.rst
> @@ -28,7 +28,7 @@ Limitations
>  * ZUC (EIA3) supported only if hash offset field is byte-aligned.
>  * ZUC (EEA3) supported only if cipher length, cipher offset fields are byte-aligned.
>  * ZUC PMD cannot be built as a shared library, due to limitations in
> -  in the underlying library.
> +  the underlying library.
>  
>  
>  Installation
> diff --git a/doc/guides/linux_gsg/nic_perf_intel_platform.rst b/doc/guides/linux_gsg/nic_perf_intel_platform.rst
> index 0c25ec0..c554c21 100644
> --- a/doc/guides/linux_gsg/nic_perf_intel_platform.rst
> +++ b/doc/guides/linux_gsg/nic_perf_intel_platform.rst
> @@ -150,7 +150,7 @@ Configurations before running DPDK
>        # Mount to the specific folder.
>        mount -t hugetlbfs nodev /mnt/huge
>  
> -2. Check the CPU layout using using the DPDK ``cpu_layout`` utility:
> +2. Check the CPU layout using the DPDK ``cpu_layout`` utility:
>  
>     .. code-block:: console
>  
> diff --git a/doc/guides/nics/fm10k.rst b/doc/guides/nics/fm10k.rst
> index 20a1cde..4e178c2 100644
> --- a/doc/guides/nics/fm10k.rst
> +++ b/doc/guides/nics/fm10k.rst
> @@ -119,7 +119,7 @@ Switch manager
>  
>  The Intel FM10000 family of NICs integrate a hardware switch and multiple host
>  interfaces. The FM10000 PMD driver only manages host interfaces. For the
> -switch component another switch driver has to be loaded prior to to the
> +switch component another switch driver has to be loaded prior to the
>  FM10000 PMD driver. The switch driver can be acquired from Intel support.
>  Only Testpoint is validated with DPDK, the latest version that has been
>  validated with DPDK is 4.1.6.
> diff --git a/doc/guides/prog_guide/bbdev.rst b/doc/guides/prog_guide/bbdev.rst
> index d491849..d39167a 100644
> --- a/doc/guides/prog_guide/bbdev.rst
> +++ b/doc/guides/prog_guide/bbdev.rst
> @@ -1069,7 +1069,7 @@ The mbuf ``length`` is inclusive of CRC24A/B where present and is equal
>  the code block size ``K``.
>  
>  The first CB Virtual Circular Buffer (VCB) index is given by ``r`` but the
> -the number of the remaining CB VCBs is calculated automatically by BBDEV
> +number of the remaining CB VCBs is calculated automatically by BBDEV
>  and passed down to the driver.
>  
>  The number of remaining CB VCBs should not be confused with ``c``, the
> diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst
> index bf0ee79..ac16437 100644
> --- a/doc/guides/prog_guide/cryptodev_lib.rst
> +++ b/doc/guides/prog_guide/cryptodev_lib.rst
> @@ -498,7 +498,7 @@ to specify the details of the Crypto operation. For chaining of symmetric
>  operations such as cipher encrypt and authentication generate, the next pointer
>  allows transform to be chained together. Crypto devices which support chaining
>  must publish the chaining of symmetric Crypto operations feature flag. Allocation of the
> -xform structure is in the the application domain. To allow future API extensions in a
> +xform structure is in the application domain. To allow future API extensions in a
>  backwardly compatible manner, e.g. addition of a new parameter, the application should
>  zero the full xform struct before populating it.
>  
> @@ -893,7 +893,7 @@ Asymmetric Crypto transforms (``rte_crypto_asym_xform``) are the mechanism used
>  to specify the details of the asymmetric Crypto operation. Next pointer within
>  xform allows transform to be chained together. Also it is important to note that
>  the order in which the transforms are passed indicates the order of the chaining. Allocation
> -of the xform structure is in the the application domain. To allow future API extensions in a
> +of the xform structure is in the application domain. To allow future API extensions in a
>  backwardly compatible manner, e.g. addition of a new parameter, the application should
>  zero the full xform struct before populating it.
>  
> diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
> index 6e59fae..cd8e300 100644
> --- a/doc/guides/prog_guide/env_abstraction_layer.rst
> +++ b/doc/guides/prog_guide/env_abstraction_layer.rst
> @@ -249,7 +249,7 @@ manual memory management.
>  
>  + Using heap API's for externally allocated memory
>  
> -Using using a set of malloc heap API's is the recommended way to use externally
> +Using a set of malloc heap API's is the recommended way to use externally
>  allocated memory in DPDK. In this way, support for externally allocated memory
>  is implemented through overloading the socket ID - externally allocated heaps
>  will have socket ID's that would be considered invalid under normal
> diff --git a/doc/guides/prog_guide/generic_segmentation_offload_lib.rst b/doc/guides/prog_guide/generic_segmentation_offload_lib.rst
> index 0cfc119..73e7687 100644
> --- a/doc/guides/prog_guide/generic_segmentation_offload_lib.rst
> +++ b/doc/guides/prog_guide/generic_segmentation_offload_lib.rst
> @@ -206,7 +206,7 @@ To segment an outgoing packet, an application must:
>  2. Set the appropriate ol_flags in the mbuf.
>  
>     - The GSO library use the value of an mbuf's ``ol_flags`` attribute to
> -     to determine how a packet should be segmented. It is the application's
> +     determine how a packet should be segmented. It is the application's
>       responsibility to ensure that these flags are set.
>  
>     - For example, in order to segment TCP/IPv4 packets, the application should
> diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst
> index 2fd58e1..e12634d 100644
> --- a/doc/guides/prog_guide/kernel_nic_interface.rst
> +++ b/doc/guides/prog_guide/kernel_nic_interface.rst
> @@ -254,7 +254,7 @@ to create a separate thread or secondary process to periodically call
>  
>  The KNI interfaces can be deleted by a DPDK application with
>  ``rte_kni_release()``.  All KNI interfaces not explicitly deleted will be
> -deleted when the the ``/dev/kni`` device is closed, either explicitly with
> +deleted when the ``/dev/kni`` device is closed, either explicitly with
>  ``rte_kni_close()`` or when the DPDK application is closed.
>  
>  DPDK mbuf Flow
> diff --git a/doc/guides/prog_guide/packet_classif_access_ctrl.rst b/doc/guides/prog_guide/packet_classif_access_ctrl.rst
> index c16b11a..2945eac 100644
> --- a/doc/guides/prog_guide/packet_classif_access_ctrl.rst
> +++ b/doc/guides/prog_guide/packet_classif_access_ctrl.rst
> @@ -154,7 +154,7 @@ To define classification for the IPv6 2-tuple: <protocol, IPv6 source address> o
>  
>  .. code-block:: c
>  
> -    struct struct rte_ipv6_hdr {
> +    struct rte_ipv6_hdr {
>          uint32_t vtc_flow;     /* IP version, traffic class & flow label. */
>          uint16_t payload_len;  /* IP packet length - includes sizeof(ip_header). */
>          uint8_t proto;         /* Protocol, next header. */
> @@ -167,7 +167,7 @@ The following array of field definitions can be used:
>  
>  .. code-block:: c
>  
> -    struct struct rte_acl_field_def ipv6_2tuple_defs[5] = {
> +    struct rte_acl_field_def ipv6_2tuple_defs[5] = {
>          {
>              .type = RTE_ACL_FIELD_TYPE_BITMASK,
>              .size = sizeof (uint8_t),
> diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
> index ac0020e..a254c81 100644
> --- a/doc/guides/prog_guide/rte_flow.rst
> +++ b/doc/guides/prog_guide/rte_flow.rst
> @@ -1650,7 +1650,7 @@ Counters can be retrieved and reset through ``rte_flow_query()``, see
>  The shared flag indicates whether the counter is unique to the flow rule the
>  action is specified with, or whether it is a shared counter.
>  
> -For a count action with the shared flag set, then then a global device
> +For a count action with the shared flag set, then a global device
>  namespace is assumed for the counter id, so that any matched flow rules using
>  a count action with the same counter id on the same port will contribute to
>  that counter.
> diff --git a/doc/guides/prog_guide/rte_security.rst b/doc/guides/prog_guide/rte_security.rst
> index 7d0734a..f77fb89 100644
> --- a/doc/guides/prog_guide/rte_security.rst
> +++ b/doc/guides/prog_guide/rte_security.rst
> @@ -51,7 +51,7 @@ however all security protocol related headers are still attached to the
>  packet. e.g. In case of IPsec, the IPsec tunnel headers (if any),
>  ESP/AH headers will remain in the packet but the received packet
>  contains the decrypted data where the encrypted data was when the packet
> -arrived. The driver Rx path check the descriptors and and based on the
> +arrived. The driver Rx path check the descriptors and based on the
>  crypto status sets additional flags in the rte_mbuf.ol_flags field.
>  
>  .. note::
> @@ -65,7 +65,7 @@ Egress Data path - The software prepares the egress packet by adding
>  relevant security protocol headers. Only the data will not be
>  encrypted by the software. The driver will accordingly configure the
>  tx descriptors. The hardware device will encrypt the data before sending the
> -the packet out.
> +packet out.
>  
>  .. note::
>  
> diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
> index 6448b6c..1f3b45e 100644
> --- a/doc/guides/rel_notes/release_17_11.rst
> +++ b/doc/guides/rel_notes/release_17_11.rst
> @@ -475,7 +475,7 @@ API Changes
>  * **Added mbuf flags PKT_RX_VLAN and PKT_RX_QINQ.**
>  
>    Two ``mbuf`` flags have been added to indicate that the VLAN
> -  identifier has been saved in in the ``mbuf`` structure. For instance:
> +  identifier has been saved in the ``mbuf`` structure. For instance:
>  
>    - If VLAN is not stripped and TCI is saved: ``PKT_RX_VLAN``
>    - If VLAN is stripped and TCI is saved: ``PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED``
> diff --git a/doc/guides/rel_notes/release_18_02.rst b/doc/guides/rel_notes/release_18_02.rst
> index 8e40311..3523ea7 100644
> --- a/doc/guides/rel_notes/release_18_02.rst
> +++ b/doc/guides/rel_notes/release_18_02.rst
> @@ -210,7 +210,7 @@ New Features
>    A set of northbound APIs have been defined which encompass a generic set of
>    operations by allowing applications to interact with device using opaque
>    structures/buffers. Also, southbound APIs provide a means of integrating devices
> -  either as as part of a physical bus (PCI, FSLMC etc) or through ``vdev``.
> +  either as part of a physical bus (PCI, FSLMC etc) or through ``vdev``.
>  
>    See the :doc:`../prog_guide/rawdev` programmer's guide for more details.
>  
> diff --git a/doc/guides/rel_notes/release_19_02.rst b/doc/guides/rel_notes/release_19_02.rst
> index b353620..ace1534 100644
> --- a/doc/guides/rel_notes/release_19_02.rst
> +++ b/doc/guides/rel_notes/release_19_02.rst
> @@ -265,11 +265,11 @@ ABI Changes
>  * mbuf: The format of the sched field of ``rte_mbuf`` has been changed
>    to include the following fields: ``queue ID``, ``traffic class``, ``color``.
>  
> -* cryptodev: as shown in the the 18.11 deprecation notice, the structure
> +* cryptodev: as shown in the 18.11 deprecation notice, the structure
>    ``rte_cryptodev_qp_conf`` has added two parameters for symmetric session
>    mempool and symmetric session private data mempool.
>  
> -* cryptodev: as shown in the the 18.11 deprecation notice, the structure
> +* cryptodev: as shown in the 18.11 deprecation notice, the structure
>    ``rte_cryptodev_sym_session`` has been updated to contain more information
>    to ensure safely accessing the session and session private data.
>  
> diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
> index 682c1bd..c0045a9 100644
> --- a/doc/guides/rel_notes/release_19_11.rst
> +++ b/doc/guides/rel_notes/release_19_11.rst
> @@ -97,7 +97,7 @@ New Features
>  * **Added ethdev API to set supported packet types**
>  
>    * Added new API ``rte_eth_dev_set_ptypes`` that allows an application to
> -    inform PMD about about reduced range of packet types to handle.
> +    inform PMD about reduced range of packet types to handle.
>    * This scheme will allow PMDs to avoid lookup to internal ptype table on Rx
>      and thereby improve Rx performance if application wishes do so.
>  
> diff --git a/doc/guides/sample_app_ug/ethtool.rst b/doc/guides/sample_app_ug/ethtool.rst
> index 47e09f6..8f7fc6c 100644
> --- a/doc/guides/sample_app_ug/ethtool.rst
> +++ b/doc/guides/sample_app_ug/ethtool.rst
> @@ -40,7 +40,7 @@ The application is console-driven using the cmdline DPDK interface:
>          EthApp>
>  
>  From this interface the available commands and descriptions of what
> -they do as as follows:
> +they do as follows:
>  
>  * ``drvinfo``: Print driver info
>  * ``eeprom``: Dump EEPROM to file
> diff --git a/doc/guides/sample_app_ug/ipsec_secgw.rst b/doc/guides/sample_app_ug/ipsec_secgw.rst
> index ae8cce2..d6d8d44 100644
> --- a/doc/guides/sample_app_ug/ipsec_secgw.rst
> +++ b/doc/guides/sample_app_ug/ipsec_secgw.rst
> @@ -158,7 +158,7 @@ Where:
>      If packet is not reassembled within this time, received fragments
>      will be discarded. Fragment lifetime should be decreased when
>      there is a high fragmented traffic loss in high bandwidth networks.
> -    Should be lower for for low number of reassembly buckets.
> +    Should be lower for low number of reassembly buckets.
>      Valid values: from 1 ns to 10 s. Default value: 10000000 (10 s).
>  
>  *   ``--reassemble NUM``: max number of entries in reassemble fragment table.
> diff --git a/doc/guides/sample_app_ug/ntb.rst b/doc/guides/sample_app_ug/ntb.rst
> index df16af8..93fb752 100644
> --- a/doc/guides/sample_app_ug/ntb.rst
> +++ b/doc/guides/sample_app_ug/ntb.rst
> @@ -82,7 +82,7 @@ The application is console-driven using the cmdline DPDK interface:
>          ntb>
>  
>  From this interface the available commands and descriptions of what
> -they do as as follows:
> +they do as follows:
>  
>  * ``send [filepath]``: Send file to the peer host. Need to be in
>    file-trans forwarding mode first.
> diff --git a/doc/guides/sample_app_ug/performance_thread.rst b/doc/guides/sample_app_ug/performance_thread.rst
> index ac6ee8a..5fed464 100644
> --- a/doc/guides/sample_app_ug/performance_thread.rst
> +++ b/doc/guides/sample_app_ug/performance_thread.rst
> @@ -280,7 +280,7 @@ functionality into different threads, and the pairs of RX and TX threads are
>  interconnected via software rings.
>  
>  On initialization an L-thread scheduler is started on every EAL thread. On all
> -but the master EAL thread only a a dummy L-thread is initially started.
> +but the master EAL thread only a dummy L-thread is initially started.
>  The L-thread started on the master EAL thread then spawns other L-threads on
>  different L-thread schedulers according the command line parameters.
>  
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index 48473d8..6779822 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -33,7 +33,7 @@ If you type a partial command and hit ``<TAB>`` you get a list of the available
>  
>  .. note::
>  
> -   Some examples in this document are too long to fit on one line are are shown wrapped at `"\\"` for display purposes::
> +   Some examples in this document are too long to fit on one line are shown wrapped at `"\\"` for display purposes::
>  
>        testpmd> set flow_ctrl rx (on|off) tx (on|off) (high_water) (low_water) \
>                 (pause_time) (send_xon) (port_id)
> @@ -2760,7 +2760,7 @@ Traffic Management
>  ------------------
>  
>  The following section shows functions for configuring traffic management on
> -on the ethernet device through the use of generic TM API.
> +the ethernet device through the use of generic TM API.
>  
>  show port traffic management capability
>  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst
> index 2ea1b59..0390b9c 100644
> --- a/doc/guides/tools/proc_info.rst
> +++ b/doc/guides/tools/proc_info.rst
> @@ -63,7 +63,7 @@ ring. For invalid or no ring name, whole list is dump.
>  **--show-mempool[=name]**
>  The show-mempool parameter display current allocation of all mempool
>  debug information. Specifying the name allows to display details for specific
> -specific mempool. For invalid or no mempool name, whole list is dump.
> +mempool. For invalid or no mempool name, whole list is dump.
>  
>  **--iter-mempool=name**
>  The iter-mempool parameter iterates and displays mempool elements specified
> 


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] doc/guides: clean repeated words
@ 2019-11-12 19:33  2% David Marchand
  2019-11-13 10:47  0% ` Kevin Traynor
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-12 19:33 UTC (permalink / raw)
  To: dev
  Cc: John McNamara, Marko Kovacevic, Pablo de Lara, Qi Zhang,
	Xiao Wang, Nicolas Chautru, Anatoly Burakov, Jiayu Hu,
	Ferruh Yigit, Konstantin Ananyev, Adrien Mazarguil, Akhil Goyal,
	Declan Doherty, Ori Kam, Bruce Richardson, Radu Nicolau,
	Tomasz Kantecki, Sunil Kumar Kori, Pavan Nikhilesh, Xiaoyun Li,
	Jingjing Wu, Harry van Haaren, Wenzhuo Lu, Bernard Iremonger,
	Maryam Tahhan, Reshma Pattan

Shoot repeated words in all our guides.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 doc/guides/contributing/coding_style.rst                   | 8 ++++----
 doc/guides/cryptodevs/zuc.rst                              | 2 +-
 doc/guides/linux_gsg/nic_perf_intel_platform.rst           | 2 +-
 doc/guides/nics/fm10k.rst                                  | 2 +-
 doc/guides/prog_guide/bbdev.rst                            | 2 +-
 doc/guides/prog_guide/cryptodev_lib.rst                    | 4 ++--
 doc/guides/prog_guide/env_abstraction_layer.rst            | 2 +-
 doc/guides/prog_guide/generic_segmentation_offload_lib.rst | 2 +-
 doc/guides/prog_guide/kernel_nic_interface.rst             | 2 +-
 doc/guides/prog_guide/packet_classif_access_ctrl.rst       | 4 ++--
 doc/guides/prog_guide/rte_flow.rst                         | 2 +-
 doc/guides/prog_guide/rte_security.rst                     | 4 ++--
 doc/guides/rel_notes/release_17_11.rst                     | 2 +-
 doc/guides/rel_notes/release_18_02.rst                     | 2 +-
 doc/guides/rel_notes/release_19_02.rst                     | 4 ++--
 doc/guides/rel_notes/release_19_11.rst                     | 2 +-
 doc/guides/sample_app_ug/ethtool.rst                       | 2 +-
 doc/guides/sample_app_ug/ipsec_secgw.rst                   | 2 +-
 doc/guides/sample_app_ug/ntb.rst                           | 2 +-
 doc/guides/sample_app_ug/performance_thread.rst            | 2 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst                | 4 ++--
 doc/guides/tools/proc_info.rst                             | 2 +-
 22 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index e95a1a2..a6843de 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -631,10 +631,10 @@ In the DPDK environment, use the logging interface provided:
 
  /* log in debug level */
  rte_log_set_global_level(RTE_LOG_DEBUG);
- RTE_LOG(DEBUG, my_logtype1, "this is is a debug level message\n");
- RTE_LOG(INFO, my_logtype1, "this is is a info level message\n");
- RTE_LOG(WARNING, my_logtype1, "this is is a warning level message\n");
- RTE_LOG(WARNING, my_logtype2, "this is is a debug level message (not displayed)\n");
+ RTE_LOG(DEBUG, my_logtype1, "this is a debug level message\n");
+ RTE_LOG(INFO, my_logtype1, "this is a info level message\n");
+ RTE_LOG(WARNING, my_logtype1, "this is a warning level message\n");
+ RTE_LOG(WARNING, my_logtype2, "this is a debug level message (not displayed)\n");
 
  /* log in info level */
  rte_log_set_global_level(RTE_LOG_INFO);
diff --git a/doc/guides/cryptodevs/zuc.rst b/doc/guides/cryptodevs/zuc.rst
index 69a5218..002e986 100644
--- a/doc/guides/cryptodevs/zuc.rst
+++ b/doc/guides/cryptodevs/zuc.rst
@@ -28,7 +28,7 @@ Limitations
 * ZUC (EIA3) supported only if hash offset field is byte-aligned.
 * ZUC (EEA3) supported only if cipher length, cipher offset fields are byte-aligned.
 * ZUC PMD cannot be built as a shared library, due to limitations in
-  in the underlying library.
+  the underlying library.
 
 
 Installation
diff --git a/doc/guides/linux_gsg/nic_perf_intel_platform.rst b/doc/guides/linux_gsg/nic_perf_intel_platform.rst
index 0c25ec0..c554c21 100644
--- a/doc/guides/linux_gsg/nic_perf_intel_platform.rst
+++ b/doc/guides/linux_gsg/nic_perf_intel_platform.rst
@@ -150,7 +150,7 @@ Configurations before running DPDK
       # Mount to the specific folder.
       mount -t hugetlbfs nodev /mnt/huge
 
-2. Check the CPU layout using using the DPDK ``cpu_layout`` utility:
+2. Check the CPU layout using the DPDK ``cpu_layout`` utility:
 
    .. code-block:: console
 
diff --git a/doc/guides/nics/fm10k.rst b/doc/guides/nics/fm10k.rst
index 20a1cde..4e178c2 100644
--- a/doc/guides/nics/fm10k.rst
+++ b/doc/guides/nics/fm10k.rst
@@ -119,7 +119,7 @@ Switch manager
 
 The Intel FM10000 family of NICs integrate a hardware switch and multiple host
 interfaces. The FM10000 PMD driver only manages host interfaces. For the
-switch component another switch driver has to be loaded prior to to the
+switch component another switch driver has to be loaded prior to the
 FM10000 PMD driver. The switch driver can be acquired from Intel support.
 Only Testpoint is validated with DPDK, the latest version that has been
 validated with DPDK is 4.1.6.
diff --git a/doc/guides/prog_guide/bbdev.rst b/doc/guides/prog_guide/bbdev.rst
index d491849..d39167a 100644
--- a/doc/guides/prog_guide/bbdev.rst
+++ b/doc/guides/prog_guide/bbdev.rst
@@ -1069,7 +1069,7 @@ The mbuf ``length`` is inclusive of CRC24A/B where present and is equal
 the code block size ``K``.
 
 The first CB Virtual Circular Buffer (VCB) index is given by ``r`` but the
-the number of the remaining CB VCBs is calculated automatically by BBDEV
+number of the remaining CB VCBs is calculated automatically by BBDEV
 and passed down to the driver.
 
 The number of remaining CB VCBs should not be confused with ``c``, the
diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst
index bf0ee79..ac16437 100644
--- a/doc/guides/prog_guide/cryptodev_lib.rst
+++ b/doc/guides/prog_guide/cryptodev_lib.rst
@@ -498,7 +498,7 @@ to specify the details of the Crypto operation. For chaining of symmetric
 operations such as cipher encrypt and authentication generate, the next pointer
 allows transform to be chained together. Crypto devices which support chaining
 must publish the chaining of symmetric Crypto operations feature flag. Allocation of the
-xform structure is in the the application domain. To allow future API extensions in a
+xform structure is in the application domain. To allow future API extensions in a
 backwardly compatible manner, e.g. addition of a new parameter, the application should
 zero the full xform struct before populating it.
 
@@ -893,7 +893,7 @@ Asymmetric Crypto transforms (``rte_crypto_asym_xform``) are the mechanism used
 to specify the details of the asymmetric Crypto operation. Next pointer within
 xform allows transform to be chained together. Also it is important to note that
 the order in which the transforms are passed indicates the order of the chaining. Allocation
-of the xform structure is in the the application domain. To allow future API extensions in a
+of the xform structure is in the application domain. To allow future API extensions in a
 backwardly compatible manner, e.g. addition of a new parameter, the application should
 zero the full xform struct before populating it.
 
diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index 6e59fae..cd8e300 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -249,7 +249,7 @@ manual memory management.
 
 + Using heap API's for externally allocated memory
 
-Using using a set of malloc heap API's is the recommended way to use externally
+Using a set of malloc heap API's is the recommended way to use externally
 allocated memory in DPDK. In this way, support for externally allocated memory
 is implemented through overloading the socket ID - externally allocated heaps
 will have socket ID's that would be considered invalid under normal
diff --git a/doc/guides/prog_guide/generic_segmentation_offload_lib.rst b/doc/guides/prog_guide/generic_segmentation_offload_lib.rst
index 0cfc119..73e7687 100644
--- a/doc/guides/prog_guide/generic_segmentation_offload_lib.rst
+++ b/doc/guides/prog_guide/generic_segmentation_offload_lib.rst
@@ -206,7 +206,7 @@ To segment an outgoing packet, an application must:
 2. Set the appropriate ol_flags in the mbuf.
 
    - The GSO library use the value of an mbuf's ``ol_flags`` attribute to
-     to determine how a packet should be segmented. It is the application's
+     determine how a packet should be segmented. It is the application's
      responsibility to ensure that these flags are set.
 
    - For example, in order to segment TCP/IPv4 packets, the application should
diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst
index 2fd58e1..e12634d 100644
--- a/doc/guides/prog_guide/kernel_nic_interface.rst
+++ b/doc/guides/prog_guide/kernel_nic_interface.rst
@@ -254,7 +254,7 @@ to create a separate thread or secondary process to periodically call
 
 The KNI interfaces can be deleted by a DPDK application with
 ``rte_kni_release()``.  All KNI interfaces not explicitly deleted will be
-deleted when the the ``/dev/kni`` device is closed, either explicitly with
+deleted when the ``/dev/kni`` device is closed, either explicitly with
 ``rte_kni_close()`` or when the DPDK application is closed.
 
 DPDK mbuf Flow
diff --git a/doc/guides/prog_guide/packet_classif_access_ctrl.rst b/doc/guides/prog_guide/packet_classif_access_ctrl.rst
index c16b11a..2945eac 100644
--- a/doc/guides/prog_guide/packet_classif_access_ctrl.rst
+++ b/doc/guides/prog_guide/packet_classif_access_ctrl.rst
@@ -154,7 +154,7 @@ To define classification for the IPv6 2-tuple: <protocol, IPv6 source address> o
 
 .. code-block:: c
 
-    struct struct rte_ipv6_hdr {
+    struct rte_ipv6_hdr {
         uint32_t vtc_flow;     /* IP version, traffic class & flow label. */
         uint16_t payload_len;  /* IP packet length - includes sizeof(ip_header). */
         uint8_t proto;         /* Protocol, next header. */
@@ -167,7 +167,7 @@ The following array of field definitions can be used:
 
 .. code-block:: c
 
-    struct struct rte_acl_field_def ipv6_2tuple_defs[5] = {
+    struct rte_acl_field_def ipv6_2tuple_defs[5] = {
         {
             .type = RTE_ACL_FIELD_TYPE_BITMASK,
             .size = sizeof (uint8_t),
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index ac0020e..a254c81 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1650,7 +1650,7 @@ Counters can be retrieved and reset through ``rte_flow_query()``, see
 The shared flag indicates whether the counter is unique to the flow rule the
 action is specified with, or whether it is a shared counter.
 
-For a count action with the shared flag set, then then a global device
+For a count action with the shared flag set, then a global device
 namespace is assumed for the counter id, so that any matched flow rules using
 a count action with the same counter id on the same port will contribute to
 that counter.
diff --git a/doc/guides/prog_guide/rte_security.rst b/doc/guides/prog_guide/rte_security.rst
index 7d0734a..f77fb89 100644
--- a/doc/guides/prog_guide/rte_security.rst
+++ b/doc/guides/prog_guide/rte_security.rst
@@ -51,7 +51,7 @@ however all security protocol related headers are still attached to the
 packet. e.g. In case of IPsec, the IPsec tunnel headers (if any),
 ESP/AH headers will remain in the packet but the received packet
 contains the decrypted data where the encrypted data was when the packet
-arrived. The driver Rx path check the descriptors and and based on the
+arrived. The driver Rx path check the descriptors and based on the
 crypto status sets additional flags in the rte_mbuf.ol_flags field.
 
 .. note::
@@ -65,7 +65,7 @@ Egress Data path - The software prepares the egress packet by adding
 relevant security protocol headers. Only the data will not be
 encrypted by the software. The driver will accordingly configure the
 tx descriptors. The hardware device will encrypt the data before sending the
-the packet out.
+packet out.
 
 .. note::
 
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 6448b6c..1f3b45e 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -475,7 +475,7 @@ API Changes
 * **Added mbuf flags PKT_RX_VLAN and PKT_RX_QINQ.**
 
   Two ``mbuf`` flags have been added to indicate that the VLAN
-  identifier has been saved in in the ``mbuf`` structure. For instance:
+  identifier has been saved in the ``mbuf`` structure. For instance:
 
   - If VLAN is not stripped and TCI is saved: ``PKT_RX_VLAN``
   - If VLAN is stripped and TCI is saved: ``PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED``
diff --git a/doc/guides/rel_notes/release_18_02.rst b/doc/guides/rel_notes/release_18_02.rst
index 8e40311..3523ea7 100644
--- a/doc/guides/rel_notes/release_18_02.rst
+++ b/doc/guides/rel_notes/release_18_02.rst
@@ -210,7 +210,7 @@ New Features
   A set of northbound APIs have been defined which encompass a generic set of
   operations by allowing applications to interact with device using opaque
   structures/buffers. Also, southbound APIs provide a means of integrating devices
-  either as as part of a physical bus (PCI, FSLMC etc) or through ``vdev``.
+  either as part of a physical bus (PCI, FSLMC etc) or through ``vdev``.
 
   See the :doc:`../prog_guide/rawdev` programmer's guide for more details.
 
diff --git a/doc/guides/rel_notes/release_19_02.rst b/doc/guides/rel_notes/release_19_02.rst
index b353620..ace1534 100644
--- a/doc/guides/rel_notes/release_19_02.rst
+++ b/doc/guides/rel_notes/release_19_02.rst
@@ -265,11 +265,11 @@ ABI Changes
 * mbuf: The format of the sched field of ``rte_mbuf`` has been changed
   to include the following fields: ``queue ID``, ``traffic class``, ``color``.
 
-* cryptodev: as shown in the the 18.11 deprecation notice, the structure
+* cryptodev: as shown in the 18.11 deprecation notice, the structure
   ``rte_cryptodev_qp_conf`` has added two parameters for symmetric session
   mempool and symmetric session private data mempool.
 
-* cryptodev: as shown in the the 18.11 deprecation notice, the structure
+* cryptodev: as shown in the 18.11 deprecation notice, the structure
   ``rte_cryptodev_sym_session`` has been updated to contain more information
   to ensure safely accessing the session and session private data.
 
diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index 682c1bd..c0045a9 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -97,7 +97,7 @@ New Features
 * **Added ethdev API to set supported packet types**
 
   * Added new API ``rte_eth_dev_set_ptypes`` that allows an application to
-    inform PMD about about reduced range of packet types to handle.
+    inform PMD about reduced range of packet types to handle.
   * This scheme will allow PMDs to avoid lookup to internal ptype table on Rx
     and thereby improve Rx performance if application wishes do so.
 
diff --git a/doc/guides/sample_app_ug/ethtool.rst b/doc/guides/sample_app_ug/ethtool.rst
index 47e09f6..8f7fc6c 100644
--- a/doc/guides/sample_app_ug/ethtool.rst
+++ b/doc/guides/sample_app_ug/ethtool.rst
@@ -40,7 +40,7 @@ The application is console-driven using the cmdline DPDK interface:
         EthApp>
 
 From this interface the available commands and descriptions of what
-they do as as follows:
+they do as follows:
 
 * ``drvinfo``: Print driver info
 * ``eeprom``: Dump EEPROM to file
diff --git a/doc/guides/sample_app_ug/ipsec_secgw.rst b/doc/guides/sample_app_ug/ipsec_secgw.rst
index ae8cce2..d6d8d44 100644
--- a/doc/guides/sample_app_ug/ipsec_secgw.rst
+++ b/doc/guides/sample_app_ug/ipsec_secgw.rst
@@ -158,7 +158,7 @@ Where:
     If packet is not reassembled within this time, received fragments
     will be discarded. Fragment lifetime should be decreased when
     there is a high fragmented traffic loss in high bandwidth networks.
-    Should be lower for for low number of reassembly buckets.
+    Should be lower for low number of reassembly buckets.
     Valid values: from 1 ns to 10 s. Default value: 10000000 (10 s).
 
 *   ``--reassemble NUM``: max number of entries in reassemble fragment table.
diff --git a/doc/guides/sample_app_ug/ntb.rst b/doc/guides/sample_app_ug/ntb.rst
index df16af8..93fb752 100644
--- a/doc/guides/sample_app_ug/ntb.rst
+++ b/doc/guides/sample_app_ug/ntb.rst
@@ -82,7 +82,7 @@ The application is console-driven using the cmdline DPDK interface:
         ntb>
 
 From this interface the available commands and descriptions of what
-they do as as follows:
+they do as follows:
 
 * ``send [filepath]``: Send file to the peer host. Need to be in
   file-trans forwarding mode first.
diff --git a/doc/guides/sample_app_ug/performance_thread.rst b/doc/guides/sample_app_ug/performance_thread.rst
index ac6ee8a..5fed464 100644
--- a/doc/guides/sample_app_ug/performance_thread.rst
+++ b/doc/guides/sample_app_ug/performance_thread.rst
@@ -280,7 +280,7 @@ functionality into different threads, and the pairs of RX and TX threads are
 interconnected via software rings.
 
 On initialization an L-thread scheduler is started on every EAL thread. On all
-but the master EAL thread only a a dummy L-thread is initially started.
+but the master EAL thread only a dummy L-thread is initially started.
 The L-thread started on the master EAL thread then spawns other L-threads on
 different L-thread schedulers according the command line parameters.
 
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 48473d8..6779822 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -33,7 +33,7 @@ If you type a partial command and hit ``<TAB>`` you get a list of the available
 
 .. note::
 
-   Some examples in this document are too long to fit on one line are are shown wrapped at `"\\"` for display purposes::
+   Some examples in this document are too long to fit on one line are shown wrapped at `"\\"` for display purposes::
 
       testpmd> set flow_ctrl rx (on|off) tx (on|off) (high_water) (low_water) \
                (pause_time) (send_xon) (port_id)
@@ -2760,7 +2760,7 @@ Traffic Management
 ------------------
 
 The following section shows functions for configuring traffic management on
-on the ethernet device through the use of generic TM API.
+the ethernet device through the use of generic TM API.
 
 show port traffic management capability
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst
index 2ea1b59..0390b9c 100644
--- a/doc/guides/tools/proc_info.rst
+++ b/doc/guides/tools/proc_info.rst
@@ -63,7 +63,7 @@ ring. For invalid or no ring name, whole list is dump.
 **--show-mempool[=name]**
 The show-mempool parameter display current allocation of all mempool
 debug information. Specifying the name allows to display details for specific
-specific mempool. For invalid or no mempool name, whole list is dump.
+mempool. For invalid or no mempool name, whole list is dump.
 
 **--iter-mempool=name**
 The iter-mempool parameter iterates and displays mempool elements specified
-- 
1.8.3.1


^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH] examples/l2fwd: fix build warning with system wide install
  2019-11-12 17:09  0% ` Ferruh Yigit
@ 2019-11-12 19:13  0%   ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-12 19:13 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: dev, Marko Kovacevic, Ori Kam, Bruce Richardson, Radu Nicolau,
	Akhil Goyal, Tomasz Kantecki, Sunil Kumar Kori, Pavan Nikhilesh

On Tue, Nov 12, 2019 at 6:09 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:
>
> On 11/12/2019 12:37 PM, David Marchand wrote:
> > Caught when compiling this example with pkg-config:
> >
> >  ## Building l2fwd
> >  ...
> >  main.c: In function ‘main’:
> >  main.c:716:3: warning: ‘rte_eth_dev_set_ptypes’ is deprecated: Symbol
> >  is not yet part of stable ABI [-Wdeprecated-declarations]
> >    716 |   ret = rte_eth_dev_set_ptypes(portid, RTE_PTYPE_UNKNOWN, NULL,
> >        |   ^~~
> >  In file included from main.c:38:
> >  ...build-x86-default/install-root/usr/local/include/rte_ethdev.h:2661:5:
> >  note: declared here
> >   2661 | int rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t
> >  ptype_mask,
> >        |     ^~~~~~~~~~~~~~~~~~~~~~
> >  ln -sf l2fwd-shared build/l2fwd
> >
> > Fixes: 9731df2e7554 ("examples/l2fwd: disable packet type parsing")
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
>
> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

Thanks.
Applied.



--
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-11  8:01  0%                         ` Matan Azrad
@ 2019-11-12 18:31  0%                           ` Ananyev, Konstantin
  0 siblings, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2019-11-12 18:31 UTC (permalink / raw)
  To: Matan Azrad, Yigit, Ferruh, Dekel Peled, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev



> -----Original Message-----
> From: Matan Azrad <matan@mellanox.com>
> Sent: Monday, November 11, 2019 8:01 AM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Dekel Peled <dekelp@mellanox.com>;
> Mcnamara, John <john.mcnamara@intel.com>; Kovacevic, Marko <marko.kovacevic@intel.com>; nhorman@tuxdriver.com;
> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Burakov, Anatoly <anatoly.burakov@intel.com>;
> xuanziyang2@huawei.com; cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Shahaf
> Shuler <shahafs@mellanox.com>; Slava Ovsiienko <viacheslavo@mellanox.com>; rmody@marvell.com; shshaikh@marvell.com;
> maxime.coquelin@redhat.com; Bie, Tiwei <tiwei.bie@intel.com>; Wang, Zhihong <zhihong.wang@intel.com>; yongwang@vmware.com;
> Thomas Monjalon <thomas@monjalon.net>; arybchenko@solarflare.com; Wu, Jingjing <jingjing.wu@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
> 
> 
> 
> From: Ananyev, Konstantin
> > >
> > > From: Ferruh Yigit
> > > > On 11/8/2019 11:56 AM, Matan Azrad wrote:
> > > > >
> > > > >
> > > > > From: Ferruh Yigit
> > > > >> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> > > > >>>
> > > > >>>
> > > > >>> From: Ferruh Yigit
> > > > >>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> > > > >>>>> Hi
> > > > >>>>>
> > > > >>>>> From: Ferruh Yigit
> > > > >>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > >>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > >>>>>>>
> > > > >>>>>> 	RTE_ETHER_MAX_LEN;
> > > > >>>>>>>  	}
> > > > >>>>>>>
> > > > >>>>>>> +	/*
> > > > >>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
> > > > >> packet
> > > > >>>>>>> +	 * size is supported by the configured device.
> > > > >>>>>>> +	 */
> > > > >>>>>>> +	if (dev_conf->rxmode.offloads &
> > > > >> DEV_RX_OFFLOAD_TCP_LRO) {
> > > > >>>>>>> +		ret = check_lro_pkt_size(
> > > > >>>>>>> +				port_id, dev_conf-
> > > > >>>>>>> rxmode.max_lro_pkt_size,
> > > > >>>>>>> +				dev_info.max_lro_pkt_size);
> > > > >>>>>>> +		if (ret != 0)
> > > > >>>>>>> +			goto rollback;
> > > > >>>>>>> +	}
> > > > >>>>>>> +
> > > > >>>>>>
> > > > >>>>>> This check forces applications that enable LRO to provide
> > > > >>>> 'max_lro_pkt_size'
> > > > >>>>>> config value.
> > > > >>>>>
> > > > >>>>> Yes.(we can break an API, we noticed it)
> > > > >>>>
> > > > >>>> I am not talking about API/ABI breakage, that part is OK.
> > > > >>>> With this check, if the application requested LRO offload but
> > > > >>>> not provided 'max_lro_pkt_size' value, device configuration will fail.
> > > > >>>>
> > > > >>> Yes
> > > > >>>> Can there be a case application is good with whatever the PMD
> > > > >>>> can support as max?
> > > > >>> Yes can be - you know, we can do everything we want but it is
> > > > >>> better to be
> > > > >> consistent:
> > > > >>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > > > >>> offload, max
> > > > >> lro pkt len should be mandatory for LRO offload.
> > > > >>>
> > > > >>> So your question is actually why both, non-lro packets and LRO
> > > > >>> packets max
> > > > >> size are mandatory...
> > > > >>>
> > > > >>>
> > > > >>> I think it should be important values for net applications
> > management.
> > > > >>> Also good for mbuf size managements.
> > > > >>>
> > > > >>>>>
> > > > >>>>>> - Why it is mandatory now, how it was working before if it is
> > > > >>>>>> mandatory value?
> > > > >>>>>
> > > > >>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> > > > >>>>> frame
> > > > >>>> offload.
> > > > >>>>> So now, when the user configures a LRO offload he must to set
> > > > >>>>> max lro pkt
> > > > >>>> len.
> > > > >>>>> We don't want to confuse the user here with the max rx pkt len
> > > > >>>> configurations and behaviors, they should be with same logic.
> > > > >>>>>
> > > > >>>>> This parameter defines well the LRO behavior.
> > > > >>>>> Before this, each PMD took its own interpretation to what
> > > > >>>>> should be the
> > > > >>>> maximum size for LRO aggregated packets.
> > > > >>>>> Now, the user must say what is his intension, and the ethdev
> > > > >>>>> can limit it
> > > > >>>> according to the device capability.
> > > > >>>>> By this way, also, the PMD can organize\optimize its data-path
> > more.
> > > > >>>>> Also, the application can create different mempools for LRO
> > > > >>>>> queues to
> > > > >>>> allow bigger packet receiving for LRO traffic.
> > > > >>>>>
> > > > >>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so
> > > > >>>>>> it is
> > > > '0'?
> > > > >>>>> Yes, you can see the feature description Dekel added.
> > > > >>>>> This patch also updates all the PMDs support an LRO for non-0
> > value.
> > > > >>>>
> > > > >>>> Of course I can see the updates Matan, my point is "What
> > > > >>>> happens if PMD doesn't provide 'max_lro_pkt_size'",
> > > > >>>> 1) There is no check for it right, so it is acceptable?
> > > > >>>
> > > > >>> There is check.
> > > > >>> If the capability is 0, any non-zero configuration will fail.
> > > > >>>
> > > > >>>> 2) Are we making this filed mandatory to provide for PMDs, it
> > > > >>>> is easy to make new fields mandatory for PMDs but is this
> > > > >>>> really
> > > > necessary?
> > > > >>>
> > > > >>> Yes, for consistence.
> > > > >>>
> > > > >>>>>
> > > > >>>>> as same as max rx pkt len, no?
> > > > >>>>>
> > > > >>>>>> - What do you think setting 'max_lro_pkt_size' config value
> > > > >>>>>> to what PMD provided if application doesn't provide it?
> > > > >>>>> Same answers as above.
> > > > >>>>>
> > > > >>>>
> > > > >>>> If application doesn't care the value, as it has been till now,
> > > > >>>> and not provided explicit 'max_lro_pkt_size', why not ethdev
> > > > >>>> level use the value provided by PMD instead of failing?
> > > > >>>
> > > > >>> Again, same question we can ask on max rx pkt len.
> > > > >>>
> > > > >>> Looks like the packet size is very important value which should
> > > > >>> be set by
> > > > >> the application.
> > > > >>>
> > > > >>> Previous applications have no option to configure it, so they
> > > > >>> haven't
> > > > >> configure it, (probably cover it somehow) I think it is our miss
> > > > >> to supply this info.
> > > > >>>
> > > > >>> Let's do it in same way as we do max rx pkt len (as this patch main
> > idea).
> > > > >>> Later, we can change both to other meaning.
> > > > >>>
> > > > >>
> > > > >> I think it is not a good reason to introduce a new mandatory
> > > > >> config option for application because of 'max_rx_pkt_len' does it.
> > > > >
> > > > > It is mandatory only if LRO offload is configured.
> > > > >
> > > > >> Will it work, if:
> > > > >> - If application doesn't provide this value, use the PMD max
> > > > >
> > > > > May cause a problem if the mbuf size is not enough for the PMD
> > maximum.
> > > >
> > > > OK, this is what I was missing, for this case I was thinking
> > > > max_rx_pkt_len will be used but you already explained that
> > > > application may want to use different mempools for LRO queues.
> > > >
> > > So , are you agree with the idea?
> > >
> > > > For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
> > > > account and program the device accordingly (of course in LRO enabled
> > > > case) ?
> > > > This part seems missing and should be highlighted to other PMD
> > maintainers.
> > >
> > >
> > > Yes, you are right.
> > > PMDs must limit the LRO aggregated packet according to the new field,
> > > And it probably very hard for the patch introducer to understand how to do
> > it for each PMD.
> > >
> > > I think each new configuration requires other maintainers\developers
> > > to adjust their own PMD code to the new configuration and it should be
> > done in limited time.
> > >
> > > My suggestion here:
> > > 1. To reserve the info field and the configuration field for rc2.(if
> > > it is critical not to break ABI for rc3) 2. To merge the ethdev patch in the
> > start of rc3.
> > > 3. Request each relevant PMD to adjust its PMD to the new configuration
> > for the end of rc3.
> > > 	Note: this should be small change and only for ~5 PMDs:
> > > 		a. Introduce the info field according to the device ability.
> > > 		b. For each LRO queue:
> > > 			Use the LRO max size configuration instead of the
> > current max rx pkt len configuration(looks like small condition).
> >
> > That's definitely looks like a significant behavior change for existing apps and
> > PMDs, and I wonder what for?
> 
> There was a miss in configuration:
> 
> It doesn't make sense to limit non-lro queues with the same packets length of lro queues:
> 	Naturally, LRO packets are bigger significantly(because of the HW aggregation), hence,
> 	the user may use bigger mbufs for the LRO packets, so potentially, it is better to separate mempool, one for the LRO queues with
> big mbufs and the second for the non-LRO queues with smaller mbufs (to optimize the memory usage).
> 	Since the user may want tail-room in the LRO mbuf  it may limit the LRO packet size to smaller number than the mbuf (-
> HEADROOM) and for this reason as same as the usage of the regular field  (max_rx_pkt_len) a new field should be set for LRO queues.
> 
> > Why we can't keep max_rx_pkt_len semantics as it is right now, and just add
> > an optional ability to limit max size of LRO aggregations?
> 
> What is the semantic of max_rx_pkt_len regards LRO packets? It is not clear from the documentation.

That's probably where misunderstanding starts.
For me:
max_rx_pkt_len is the maximum size of the ethernet packet the NIC
will accept (doesn't matter LRO enabled or not).
Now if LRO is enabled NIC can accumulate multiple 'physical' packets
into one big 'virtual' one.
So when LRO is enabled max_lro_size limits how big these
accumulated 'virtual' packets can be.
While max_rx_pkt_len still limits max ethernet packet size NIC will accept. 

In what you suggest it is not clear to me what will be max_lro_size semantics.
Would it be maximum size of the ethernet packet the NIC will accept (equivalent of max_rx_pkt_len)
or would it be accumulated 'virtual' packet size limit?  
Or might be something else?

> 
> So this patch defines it well:
> Non-LRO queues should be limited to max_rx_pkt_len.
> LRO queues should be limited to max_lro_pkt_len.
> 
> The consistence in the ways of the configuration for RX packet length should be the same.
> max_rx_pkt_len is mandatory for JUMBO offload => max_lro_pkt_len is mandatory for LRO offload.
> 
> 
> Current applications uses LRO just need to configure the field same as current max_rx_pkt_len if they want to stay with the same behavior -
> really not a big change.
> If the application want to improve their memory usage as I said above, the new fields allow it as well.
> 
> > > What do you think?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] examples/l2fwd: fix build warning with system wide install
  2019-11-12 12:37  3% [dpdk-dev] [PATCH] examples/l2fwd: fix build warning with system wide install David Marchand
@ 2019-11-12 17:09  0% ` Ferruh Yigit
  2019-11-12 19:13  0%   ` David Marchand
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-12 17:09 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: Marko Kovacevic, Ori Kam, Bruce Richardson, Radu Nicolau,
	Akhil Goyal, Tomasz Kantecki, Sunil Kumar Kori, Pavan Nikhilesh

On 11/12/2019 12:37 PM, David Marchand wrote:
> Caught when compiling this example with pkg-config:
> 
>  ## Building l2fwd
>  ...
>  main.c: In function ‘main’:
>  main.c:716:3: warning: ‘rte_eth_dev_set_ptypes’ is deprecated: Symbol
>  is not yet part of stable ABI [-Wdeprecated-declarations]
>    716 |   ret = rte_eth_dev_set_ptypes(portid, RTE_PTYPE_UNKNOWN, NULL,
>        |   ^~~
>  In file included from main.c:38:
>  ...build-x86-default/install-root/usr/local/include/rte_ethdev.h:2661:5:
>  note: declared here
>   2661 | int rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t
>  ptype_mask,
>        |     ^~~~~~~~~~~~~~~~~~~~~~
>  ln -sf l2fwd-shared build/l2fwd
> 
> Fixes: 9731df2e7554 ("examples/l2fwd: disable packet type parsing")
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] examples/l2fwd: fix build warning with system wide install
@ 2019-11-12 12:37  3% David Marchand
  2019-11-12 17:09  0% ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-12 12:37 UTC (permalink / raw)
  To: dev
  Cc: Marko Kovacevic, Ori Kam, Bruce Richardson, Radu Nicolau,
	Akhil Goyal, Tomasz Kantecki, Sunil Kumar Kori, Pavan Nikhilesh

Caught when compiling this example with pkg-config:

 ## Building l2fwd
 ...
 main.c: In function ‘main’:
 main.c:716:3: warning: ‘rte_eth_dev_set_ptypes’ is deprecated: Symbol
 is not yet part of stable ABI [-Wdeprecated-declarations]
   716 |   ret = rte_eth_dev_set_ptypes(portid, RTE_PTYPE_UNKNOWN, NULL,
       |   ^~~
 In file included from main.c:38:
 ...build-x86-default/install-root/usr/local/include/rte_ethdev.h:2661:5:
 note: declared here
  2661 | int rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t
 ptype_mask,
       |     ^~~~~~~~~~~~~~~~~~~~~~
 ln -sf l2fwd-shared build/l2fwd

Fixes: 9731df2e7554 ("examples/l2fwd: disable packet type parsing")

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 examples/l2fwd/Makefile | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/examples/l2fwd/Makefile b/examples/l2fwd/Makefile
index 59b2b4a..9c50684 100644
--- a/examples/l2fwd/Makefile
+++ b/examples/l2fwd/Makefile
@@ -21,6 +21,8 @@ PKGCONF=pkg-config --define-prefix
 
 PC_FILE := $(shell $(PKGCONF) --path libdpdk)
 CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
+# Add flag to allow experimental API as l2fwd uses rte_ethdev_set_ptype API
+CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = -Wl,-Bstatic $(shell $(PKGCONF) --static --libs libdpdk)
 
-- 
1.8.3.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major abi versions
  2019-11-12  7:55  5%   ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Thomas Monjalon
@ 2019-11-12  8:49  5%     ` Ray Kinsella
  0 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-12  8:49 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole



On 12/11/2019 07:55, Thomas Monjalon wrote:
> 11/11/2019 12:57, Ray Kinsella:
>> TL;DR abbreviation:
>> A major ABI version that all DPDK releases during an agreed period support. ABI
>> versioning is managed at a project-level, in place of library-level management.
>> ABI changes to add new features are permitted, as long as ABI compatibility with
>> the major ABI version is maintained.
>>
> [...]
>> Ray Kinsella (3):
>>   doc: separate versioning.rst into version and policy
>>   doc: changes to abi policy introducing major abi versions
>>   doc: updates to versioning guide for abi versions
> 
> Applied, thanks
> 

Thank you,

Ray K

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [dpdk-announce] release candidate 19.11-rc2
@ 2019-11-12  8:42  4% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-12  8:42 UTC (permalink / raw)
  To: announce

A new DPDK release candidate is ready for testing:
	https://git.dpdk.org/dpdk/tag/?id=v19.11-rc2
289 patches were integrated.

The release notes so far:
	http://doc.dpdk.org/guides/rel_notes/release_19_11.html
It should be completed with a list of tested hardware.

Highlights of 19.11-rc2:
	- new ABI policy
	- LTO build
	- mempool objects not crossing pages
	- RIB/FIB libraries
	- ethdev hairpin API
	- ethdev flow tag API
	- ethdev packet type range API
	- ethdev LRO packet size API
	- l2fwd-event example

The -rc3 should include only some bug fixes, simple cleanups, doc
and tooling (especially for the new ABI policy).
KNI VA support might also be added in last minute.
This next milestone is expected to be released on Monday 18th.

Please check what is missing and help completing this major release.

Thank you everyone



^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major abi versions
  2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
                     ` (2 preceding siblings ...)
  2019-11-11 11:57 35%   ` [dpdk-dev] [PATCH v11 3/3] doc: updates to versioning guide for " Ray Kinsella
@ 2019-11-12  7:55  5%   ` Thomas Monjalon
  2019-11-12  8:49  5%     ` Ray Kinsella
  3 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-12  7:55 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole

11/11/2019 12:57, Ray Kinsella:
> TL;DR abbreviation:
> A major ABI version that all DPDK releases during an agreed period support. ABI
> versioning is managed at a project-level, in place of library-level management.
> ABI changes to add new features are permitted, as long as ABI compatibility with
> the major ABI version is maintained.
> 
[...]
> Ray Kinsella (3):
>   doc: separate versioning.rst into version and policy
>   doc: changes to abi policy introducing major abi versions
>   doc: updates to versioning guide for abi versions

Applied, thanks




^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH] eventdev: reserve space in main structs for extension
  2019-11-08 16:56  4% [dpdk-dev] [PATCH] eventdev: reserve space in main structs for extension jerinj
@ 2019-11-12  2:58  0% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-12  2:58 UTC (permalink / raw)
  To: jerinj; +Cc: dev

08/11/2019 17:56, jerinj@marvell.com:
> From: Jerin Jacob <jerinj@marvell.com>
> 
> The struct rte_eventdev and rte_eventdev_data are supposed
> to be used internally only, but there is a chance that
> increasing their size would break ABI for some applications.
> In order to allow smooth addition of features without breaking
> ABI compatibility, some space is reserved.
> 
> Signed-off-by: Jerin Jacob <jerinj@marvell.com>

Applied, thanks




^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v7 1/3] ethdev: support API to set max LRO packet size
  @ 2019-11-11 17:47  4%     ` Dekel Peled
  0 siblings, 0 replies; 200+ results
From: Dekel Peled @ 2019-11-11 17:47 UTC (permalink / raw)
  To: john.mcnamara, marko.kovacevic, nhorman, ajit.khaparde,
	somnath.kotur, anatoly.burakov, xuanziyang2, cloud.wangxiaoyun,
	zhouguoyang, wenzhuo.lu, konstantin.ananyev, matan, shahafs,
	viacheslavo, rmody, shshaikh, maxime.coquelin, tiwei.bie,
	zhihong.wang, yongwang, thomas, ferruh.yigit, arybchenko,
	jingjing.wu, bernard.iremonger
  Cc: dev

This patch implements [1], to support API for configuration and
validation of max size for LRO aggregated packet.
API change notice [2] is removed, and release notes for 19.11
are updated accordingly.

[1] http://patches.dpdk.org/patch/58217/
[2] http://patches.dpdk.org/patch/57492/

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Matan Azrad <matan@mellanox.com>
---
 doc/guides/nics/features.rst           |  2 ++
 doc/guides/rel_notes/deprecation.rst   |  4 ---
 doc/guides/rel_notes/release_19_11.rst |  8 +++++
 lib/librte_ethdev/rte_ethdev.c         | 59 ++++++++++++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h         |  4 +++
 5 files changed, 73 insertions(+), 4 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index 7a31cf7..2138ce3 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -193,10 +193,12 @@ LRO
 Supports Large Receive Offload.
 
 * **[uses]       rte_eth_rxconf,rte_eth_rxmode**: ``offloads:DEV_RX_OFFLOAD_TCP_LRO``.
+  ``dev_conf.rxmode.max_lro_pkt_size``.
 * **[implements] datapath**: ``LRO functionality``.
 * **[implements] rte_eth_dev_data**: ``lro``.
 * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
 * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
+* **[provides]   rte_eth_dev_info**: ``max_lro_pkt_size``.
 
 
 .. _nic_features_tso:
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index fad208b..dbfb059 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -83,10 +83,6 @@ Deprecation Notices
   This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
   thereby improve Rx performance if application wishes do so.
 
-* ethdev: New 32-bit fields may be added for maximum LRO session size, in
-  struct ``rte_eth_dev_info`` for the port capability and in struct
-  ``rte_eth_rxmode`` for the port configuration.
-
 * cryptodev: support for using IV with all sizes is added, J0 still can
   be used but only when IV length in following structs ``rte_crypto_auth_xform``,
   ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index da48051..d29acbe 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -444,6 +444,14 @@ ABI Changes
 * ipsec: The field ``replay_win_sz`` has been removed from the structure
   ``rte_ipsec_sa_prm`` as it has been added to the security library.
 
+* ethdev: Added 32-bit fields for maximum LRO aggregated packet size, in
+  struct ``rte_eth_dev_info`` for the port capability and in struct
+  ``rte_eth_rxmode`` for the port configuration.
+  Application should use the new field in struct ``rte_eth_rxmode`` to configure
+  the requested size.
+  PMD should use the new field in struct ``rte_eth_dev_info`` to report the
+  supported port capability.
+
 
 Shared Library Versions
 -----------------------
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 652c369..55e0e0d 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1136,6 +1136,33 @@ struct rte_eth_dev *
 	return name;
 }
 
+static inline int
+check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
+		   uint32_t max_rx_pkt_len, uint32_t dev_info_size)
+{
+	int ret = 0;
+
+	if (dev_info_size == 0) {
+		if (config_size != max_rx_pkt_len) {
+			RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size"
+				       " %u != %u is not allowed\n",
+				       port_id, config_size, max_rx_pkt_len);
+			ret = -EINVAL;
+		}
+	} else if (config_size > dev_info_size) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "> max allowed value %u\n", port_id, config_size,
+			       dev_info_size);
+		ret = -EINVAL;
+	} else if (config_size < RTE_ETHER_MIN_LEN) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "< min allowed value %u\n", port_id, config_size,
+			       (unsigned int)RTE_ETHER_MIN_LEN);
+		ret = -EINVAL;
+	}
+	return ret;
+}
+
 int
 rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
@@ -1266,6 +1293,22 @@ struct rte_eth_dev *
 							RTE_ETHER_MAX_LEN;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		if (dev_conf->rxmode.max_lro_pkt_size == 0)
+			dev->data->dev_conf.rxmode.max_lro_pkt_size =
+				dev->data->dev_conf.rxmode.max_rx_pkt_len;
+		ret = check_lro_pkt_size(port_id,
+				dev->data->dev_conf.rxmode.max_lro_pkt_size,
+				dev->data->dev_conf.rxmode.max_rx_pkt_len,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			goto rollback;
+	}
+
 	/* Any requested offloading must be within its device capabilities */
 	if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) !=
 	     dev_conf->rxmode.offloads) {
@@ -1770,6 +1813,22 @@ struct rte_eth_dev *
 		return -EINVAL;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		if (dev->data->dev_conf.rxmode.max_lro_pkt_size == 0)
+			dev->data->dev_conf.rxmode.max_lro_pkt_size =
+				dev->data->dev_conf.rxmode.max_rx_pkt_len;
+		int ret = check_lro_pkt_size(port_id,
+				dev->data->dev_conf.rxmode.max_lro_pkt_size,
+				dev->data->dev_conf.rxmode.max_rx_pkt_len,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			return ret;
+	}
+
 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
 					      socket_id, &local_conf, mp);
 	if (!ret) {
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 44d77b3..1b76df5 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -395,6 +395,8 @@ struct rte_eth_rxmode {
 	/** The multi-queue packet distribution mode to be used, e.g. RSS. */
 	enum rte_eth_rx_mq_mode mq_mode;
 	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME enabled. */
+	/** Maximum allowed size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
 	/**
 	 * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
@@ -1218,6 +1220,8 @@ struct rte_eth_dev_info {
 	const uint32_t *dev_flags; /**< Device flags */
 	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
 	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
+	/** Maximum configurable size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
 	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
 	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
-- 
1.8.3.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] ethdev: reserve space in main structs for extension
  2019-11-11 10:54  0%   ` Ferruh Yigit
@ 2019-11-11 16:22  0%     ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2019-11-11 16:22 UTC (permalink / raw)
  To: Thomas Monjalon, Andrew Rybchenko; +Cc: dev

On 11/11/2019 10:54 AM, Ferruh Yigit wrote:
> On 11/11/2019 7:26 AM, Thomas Monjalon wrote:
>> In order to allow smooth addition of features without breaking
>> ABI compatibility, some space is reserved in several core structs
>> of ethdev API.
>>
>> The struct rte_eth_dev and rte_eth_dev_data are supposed
>> to be used internally only, but there is a chance that
>> increasing their size would break ABI for some applications.
>>
>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> 
> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 

Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-11 12:21  0%                           ` Ferruh Yigit
@ 2019-11-11 13:32  0%                             ` Matan Azrad
  0 siblings, 0 replies; 200+ results
From: Matan Azrad @ 2019-11-11 13:32 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev



From: Ferruh Yigit
> On 11/11/2019 11:33 AM, Matan Azrad wrote:
> >
> >
> > From: Ferruh Yigit
> >> On 11/9/2019 6:20 PM, Matan Azrad wrote:
> >>> Hi
> >>>
> >>> From: Ferruh Yigit
> >>>> On 11/8/2019 11:56 AM, Matan Azrad wrote:
> >>>>>
> >>>>>
> >>>>> From: Ferruh Yigit
> >>>>>> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>> From: Ferruh Yigit
> >>>>>>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> >>>>>>>>> Hi
> >>>>>>>>>
> >>>>>>>>> From: Ferruh Yigit
> >>>>>>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> >>>>>>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> >>>>>>>>>>>
> >>>>>>>>>> 	RTE_ETHER_MAX_LEN;
> >>>>>>>>>>>  	}
> >>>>>>>>>>>
> >>>>>>>>>>> +	/*
> >>>>>>>>>>> +	 * If LRO is enabled, check that the maximum
> aggregated
> >>>>>> packet
> >>>>>>>>>>> +	 * size is supported by the configured device.
> >>>>>>>>>>> +	 */
> >>>>>>>>>>> +	if (dev_conf->rxmode.offloads &
> >>>>>> DEV_RX_OFFLOAD_TCP_LRO) {
> >>>>>>>>>>> +		ret = check_lro_pkt_size(
> >>>>>>>>>>> +				port_id, dev_conf-
> >>>>>>>>>>> rxmode.max_lro_pkt_size,
> >>>>>>>>>>> +				dev_info.max_lro_pkt_size);
> >>>>>>>>>>> +		if (ret != 0)
> >>>>>>>>>>> +			goto rollback;
> >>>>>>>>>>> +	}
> >>>>>>>>>>> +
> >>>>>>>>>>
> >>>>>>>>>> This check forces applications that enable LRO to provide
> >>>>>>>> 'max_lro_pkt_size'
> >>>>>>>>>> config value.
> >>>>>>>>>
> >>>>>>>>> Yes.(we can break an API, we noticed it)
> >>>>>>>>
> >>>>>>>> I am not talking about API/ABI breakage, that part is OK.
> >>>>>>>> With this check, if the application requested LRO offload but
> >>>>>>>> not provided 'max_lro_pkt_size' value, device configuration will
> fail.
> >>>>>>>>
> >>>>>>> Yes
> >>>>>>>> Can there be a case application is good with whatever the PMD
> >>>>>>>> can support as max?
> >>>>>>> Yes can be - you know, we can do everything we want but it is
> >>>>>>> better to be
> >>>>>> consistent:
> >>>>>>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> >>>>>>> offload, max
> >>>>>> lro pkt len should be mandatory for LRO offload.
> >>>>>>>
> >>>>>>> So your question is actually why both, non-lro packets and LRO
> >>>>>>> packets max
> >>>>>> size are mandatory...
> >>>>>>>
> >>>>>>>
> >>>>>>> I think it should be important values for net applications
> management.
> >>>>>>> Also good for mbuf size managements.
> >>>>>>>
> >>>>>>>>>
> >>>>>>>>>> - Why it is mandatory now, how it was working before if it is
> >>>>>>>>>> mandatory value?
> >>>>>>>>>
> >>>>>>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> >>>>>>>>> frame
> >>>>>>>> offload.
> >>>>>>>>> So now, when the user configures a LRO offload he must to set
> >>>>>>>>> max lro pkt
> >>>>>>>> len.
> >>>>>>>>> We don't want to confuse the user here with the max rx pkt len
> >>>>>>>> configurations and behaviors, they should be with same logic.
> >>>>>>>>>
> >>>>>>>>> This parameter defines well the LRO behavior.
> >>>>>>>>> Before this, each PMD took its own interpretation to what
> >>>>>>>>> should be the
> >>>>>>>> maximum size for LRO aggregated packets.
> >>>>>>>>> Now, the user must say what is his intension, and the ethdev
> >>>>>>>>> can limit it
> >>>>>>>> according to the device capability.
> >>>>>>>>> By this way, also, the PMD can organize\optimize its data-path
> >> more.
> >>>>>>>>> Also, the application can create different mempools for LRO
> >>>>>>>>> queues to
> >>>>>>>> allow bigger packet receiving for LRO traffic.
> >>>>>>>>>
> >>>>>>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so
> >>>>>>>>>> it is
> >>>> '0'?
> >>>>>>>>> Yes, you can see the feature description Dekel added.
> >>>>>>>>> This patch also updates all the PMDs support an LRO for non-0
> >> value.
> >>>>>>>>
> >>>>>>>> Of course I can see the updates Matan, my point is "What
> >>>>>>>> happens if PMD doesn't provide 'max_lro_pkt_size'",
> >>>>>>>> 1) There is no check for it right, so it is acceptable?
> >>>>>>>
> >>>>>>> There is check.
> >>>>>>> If the capability is 0, any non-zero configuration will fail.
> >>>>>>>
> >>>>>>>> 2) Are we making this filed mandatory to provide for PMDs, it
> >>>>>>>> is easy to make new fields mandatory for PMDs but is this
> >>>>>>>> really
> >>>> necessary?
> >>>>>>>
> >>>>>>> Yes, for consistence.
> >>>>>>>
> >>>>>>>>>
> >>>>>>>>> as same as max rx pkt len, no?
> >>>>>>>>>
> >>>>>>>>>> - What do you think setting 'max_lro_pkt_size' config value
> >>>>>>>>>> to what PMD provided if application doesn't provide it?
> >>>>>>>>> Same answers as above.
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>> If application doesn't care the value, as it has been till now,
> >>>>>>>> and not provided explicit 'max_lro_pkt_size', why not ethdev
> >>>>>>>> level use the value provided by PMD instead of failing?
> >>>>>>>
> >>>>>>> Again, same question we can ask on max rx pkt len.
> >>>>>>>
> >>>>>>> Looks like the packet size is very important value which should
> >>>>>>> be set by
> >>>>>> the application.
> >>>>>>>
> >>>>>>> Previous applications have no option to configure it, so they
> >>>>>>> haven't
> >>>>>> configure it, (probably cover it somehow) I think it is our miss
> >>>>>> to supply this info.
> >>>>>>>
> >>>>>>> Let's do it in same way as we do max rx pkt len (as this patch
> >>>>>>> main
> >> idea).
> >>>>>>> Later, we can change both to other meaning.
> >>>>>>>
> >>>>>>
> >>>>>> I think it is not a good reason to introduce a new mandatory
> >>>>>> config option for application because of 'max_rx_pkt_len' does it.
> >>>>>
> >>>>> It is mandatory only if LRO offload is configured.
> >>>>>
> >>>>>> Will it work, if:
> >>>>>> - If application doesn't provide this value, use the PMD max
> >>>>>
> >>>>> May cause a problem if the mbuf size is not enough for the PMD
> >> maximum.
> >>>>
> >>>> OK, this is what I was missing, for this case I was thinking
> >>>> max_rx_pkt_len will be used but you already explained that
> >>>> application may want to use different mempools for LRO queues.
> >>>>
> >>> So , are you agree with the idea?
> >>>
> >>>> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size'
> >>>> into account and program the device accordingly (of course in LRO
> >>>> enabled
> >>>> case) ?
> >>>> This part seems missing and should be highlighted to other PMD
> >> maintainers.
> >>>
> >>>
> >>> Yes, you are right.
> >>> PMDs must limit the LRO aggregated packet according to the new
> >>> field, And it probably very hard for the patch introducer to
> >>> understand how to do
> >> it for each PMD.
> >>>
> >>> I think each new configuration requires other maintainers\developers
> >>> to
> >> adjust their own PMD code to the new configuration and it should be
> >> done in limited time.
> >>
> >> Agree.
> >> But experience showed that this synchronization is not as easy as it
> >> sounds, whoever changing the interface/library says other PMDs should
> >> reflect the change but most of the times other PMD maintainers not
> >> aware of it or if they do they have other priorities for the release,
> >> so the changes should be in a way to give more time to PMDs to adapt
> >> it and during this time library change shouldn't break other PMDs.
> >>
> >
> > Yes.
> >
> >>> My suggestion here:
> >>> 1. To reserve the info field and the configuration field for rc2.(if
> >>> it is critical not to break ABI for rc3) 2. To merge the ethdev
> >>> patch in the
> >> start of rc3.
> >>> 3. Request each relevant PMD to adjust its PMD to the new
> >>> configuration
> >> for the end of rc3.
> >>> 	Note: this should be small change and only for ~5 PMDs:
> >>> 		a. Introduce the info field according to the device ability.
> >>> 		b. For each LRO queue:
> >>> 			Use the LRO max size configuration instead of the
> >> current max rx pkt len configuration(looks like small condition).
> >>>
> >>> What do you think?
> >>
> >> There is already a v6 which only updates dev_info fields to have the
> >> 'max_lro_pktlen' field, the PMD updates there also looks safe, so I
> >> think we can go with it for rc2.
> >>
> >
> > Doesn’t make sense to expose the info field without the configuration.
> >
> >
> >> For the configuration part, I suggest deferring it next release,
> >> which gives more time for discussion and enough time for other PMDs to
> implement it.
> >>
> >>
> >> And related configuration, right now devices already configured to
> >> limit the packet size to 'max_rx_pkt_len', it can be an optimization
> >> to increase it to 'max_lro_pkt_len' for the queues LRO is supported,
> >> why not make this configuration more explicitly with specific API as
> >> Konstantin suggested [1], this way it only affects the applications
> >> that are interested in and the PMDs that want to support this.
> >> Current implementation is under 'rte_eth_dev_configure()' which is
> >> used by all DPDK applications and impact of changing it is much
> >> larger, also it makes mandatory for applications to provide this
> >> config option when LRO enabled, explicit API gives same result without
> making a mandatory config option.
> >>
> >> [1]
> >> int rte_eth_dev_set_max_lro(uint16_t port_id, uint32_t lro);
> >
> > Please see my answers to Konstantin regarding this topic.
> >
> >
> >
> > One more option:
> > In order to not break PMDs because of this feature:
> > 0 in the capability field means, The PMD doesn't support LRO special
> limitation so if the application configuration is not the same like
> max_rx_pkt_len the validation will fail.
> >
> 
> I don't see this is a mandatory field if the LRO is enabled, am I missing
> something?

From the application size, this is mandatory, you right exactly like max_rx_pkt_len.

> And current implementation does so by failing configure(), the
> affect to the applications is my first concern.

This is a small effect as any API change.
If an exists application wants to save its current LRO behavior, it just need to put max_lro_pkt_len=max_rx_pkt_len.
Do you think this is a big change? Why?


> Second is when application supplied the proper values but PMD is not doing
> anything without letting application anything done.
> 

PMD which doesn't change its info to value != 0, as I said, means that it doesn't support LRO queues special limited size.
When the PMD maintainers have time to support the feature, they just need to change the info value to be !=0 and to take into account the max_lro_pkt_len in configuration.

> That is why I think explicit API makes this clear and only required by
> application wants to use it.


I think that exposing a new function API is not good because it introduce a different way to limit the Rx packet size.

For regular packet - configure it in the configuration struct.
For LRO packets - use a function to do it.

It is very confusing and not intuitive from the user side.

Why not to save convention and consistent, so
max_rx_pkt_len  is mandatory (for JUMBO offload) and in the config structure 
Also the new lro conf is mandatory (for LRO offload) and in the configuration structure. 

So, all the configurations to limit the Rx packet size are in the same place and done by the same way.

> Similar can be done with following, this also doesn't require both application
> and PMD changes, wdyt?
> 
> ethdev, configure():
> if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
>   if (dev_conf->rxmode.max_lro_pktlen) {
>     if (dev_info.max_lro_pktlen) {
> 	validate(rxmode.max_lro_pktlen, dev_info.max_lro_pktlen)
>     } else if (dev_info.max_rx_pktlen)
>         validate(rxmode.max_lro_pktlen, dev_info.max_rx_pktlen)
>     }
>   }
> }
> 
> 
> in PMD:
> if (LRO) {
> 	queue.max_pktlen = rxmode.max_lro_pktlen ?
> 		rxmode.max_lro_pktlen :
> 		rxmode.max_tx_pktlen;
> }

Again, my only concern here is the consistency of Rx packet size limitation mandatory for LRO and non-LRO.


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-11 11:33  0%                         ` Matan Azrad
@ 2019-11-11 12:21  0%                           ` Ferruh Yigit
  2019-11-11 13:32  0%                             ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-11 12:21 UTC (permalink / raw)
  To: Matan Azrad, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

On 11/11/2019 11:33 AM, Matan Azrad wrote:
> 
> 
> From: Ferruh Yigit
>> On 11/9/2019 6:20 PM, Matan Azrad wrote:
>>> Hi
>>>
>>> From: Ferruh Yigit
>>>> On 11/8/2019 11:56 AM, Matan Azrad wrote:
>>>>>
>>>>>
>>>>> From: Ferruh Yigit
>>>>>> On 11/8/2019 10:10 AM, Matan Azrad wrote:
>>>>>>>
>>>>>>>
>>>>>>> From: Ferruh Yigit
>>>>>>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>> From: Ferruh Yigit
>>>>>>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
>>>>>>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>>>>>>>>>>>
>>>>>>>>>> 	RTE_ETHER_MAX_LEN;
>>>>>>>>>>>  	}
>>>>>>>>>>>
>>>>>>>>>>> +	/*
>>>>>>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
>>>>>> packet
>>>>>>>>>>> +	 * size is supported by the configured device.
>>>>>>>>>>> +	 */
>>>>>>>>>>> +	if (dev_conf->rxmode.offloads &
>>>>>> DEV_RX_OFFLOAD_TCP_LRO) {
>>>>>>>>>>> +		ret = check_lro_pkt_size(
>>>>>>>>>>> +				port_id, dev_conf-
>>>>>>>>>>> rxmode.max_lro_pkt_size,
>>>>>>>>>>> +				dev_info.max_lro_pkt_size);
>>>>>>>>>>> +		if (ret != 0)
>>>>>>>>>>> +			goto rollback;
>>>>>>>>>>> +	}
>>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>> This check forces applications that enable LRO to provide
>>>>>>>> 'max_lro_pkt_size'
>>>>>>>>>> config value.
>>>>>>>>>
>>>>>>>>> Yes.(we can break an API, we noticed it)
>>>>>>>>
>>>>>>>> I am not talking about API/ABI breakage, that part is OK.
>>>>>>>> With this check, if the application requested LRO offload but not
>>>>>>>> provided 'max_lro_pkt_size' value, device configuration will fail.
>>>>>>>>
>>>>>>> Yes
>>>>>>>> Can there be a case application is good with whatever the PMD can
>>>>>>>> support as max?
>>>>>>> Yes can be - you know, we can do everything we want but it is
>>>>>>> better to be
>>>>>> consistent:
>>>>>>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
>>>>>>> offload, max
>>>>>> lro pkt len should be mandatory for LRO offload.
>>>>>>>
>>>>>>> So your question is actually why both, non-lro packets and LRO
>>>>>>> packets max
>>>>>> size are mandatory...
>>>>>>>
>>>>>>>
>>>>>>> I think it should be important values for net applications management.
>>>>>>> Also good for mbuf size managements.
>>>>>>>
>>>>>>>>>
>>>>>>>>>> - Why it is mandatory now, how it was working before if it is
>>>>>>>>>> mandatory value?
>>>>>>>>>
>>>>>>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
>>>>>>>>> frame
>>>>>>>> offload.
>>>>>>>>> So now, when the user configures a LRO offload he must to set
>>>>>>>>> max lro pkt
>>>>>>>> len.
>>>>>>>>> We don't want to confuse the user here with the max rx pkt len
>>>>>>>> configurations and behaviors, they should be with same logic.
>>>>>>>>>
>>>>>>>>> This parameter defines well the LRO behavior.
>>>>>>>>> Before this, each PMD took its own interpretation to what should
>>>>>>>>> be the
>>>>>>>> maximum size for LRO aggregated packets.
>>>>>>>>> Now, the user must say what is his intension, and the ethdev can
>>>>>>>>> limit it
>>>>>>>> according to the device capability.
>>>>>>>>> By this way, also, the PMD can organize\optimize its data-path
>> more.
>>>>>>>>> Also, the application can create different mempools for LRO
>>>>>>>>> queues to
>>>>>>>> allow bigger packet receiving for LRO traffic.
>>>>>>>>>
>>>>>>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it
>>>>>>>>>> is
>>>> '0'?
>>>>>>>>> Yes, you can see the feature description Dekel added.
>>>>>>>>> This patch also updates all the PMDs support an LRO for non-0
>> value.
>>>>>>>>
>>>>>>>> Of course I can see the updates Matan, my point is "What happens
>>>>>>>> if PMD doesn't provide 'max_lro_pkt_size'",
>>>>>>>> 1) There is no check for it right, so it is acceptable?
>>>>>>>
>>>>>>> There is check.
>>>>>>> If the capability is 0, any non-zero configuration will fail.
>>>>>>>
>>>>>>>> 2) Are we making this filed mandatory to provide for PMDs, it is
>>>>>>>> easy to make new fields mandatory for PMDs but is this really
>>>> necessary?
>>>>>>>
>>>>>>> Yes, for consistence.
>>>>>>>
>>>>>>>>>
>>>>>>>>> as same as max rx pkt len, no?
>>>>>>>>>
>>>>>>>>>> - What do you think setting 'max_lro_pkt_size' config value to
>>>>>>>>>> what PMD provided if application doesn't provide it?
>>>>>>>>> Same answers as above.
>>>>>>>>>
>>>>>>>>
>>>>>>>> If application doesn't care the value, as it has been till now,
>>>>>>>> and not provided explicit 'max_lro_pkt_size', why not ethdev
>>>>>>>> level use the value provided by PMD instead of failing?
>>>>>>>
>>>>>>> Again, same question we can ask on max rx pkt len.
>>>>>>>
>>>>>>> Looks like the packet size is very important value which should be
>>>>>>> set by
>>>>>> the application.
>>>>>>>
>>>>>>> Previous applications have no option to configure it, so they
>>>>>>> haven't
>>>>>> configure it, (probably cover it somehow) I think it is our miss to
>>>>>> supply this info.
>>>>>>>
>>>>>>> Let's do it in same way as we do max rx pkt len (as this patch main
>> idea).
>>>>>>> Later, we can change both to other meaning.
>>>>>>>
>>>>>>
>>>>>> I think it is not a good reason to introduce a new mandatory config
>>>>>> option for application because of 'max_rx_pkt_len' does it.
>>>>>
>>>>> It is mandatory only if LRO offload is configured.
>>>>>
>>>>>> Will it work, if:
>>>>>> - If application doesn't provide this value, use the PMD max
>>>>>
>>>>> May cause a problem if the mbuf size is not enough for the PMD
>> maximum.
>>>>
>>>> OK, this is what I was missing, for this case I was thinking
>>>> max_rx_pkt_len will be used but you already explained that
>>>> application may want to use different mempools for LRO queues.
>>>>
>>> So , are you agree with the idea?
>>>
>>>> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
>>>> account and program the device accordingly (of course in LRO enabled
>>>> case) ?
>>>> This part seems missing and should be highlighted to other PMD
>> maintainers.
>>>
>>>
>>> Yes, you are right.
>>> PMDs must limit the LRO aggregated packet according to the new field,
>>> And it probably very hard for the patch introducer to understand how to do
>> it for each PMD.
>>>
>>> I think each new configuration requires other maintainers\developers to
>> adjust their own PMD code to the new configuration and it should be done in
>> limited time.
>>
>> Agree.
>> But experience showed that this synchronization is not as easy as it sounds,
>> whoever changing the interface/library says other PMDs should reflect the
>> change but most of the times other PMD maintainers not aware of it or if
>> they do they have other priorities for the release, so the changes should be
>> in a way to give more time to PMDs to adapt it and during this time library
>> change shouldn't break other PMDs.
>>
> 
> Yes.
> 
>>> My suggestion here:
>>> 1. To reserve the info field and the configuration field for rc2.(if
>>> it is critical not to break ABI for rc3) 2. To merge the ethdev patch in the
>> start of rc3.
>>> 3. Request each relevant PMD to adjust its PMD to the new configuration
>> for the end of rc3.
>>> 	Note: this should be small change and only for ~5 PMDs:
>>> 		a. Introduce the info field according to the device ability.
>>> 		b. For each LRO queue:
>>> 			Use the LRO max size configuration instead of the
>> current max rx pkt len configuration(looks like small condition).
>>>
>>> What do you think?
>>
>> There is already a v6 which only updates dev_info fields to have the
>> 'max_lro_pktlen' field, the PMD updates there also looks safe, so I think we
>> can go with it for rc2.
>>
> 
> Doesn’t make sense to expose the info field without the configuration.
> 
> 
>> For the configuration part, I suggest deferring it next release, which gives
>> more time for discussion and enough time for other PMDs to implement it.
>>
>>
>> And related configuration, right now devices already configured to limit the
>> packet size to 'max_rx_pkt_len', it can be an optimization to increase it to
>> 'max_lro_pkt_len' for the queues LRO is supported, why not make this
>> configuration more explicitly with specific API as Konstantin suggested [1],
>> this way it only affects the applications that are interested in and the PMDs
>> that want to support this.
>> Current implementation is under 'rte_eth_dev_configure()' which is used by
>> all DPDK applications and impact of changing it is much larger, also it makes
>> mandatory for applications to provide this config option when LRO enabled,
>> explicit API gives same result without making a mandatory config option.
>>
>> [1]
>> int rte_eth_dev_set_max_lro(uint16_t port_id, uint32_t lro);
> 
> Please see my answers to Konstantin regarding this topic.
> 
> 
> 
> One more option:
> In order to not break PMDs because of this feature:
> 0 in the capability field means, The PMD doesn't support LRO special limitation so if the application configuration is not the same like max_rx_pkt_len the validation will fail.
> 

I don't see this is a mandatory field if the LRO is enabled, am I missing
something? And current implementation does so by failing configure(), the affect
to the applications is my first concern.
Second is when application supplied the proper values but PMD is not doing
anything without letting application anything done.

That is why I think explicit API makes this clear and only required by
application wants to use it.

Similar can be done with following, this also doesn't require both application
and PMD changes, wdyt?

ethdev, configure():
if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
  if (dev_conf->rxmode.max_lro_pktlen) {
    if (dev_info.max_lro_pktlen) {
	validate(rxmode.max_lro_pktlen, dev_info.max_lro_pktlen)
    } else if (dev_info.max_rx_pktlen)
        validate(rxmode.max_lro_pktlen, dev_info.max_rx_pktlen)
    }
  }
}


in PMD:
if (LRO) {
	queue.max_pktlen = rxmode.max_lro_pktlen ?
		rxmode.max_lro_pktlen :
		rxmode.max_tx_pktlen;
}

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v11 3/3] doc: updates to versioning guide for abi versions
  2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
  2019-11-11 11:57 18%   ` [dpdk-dev] [PATCH v11 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
  2019-11-11 11:57 23%   ` [dpdk-dev] [PATCH v11 2/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-11 11:57 35%   ` Ray Kinsella
  2019-11-12  7:55  5%   ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Thomas Monjalon
  3 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 11:57 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Updates to the ABI versioning guide, to account for the changes to the DPDK
ABI/API policy. Fixes for references to abi versioning and policy guides.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/contributing/abi_policy.rst     |  15 +-
 doc/guides/contributing/abi_versioning.rst | 250 +++++++++++++++++++----------
 doc/guides/contributing/patches.rst        |   6 +-
 doc/guides/rel_notes/deprecation.rst       |   6 +-
 4 files changed, 183 insertions(+), 94 deletions(-)

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index 81b617c..05ca959 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -19,11 +19,11 @@ General Guidelines
 #. Major ABI versions are usually but not always declared aligned with a
    :ref:`LTS release <stable_lts_releases>`.
 #. The ABI version is managed at a project level in DPDK, and is reflected in
-   all non-experimental library's soname. 
+   all non-experimental :ref:`library's soname <what_is_soname>`.
 #. The ABI should be preserved and not changed lightly. ABI changes must follow
    the outlined :ref:`deprecation process <abi_changes>`.
 #. The addition of symbols is generally not problematic. The modification of
-   symbols is managed with ABI Versioning.
+   symbols is managed with :ref:`ABI Versioning <abi_versioning>`.
 #. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
    once approved these will form part of the next ABI version.
 #. Libraries or APIs marked as :ref:`experimental <experimental_apis>` may
@@ -68,13 +68,14 @@ An ABI version is an instance of a library's ABI at a specific release. Certain
 releases are considered to be milestone releases, the yearly LTS release for
 example. The ABI of a milestone release may be declared as a 'major ABI
 version', where this ABI version is then supported for some number of subsequent
-releases and is annotated in the library's soname.
+releases and is annotated in the library's :ref:`soname<what_is_soname>`.
 
 ABI version support in subsequent releases facilitates application upgrades, by
 enabling applications built against the milestone release to upgrade to
 subsequent releases of a library without a rebuild.
 
-More details on major ABI version can be found in the ABI Versioning guide.
+More details on major ABI version can be found in the :ref:`ABI versioning
+<major_abi_versions>` guide.
 
 The DPDK ABI policy
 -------------------
@@ -147,7 +148,7 @@ The requirements for changing the ABI are:
      CPU vendors, end-users, etc.
 
 #. Backward compatibility with the major ABI version must be maintained through
-   ABI Versioning, with :ref:`forward-only <forward-only>` compatibility
+   :ref:`abi_versioning`, with :ref:`forward-only <forward-only>` compatibility
    offered for any ABI changes that are indicated to be part of the next ABI
    version.
 
@@ -224,7 +225,7 @@ declarations of major ABI versions.
 
 * DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
   this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
-  preserved through ABI Versioning.
+  preserved through :ref:`abi_versioning`.
 
   - The new function may be marked with the ``__rte_experimental`` tag for a
     number of releases, as described in the section :ref:`experimental_apis`.
@@ -322,5 +323,5 @@ Libraries
 Libraries marked as ``experimental`` are entirely not considered part of an ABI
 version, and may change without warning at any time. Experimental libraries
 always have a major version of ``0`` to indicate they exist outside of
-ABI Versioning, with the minor version incremented with each ABI change
+:ref:`abi_versioning` , with the minor version incremented with each ABI change
 to library.
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
index d278de4..050c971 100644
--- a/doc/guides/contributing/abi_versioning.rst
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -1,44 +1,134 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2018 The DPDK contributors
 
-.. library_versioning:
+.. _abi_versioning:
 
-Library versioning
+ABI Versioning
+==============
+
+This document details the mechanics of ABI version management in DPDK.
+
+.. _what_is_soname:
+
+What is a library's soname?
+---------------------------
+
+System libraries usually adopt the familiar major and minor version naming
+convention, where major versions (e.g. ``librte_eal 20.x, 21.x``) are presumed
+to be ABI incompatible with each other and minor versions (e.g. ``librte_eal
+20.1, 20.2``) are presumed to be ABI compatible. A library's `soname
+<https://en.wikipedia.org/wiki/Soname>`_. is typically used to provide backward
+compatibility information about a given library, describing the lowest common
+denominator ABI supported by the library. The soname or logical name for the
+library, is typically comprised of the library's name and major version e.g.
+``librte_eal.so.20``.
+
+During an application's build process, a library's soname is noted as a runtime
+dependency of the application. This information is then used by the `dynamic
+linker <https://en.wikipedia.org/wiki/Dynamic_linker>`_ when resolving the
+applications dependencies at runtime, to load a library supporting the correct
+ABI version. The library loaded at runtime therefore, may be a minor revision
+supporting the same major ABI version (e.g. ``librte_eal.20.2``), as the library
+used to link the application (e.g ``librte_eal.20.0``).
+
+.. _major_abi_versions:
+
+Major ABI versions
 ------------------
 
-Downstreams might want to provide different DPDK releases at the same time to
-support multiple consumers of DPDK linked against older and newer sonames.
+An ABI version change to a given library, especially in core libraries such as
+``librte_mbuf``, may cause an implicit ripple effect on the ABI of it's
+consuming libraries, causing ABI breakages. There may however be no explicit
+reason to bump a dependent library's ABI version, as there may have been no
+obvious change to the dependent library's API, even though the library's ABI
+compatibility will have been broken.
+
+This interdependence of DPDK libraries, means that ABI versioning of libraries
+is more manageable at a project level, with all project libraries sharing a
+**single ABI version**. In addition, the need to maintain a stable ABI for some
+number of releases as described in the section :doc:`abi_policy`, means
+that ABI version increments need to carefully planned and managed at a project
+level.
+
+Major ABI versions are therefore declared typically aligned with an LTS release
+and is then supported some number of subsequent releases, shared across all
+libraries. This means that a single project level ABI version, reflected in all
+individual library's soname, library filenames and associated version maps
+persists over multiple releases.
+
+.. code-block:: none
+
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_20 {
+        global:
+ ...
 
-Also due to the interdependencies that DPDK libraries can have applications
-might end up with an executable space in which multiple versions of a library
-are mapped by ld.so.
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_20 {
+        global:
+ ...
 
-Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
-depending on LibA.
+When an ABI change is made between major ABI versions to a given library, a new
+section is added to that library's version map describing the impending new ABI
+version, as described in the section :ref:`example_abi_macro_usage`. The
+library's soname and filename however do not change, e.g. ``libacl.so.20``, as
+ABI compatibility with the last major ABI version continues to be preserved for
+that library.
 
-.. note::
+.. code-block:: none
 
-    Application
-    \-> LibA.old
-    \-> LibB.new -> LibA.new
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_20 {
+        global:
+ ...
 
-That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
-If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
-library - versions defined in the libraries ``LIBABIVER``.
-An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
-``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
+ DPDK_21 {
+        global:
+
+ } DPDK_20;
+ ...
 
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_20 {
+        global:
+ ...
+
+However when a new ABI version is declared, for example DPDK ``21``, old
+depreciated functions may be safely removed at this point and the entire old
+major ABI version removed, see the section :ref:`deprecating_entire_abi` on
+how this may be done.
+
+.. code-block:: none
+
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_21 {
+        global:
+ ...
+
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_21 {
+        global:
+ ...
+
+At the same time, the major ABI version is changed atomically across all
+libraries by incrementing the major version in individual library's soname, e.g.
+``libacl.so.21``. This is done by bumping the LIBABIVER number in the libraries
+Makefile to indicate to dynamic linking applications that this is a later, and
+possibly incompatible library version:
+
+.. code-block:: c
+
+   -LIBABIVER := 20
+   +LIBABIVER := 21
 
-ABI versioning
---------------
 
 Versioning Macros
-~~~~~~~~~~~~~~~~~
+-----------------
 
 When a symbol is exported from a library to provide an API, it also provides a
 calling convention (ABI) that is embodied in its name, return type and
 arguments. Occasionally that function may need to change to accommodate new
-functionality or behavior. When that occurs, it is desirable to allow for
+functionality or behavior. When that occurs, it is may be required to allow for
 backward compatibility for a time with older binaries that are dynamically
 linked to the DPDK.
 
@@ -65,8 +155,10 @@ The macros exported are:
   ``be`` to signal that it is being used as an implementation of a particular
   version of symbol ``b``.
 
+.. _example_abi_macro_usage:
+
 Examples of ABI Macro use
-^^^^^^^^^^^^^^^^^^^^^^^^^
+~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Updating a public API
 _____________________
@@ -110,16 +202,16 @@ maintain previous ABI versions that are accessible only to previously compiled
 binaries
 
 The addition of a parameter to the function is ABI breaking as the function is
-public, and existing application may use it in its current form.  However, the
+public, and existing application may use it in its current form. However, the
 compatibility macros in DPDK allow a developer to use symbol versioning so that
 multiple functions can be mapped to the same public symbol based on when an
-application was linked to it.  To see how this is done, we start with the
-requisite libraries version map file.  Initially the version map file for the
-acl library looks like this
+application was linked to it. To see how this is done, we start with the
+requisite libraries version map file. Initially the version map file for the acl
+library looks like this
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -145,7 +237,7 @@ This file needs to be modified as follows
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -167,16 +259,16 @@ This file needs to be modified as follows
         local: *;
    };
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
         rte_acl_create;
 
-   } DPDK_2.0;
+   } DPDK_20;
 
 The addition of the new block tells the linker that a new version node is
-available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
-symbols from the DPDK_2.0 node.  This list is directly translated into a list of
-exported symbols when DPDK is compiled as a shared library
+available (DPDK_21), which contains the symbol rte_acl_create, and inherits
+the symbols from the DPDK_20 node. This list is directly translated into a
+list of exported symbols when DPDK is compiled as a shared library
 
 Next, we need to specify in the code which function map to the rte_acl_create
 symbol at which versions.  First, at the site of the initial symbol definition,
@@ -197,22 +289,22 @@ with the public symbol name
 Note that the base name of the symbol was kept intact, as this is conducive to
 the macros used for versioning symbols and we have annotated the function as an
 implementation of versioned symbol.  That is our next step, mapping this new
-symbol name to the initial symbol name at version node 2.0.  Immediately after
+symbol name to the initial symbol name at version node 20.  Immediately after
 the function, we add this line of code
 
 .. code-block:: c
 
-   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+   VERSION_SYMBOL(rte_acl_create, _v20, 20);
 
-Remembering to also add the rte_function_versioning.h header to the requisite c file where
-these changes are being made.  The above macro instructs the linker to create a
-new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
-builds, but now points to the above newly named function.  We have now mapped
-the original rte_acl_create symbol to the original function (but with a new
-name)
+Remembering to also add the rte_function_versioning.h header to the requisite c
+file where these changes are being made. The above macro instructs the linker to
+create a new symbol ``rte_acl_create@DPDK_20``, which matches the symbol created
+in older builds, but now points to the above newly named function. We have now
+mapped the original rte_acl_create symbol to the original function (but with a
+new name).
 
-Next, we need to create the 2.1 version of the symbol.  We create a new function
-name, with a different suffix, and  implement it appropriately
+Next, we need to create the 21 version of the symbol. We create a new function
+name, with a different suffix, and implement it appropriately
 
 .. code-block:: c
 
@@ -226,12 +318,12 @@ name, with a different suffix, and  implement it appropriately
         return ctx;
    }
 
-This code serves as our new API call.  Its the same as our old call, but adds
-the new parameter in place.  Next we need to map this function to the symbol
-``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
-in the header file, adding the macro there to inform all including applications,
-that on re-link, the default rte_acl_create symbol should point to this
-function.  Note that we could do this by simply naming the function above
+This code serves as our new API call. Its the same as our old call, but adds the
+new parameter in place. Next we need to map this function to the symbol
+``rte_acl_create@DPDK_21``. To do this, we modify the public prototype of the
+call in the header file, adding the macro there to inform all including
+applications, that on re-link, the default rte_acl_create symbol should point to
+this function. Note that we could do this by simply naming the function above
 rte_acl_create, and the linker would chose the most recent version tag to apply
 in the version script, but we can also do this in the header file
 
@@ -239,11 +331,11 @@ in the version script, but we can also do this in the header file
 
    struct rte_acl_ctx *
    -rte_acl_create(const struct rte_acl_param *param);
-   +rte_acl_create(const struct rte_acl_param *param, int debug);
-   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+   +rte_acl_create_v21(const struct rte_acl_param *param, int debug);
+   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 21);
 
 The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
-header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
+header, to link to the rte_acl_create_v21 function and apply the DPDK_21
 version node to it.  This method is more explicit and flexible than just
 re-implementing the exact symbol name, and allows for other features (such as
 linking to the old symbol version by default, when the new ABI is to be opt-in
@@ -263,6 +355,7 @@ assumption is that the most recent version of the symbol is the one you want to
 map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
 defined, we add this
 
+
 .. code-block:: c
 
    struct rte_acl_ctx * __vsym
@@ -276,21 +369,22 @@ That tells the compiler that, when building a static library, any calls to the
 symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
 
 That's it, on the next shared library rebuild, there will be two versions of
-rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
-and a new DPDK_2.1 version, used by future built applications.
+rte_acl_create, an old DPDK_20 version, used by previously built applications,
+and a new DPDK_21 version, used by future built applications.
 
 
 Deprecating part of a public API
 ________________________________
 
-Lets assume that you've done the above update, and after a few releases have
-passed you decide you would like to retire the old version of the function.
-After having gone through the ABI deprecation announcement process, removal is
-easy.  Start by removing the symbol from the requisite version map file:
+Lets assume that you've done the above update, and in preparation for the next
+major ABI version you decide you would like to retire the old version of the
+function. After having gone through the ABI deprecation announcement process,
+removal is easy. Start by removing the symbol from the requisite version map
+file:
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -312,48 +406,42 @@ easy.  Start by removing the symbol from the requisite version map file:
         local: *;
    };
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
         rte_acl_create;
-   } DPDK_2.0;
+   } DPDK_20;
 
 
 Next remove the corresponding versioned export.
 
 .. code-block:: c
 
- -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+ -VERSION_SYMBOL(rte_acl_create, _v20, 20);
 
 
 Note that the internal function definition could also be removed, but its used
-in our example by the newer version _v21, so we leave it in place.  This is a
-coding style choice.
-
-Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
-indicate to applications doing dynamic linking that this is a later, and
-possibly incompatible library version:
-
-.. code-block:: c
+in our example by the newer version v21, so we leave it in place and declare it
+as static. This is a coding style choice.
 
-   -LIBABIVER := 1
-   +LIBABIVER := 2
+.. _deprecating_entire_abi:
 
 Deprecating an entire ABI version
 _________________________________
 
-While removing a symbol from and ABI may be useful, it is often more practical
-to remove an entire version node at once.  If a version node completely
-specifies an API, then removing part of it, typically makes it incomplete.  In
-those cases it is better to remove the entire node
+While removing a symbol from an ABI may be useful, it is more practical to
+remove an entire version node at once, as is typically done at the declaration
+of a major ABI version. If a version node completely specifies an API, then
+removing part of it, typically makes it incomplete. In those cases it is better
+to remove the entire node.
 
 To do this, start by modifying the version map file, such that all symbols from
-the node to be removed are merged into the next node in the map
+the node to be removed are merged into the next node in the map.
 
 In the case of our map above, it would transform to look as follows
 
 .. code-block:: none
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
 
         rte_acl_add_rules;
@@ -381,8 +469,8 @@ symbols.
 
 .. code-block:: c
 
- -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
- +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+ -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 20);
+ +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 21);
 
 Lastly, any VERSION_SYMBOL macros that point to the old version node should be
 removed, taking care to keep, where need old code in place to support newer
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index c9ec529..2140303 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -156,9 +156,9 @@ Make your planned changes in the cloned ``dpdk`` repo. Here are some guidelines
 
   * For other PMDs and more info, refer to the ``MAINTAINERS`` file.
 
-* New external functions should be added to the local ``version.map`` file.
-  See the :doc:`Guidelines for ABI policy and versioning </contributing/abi_versioning>`.
-  New external functions should also be added in alphabetical order.
+* New external functions should be added to the local ``version.map`` file. See
+  the :doc:`ABI policy <abi_policy>` and :ref:`ABI versioning <abi_versioning>`
+  guides. New external functions should also be added in alphabetical order.
 
 * Important changes will require an addition to the release notes in ``doc/guides/rel_notes/``.
   See the :ref:`Release Notes section of the Documentation Guidelines <doc_guidelines>` for details.
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3de702a..bd0e204 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,9 +4,9 @@
 ABI and API Deprecation
 =======================
 
-See the :doc:`guidelines document for details of the ABI policy </contributing/abi_versioning>`.
-API and ABI deprecation notices are to be posted here.
-
+See the guidelines document for details of the :doc:`ABI policy
+<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
+here.
 
 Deprecation Notices
 -------------------
-- 
2.7.4


^ permalink raw reply	[relevance 35%]

* [dpdk-dev] [PATCH v11 2/3] doc: changes to abi policy introducing major abi versions
  2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
  2019-11-11 11:57 18%   ` [dpdk-dev] [PATCH v11 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
@ 2019-11-11 11:57 23%   ` Ray Kinsella
  2019-11-11 11:57 35%   ` [dpdk-dev] [PATCH v11 3/3] doc: updates to versioning guide for " Ray Kinsella
  2019-11-12  7:55  5%   ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Thomas Monjalon
  3 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 11:57 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

This policy change introduces major ABI versions, these are
declared every year, typically aligned with the LTS release
and are supported by subsequent releases in the following year.
This change is intended to improve ABI stabilty for those projects
consuming DPDK.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/contributing/abi_policy.rst             |  325 ++++--
 .../contributing/img/abi_stability_policy.svg      | 1059 ++++++++++++++++++++
 doc/guides/contributing/img/what_is_an_abi.svg     |  382 +++++++
 doc/guides/contributing/stable.rst                 |   12 +-
 4 files changed, 1687 insertions(+), 91 deletions(-)
 create mode 100644 doc/guides/contributing/img/abi_stability_policy.svg
 create mode 100644 doc/guides/contributing/img/what_is_an_abi.svg

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index d4f4e9f..81b617c 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -1,31 +1,48 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright 2018 The DPDK contributors
+    Copyright 2019 The DPDK contributors
 
-DPDK ABI/API policy
-===================
+ABI Policy
+==========
 
 Description
 -----------
 
-This document details some methods for handling ABI management in the DPDK.
+This document details the management policy that ensures the long-term stability
+of the DPDK ABI and API.
 
 General Guidelines
 ------------------
 
-#. Whenever possible, ABI should be preserved
-#. ABI/API may be changed with a deprecation process
-#. The modification of symbols can generally be managed with versioning
-#. Libraries or APIs marked in ``experimental`` state may change without constraint
-#. New APIs will be marked as ``experimental`` for at least one release to allow
-   any issues found by users of the new API to be fixed quickly
-#. The addition of symbols is generally not problematic
-#. The removal of symbols generally is an ABI break and requires bumping of the
-   LIBABIVER macro
-#. Updates to the minimum hardware requirements, which drop support for hardware which
-   was previously supported, should be treated as an ABI change.
-
-What is an ABI
-~~~~~~~~~~~~~~
+#. Major ABI versions are declared no more frequently than yearly. Compatibility
+   with the major ABI version is mandatory in subsequent releases until a new
+   major ABI version is declared.
+#. Major ABI versions are usually but not always declared aligned with a
+   :ref:`LTS release <stable_lts_releases>`.
+#. The ABI version is managed at a project level in DPDK, and is reflected in
+   all non-experimental library's soname. 
+#. The ABI should be preserved and not changed lightly. ABI changes must follow
+   the outlined :ref:`deprecation process <abi_changes>`.
+#. The addition of symbols is generally not problematic. The modification of
+   symbols is managed with ABI Versioning.
+#. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
+   once approved these will form part of the next ABI version.
+#. Libraries or APIs marked as :ref:`experimental <experimental_apis>` may
+   change without constraint, as they are not considered part of an ABI version.
+   Experimental libraries have the major ABI version ``0``.
+#. Updates to the :ref:`minimum hardware requirements <hw_rqmts>`, which drop
+   support for hardware which was previously supported, should be treated as an
+   ABI change.
+
+.. note::
+
+   In 2019, the DPDK community stated its intention to move to ABI stable
+   releases, over a number of release cycles. This change begins with
+   maintaining ABI stability through one year of DPDK releases starting from
+   DPDK 19.11. This policy will be reviewed in 2020, with intention of
+   lengthening the stability period.
+
+What is an ABI?
+~~~~~~~~~~~~~~~
 
 An ABI (Application Binary Interface) is the set of runtime interfaces exposed
 by a library. It is similar to an API (Application Programming Interface) but
@@ -37,30 +54,82 @@ Therefore, in the case of dynamic linking, it is critical that an ABI is
 preserved, or (when modified), done in such a way that the application is unable
 to behave improperly or in an unexpected fashion.
 
+.. _figure_what_is_an_abi:
+
+.. figure:: img/what_is_an_abi.*
+
+	    Illustration of DPDK API and ABI.
 
-ABI/API Deprecation
--------------------
+
+What is an ABI version?
+~~~~~~~~~~~~~~~~~~~~~~~
+
+An ABI version is an instance of a library's ABI at a specific release. Certain
+releases are considered to be milestone releases, the yearly LTS release for
+example. The ABI of a milestone release may be declared as a 'major ABI
+version', where this ABI version is then supported for some number of subsequent
+releases and is annotated in the library's soname.
+
+ABI version support in subsequent releases facilitates application upgrades, by
+enabling applications built against the milestone release to upgrade to
+subsequent releases of a library without a rebuild.
+
+More details on major ABI version can be found in the ABI Versioning guide.
 
 The DPDK ABI policy
-~~~~~~~~~~~~~~~~~~~
+-------------------
+
+A new major ABI version is declared no more frequently than yearly, with
+declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
+Compatibility with the major ABI version is then mandatory in subsequent
+releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
+20.11.
 
-ABI versions are set at the time of major release labeling, and the ABI may
-change multiple times, without warning, between the last release label and the
-HEAD label of the git tree.
+At the declaration of a major ABI version, major version numbers encoded in
+libraries' sonames are bumped to indicate the new version, with the minor
+version reset to ``0``. An example would be ``librte_eal.so.20.3`` would become
+``librte_eal.so.21.0``.
 
-ABI versions, once released, are available until such time as their
-deprecation has been noted in the Release Notes for at least one major release
-cycle. For example consider the case where the ABI for DPDK 2.0 has been
-shipped and then a decision is made to modify it during the development of
-DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
-release and the modification will be made available in the DPDK 2.2 release.
+The ABI may then change multiple times, without warning, between the last major
+ABI version increment and the HEAD label of the git tree, with the condition
+that ABI compatibility with the major ABI version is preserved and therefore
+sonames do not change.
 
-ABI versions may be deprecated in whole or in part as needed by a given
-update.
+Minor versions are incremented to indicate the release of a new ABI compatible
+DPDK release, typically the DPDK quarterly releases. An example of this, might
+be that ``librte_eal.so.20.1`` would indicate the first ABI compatible DPDK
+release, following the declaration of the new major ABI version ``20``.
 
-Some ABI changes may be too significant to reasonably maintain multiple
-versions. In those cases ABI's may be updated without backward compatibility
-being provided. The requirements for doing so are:
+An ABI version is supported in all new releases until the next major ABI version
+is declared. When changing the major ABI version, the release notes will detail
+all ABI changes.
+
+.. _figure_abi_stability_policy:
+
+.. figure:: img/abi_stability_policy.*
+
+	    Mapping of new ABI versions and ABI version compatibility to DPDK
+	    releases.
+
+.. _abi_changes:
+
+ABI Changes
+~~~~~~~~~~~
+
+The ABI may still change after the declaration of a major ABI version, that is
+new APIs may be still added or existing APIs may be modified.
+
+.. Warning::
+
+   Note that, this policy details the method by which the ABI may be changed,
+   with due regard to preserving compatibility and observing deprecation
+   notices. This process however should not be undertaken lightly, as a general
+   rule ABI stability is extremely important for downstream consumers of DPDK.
+   The API should only be changed for significant reasons, such as performance
+   enhancements. API breakages due to changes such as reorganizing public
+   structure fields for aesthetic or readability purposes should be avoided.
+
+The requirements for changing the ABI are:
 
 #. At least 3 acknowledgments of the need to do so must be made on the
    dpdk.org mailing list.
@@ -69,34 +138,119 @@ being provided. The requirements for doing so are:
      no maintainer is available for the component, the tree/sub-tree maintainer
      for that component must acknowledge the ABI change instead.
 
+   - The acknowledgment of three members of the technical board, as delegates
+     of the `technical board <https://core.dpdk.org/techboard/>`_ acknowledging
+     the need for the ABI change, is also mandatory.
+
    - It is also recommended that acknowledgments from different "areas of
      interest" be sought for each deprecation, for example: from NIC vendors,
      CPU vendors, end-users, etc.
 
-#. The changes (including an alternative map file) can be included with
-   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
-   to provide more details about oncoming changes.
-   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
-   More preferred way to provide this information is sending the feature
-   as a separate patch and reference it in deprecation notice.
+#. Backward compatibility with the major ABI version must be maintained through
+   ABI Versioning, with :ref:`forward-only <forward-only>` compatibility
+   offered for any ABI changes that are indicated to be part of the next ABI
+   version.
 
-#. A full deprecation cycle, as explained above, must be made to offer
-   downstream consumers sufficient warning of the change.
+   - In situations where backward compatibility is not possible, read the
+     section on :ref:`abi_breakages`.
 
-Note that the above process for ABI deprecation should not be undertaken
-lightly. ABI stability is extremely important for downstream consumers of the
-DPDK, especially when distributed in shared object form. Every effort should
-be made to preserve the ABI whenever possible. The ABI should only be changed
-for significant reasons, such as performance enhancements. ABI breakage due to
-changes such as reorganizing public structure fields for aesthetic or
-readability purposes should be avoided.
+   - No backward or forward compatibility is offered for API changes marked as
+     ``experimental``, as described in the section on :ref:`Experimental APIs
+     and Libraries <experimental_apis>`.
 
-.. note::
+#. If a newly proposed API functionally replaces an existing one, when the new
+   API becomes non-experimental, then the old one is marked with
+   ``__rte_deprecated``.
+
+    - The depreciated API should follow the notification process to be removed,
+      see  :ref:`deprecation_notices`.
+
+    - At the declaration of the next major ABI version, those ABI changes then
+      become a formal part of the new ABI and the requirement to preserve ABI
+      compatibility with the last major ABI version is then dropped.
+
+    - The responsibility for removing redundant ABI compatibility code rests
+      with the original contributor of the ABI changes, failing that, then with
+      the contributor's company and then finally with the maintainer.
+
+.. _forward-only:
+
+.. Note::
+
+   Note that forward-only compatibility is offered for those changes made
+   between major ABI versions. As a library's soname can only describe
+   compatibility with the last major ABI version, until the next major ABI
+   version is declared, these changes therefore cannot be resolved as a runtime
+   dependency through the soname. Therefore any application wishing to make use
+   of these ABI changes can only ensure that its runtime dependencies are met
+   through Operating System package versioning.
+
+.. _hw_rqmts:
+
+.. Note::
 
    Updates to the minimum hardware requirements, which drop support for hardware
    which was previously supported, should be treated as an ABI change, and
-   follow the relevant deprecation policy procedures as above: 3 acks and
-   announcement at least one release in advance.
+   follow the relevant deprecation policy procedures as above: 3 acks, technical
+   board approval and announcement at least one release in advance.
+
+.. _abi_breakages:
+
+ABI Breakages
+~~~~~~~~~~~~~
+
+For those ABI changes that are too significant to reasonably maintain multiple
+symbol versions, there is an amended process. In these cases, ABIs may be
+updated without the requirement of backward compatibility being provided. These
+changes must follow the same process :ref:`described above <abi_changes>` as non-breaking
+changes, however with the following additional requirements:
+
+#. ABI breaking changes (including an alternative map file) can be included with
+   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option, to provide
+   more details about oncoming changes. ``RTE_NEXT_ABI`` wrapper will be removed
+   at the declaration of the next major ABI version.
+
+#. Once approved, and after the deprecation notice has been observed these
+   changes will form part of the next declared major ABI version.
+
+Examples of ABI Changes
+~~~~~~~~~~~~~~~~~~~~~~~
+
+The following are examples of allowable ABI changes occurring between
+declarations of major ABI versions.
+
+* DPDK 19.11 release, defines the function ``rte_foo()``, and ``rte_foo()``
+  as part of the major ABI version ``20``.
+
+* DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
+  this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
+  preserved through ABI Versioning.
+
+  - The new function may be marked with the ``__rte_experimental`` tag for a
+    number of releases, as described in the section :ref:`experimental_apis`.
+
+  - Once ``rte_foo(uint8_t bar)`` becomes non-experimental ``rte_foo()`` is then
+    declared as ``__rte_depreciated``, with an associated deprecation notice
+    provided.
+
+* DPDK 19.11 is not re-released to include ``rte_foo(uint8_t bar)``, the new
+  version of ``rte_foo`` only exists from DPDK 20.02 onwards as described in the
+  :ref:`note on forward-only compatibility<forward-only>`.
+
+* DPDK 20.02 release defines the experimental function ``__rte_experimental
+  rte_baz()``. This function may or may not exist in the DPDK 20.05 release.
+
+* An application ``dPacket`` wishes to use ``rte_foo(uint8_t bar)``, before the
+  declaration of the DPDK ``21`` major API version. The application can only
+  ensure its runtime dependencies are met by specifying ``DPDK (>= 20.2)`` as
+  an explicit package dependency, as the soname only may only indicate the
+  supported major ABI version.
+
+* At the release of DPDK 20.11, the function ``rte_foo(uint8_t bar)`` becomes
+  formally part of then new major ABI version DPDK 21.0 and ``rte_foo()`` may be
+  removed.
+
+.. _deprecation_notices:
 
 Examples of Deprecation Notices
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -104,46 +258,42 @@ Examples of Deprecation Notices
 The following are some examples of ABI deprecation notices which would be
 added to the Release Notes:
 
-* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
-  to be replaced with the inline function ``rte_foo()``.
+* The Macro ``#RTE_FOO`` is deprecated and will be removed with ABI version
+  21, to be replaced with the inline function ``rte_foo()``.
 
 * The function ``rte_mbuf_grok()`` has been updated to include a new parameter
-  in version 2.0. Backwards compatibility will be maintained for this function
-  until the release of version 2.1
+  in version 20.2. Backwards compatibility will be maintained for this function
+  until the release of the new DPDK major ABI version 21, in DPDK version
+  20.11.
 
-* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
+* The members of ``struct rte_foo`` have been reorganized in DPDK 20.02 for
   performance reasons. Existing binary applications will have backwards
-  compatibility in release 2.0, while newly built binaries will need to
-  reference the new structure variant ``struct rte_foo2``. Compatibility will
-  be removed in release 2.2, and all applications will require updating and
+  compatibility in release 20.02, while newly built binaries will need to
+  reference the new structure variant ``struct rte_foo2``. Compatibility will be
+  removed in release 20.11, and all applications will require updating and
   rebuilding to the new structure at that time, which will be renamed to the
   original ``struct rte_foo``.
 
 * Significant ABI changes are planned for the ``librte_dostuff`` library. The
-  upcoming release 2.0 will not contain these changes, but release 2.1 will,
+  upcoming release 20.02 will not contain these changes, but release 20.11 will,
   and no backwards compatibility is planned due to the extensive nature of
-  these changes. Binaries using this library built prior to version 2.1 will
+  these changes. Binaries using this library built prior to ABI version 21 will
   require updating and recompilation.
 
-New API replacing previous one
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If a new API proposed functionally replaces an existing one, when the new API
-becomes non-experimental then the old one is marked with ``__rte_deprecated``.
-Deprecated APIs are removed completely just after the next LTS.
+.. _experimental_apis:
 
-Reminder that old API should follow deprecation process to be removed.
+Experimental
+------------
 
+APIs
+~~~~
 
-Experimental APIs
------------------
-
-APIs marked as ``experimental`` are not considered part of the ABI and may
-change without warning at any time.  Since changes to APIs are most likely
-immediately after their introduction, as users begin to take advantage of
-those new APIs and start finding issues with them, new DPDK APIs will be
-automatically marked as ``experimental`` to allow for a period of stabilization
-before they become part of a tracked ABI.
+APIs marked as ``experimental`` are not considered part of an ABI version and
+may change without warning at any time. Since changes to APIs are most likely
+immediately after their introduction, as users begin to take advantage of those
+new APIs and start finding issues with them, new DPDK APIs will be automatically
+marked as ``experimental`` to allow for a period of stabilization before they
+become part of a tracked ABI version.
 
 Note that marking an API as experimental is a multi step process.
 To mark an API as experimental, the symbols which are desired to be exported
@@ -161,7 +311,16 @@ In addition to tagging the code with ``__rte_experimental``,
 the doxygen markup must also contain the EXPERIMENTAL string,
 and the MAINTAINERS file should note the EXPERIMENTAL libraries.
 
-For removing the experimental tag associated with an API, deprecation notice
-is not required. Though, an API should remain in experimental state for at least
-one release. Thereafter, normal process of posting patch for review to mailing
-list can be followed.
+For removing the experimental tag associated with an API, deprecation notice is
+not required. Though, an API should remain in experimental state for at least
+one release. Thereafter, the normal process of posting patch for review to
+mailing list can be followed.
+
+Libraries
+~~~~~~~~~
+
+Libraries marked as ``experimental`` are entirely not considered part of an ABI
+version, and may change without warning at any time. Experimental libraries
+always have a major version of ``0`` to indicate they exist outside of
+ABI Versioning, with the minor version incremented with each ABI change
+to library.
diff --git a/doc/guides/contributing/img/abi_stability_policy.svg b/doc/guides/contributing/img/abi_stability_policy.svg
new file mode 100644
index 0000000..4fd4007
--- /dev/null
+++ b/doc/guides/contributing/img/abi_stability_policy.svg
@@ -0,0 +1,1059 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1237.4869"
+   height="481.37463"
+   version="1.1"
+   viewBox="0 0 1237.4869 481.37463"
+   xml:space="preserve"
+   id="svg7800"
+   sodipodi:docname="abi_stability_policy.svg"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
+     id="metadata7804"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview7802"
+     showgrid="false"
+     inkscape:zoom="0.8875"
+     inkscape:cx="840.50495"
+     inkscape:cy="179.36692"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg7800" /><defs
+     id="defs7394"><clipPath
+       id="clipPath3975"><path
+         d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
+         id="path7226"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4003"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7229"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4025"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7232"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4037"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7235"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4049"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7238"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4061"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7241"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4073"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7244"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4085"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7247"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4097"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7250"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4109"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7253"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4121"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7256"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4133"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7259"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4145"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7262"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4157"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7265"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4169"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7268"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4181"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7271"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4193"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7274"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4205"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7277"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4217"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7280"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4229"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7283"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4241"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7286"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4253"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7289"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4265"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7292"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4277"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7295"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4289"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7298"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4301"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7301"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4313"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7304"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4327"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7307"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4339"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7310"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4351"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7313"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4363"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7316"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4375"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7319"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4389"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7322"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4403"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7325"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4417"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7328"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4429"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7331"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4441"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7334"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4453"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7337"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4477"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7340"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4489"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7343"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4501"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7346"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4513"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7349"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4525"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7352"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4537"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7355"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4549"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7358"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4561"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7361"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4573"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7364"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4589"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7367"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4601"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7370"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4615"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7373"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4629"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7376"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4641"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7379"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4653"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7382"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4673"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7385"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4685"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7388"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4699"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7391"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath></defs><g
+     id="g7406"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       style="fill:#44546a"
+       inkscape:connector-curvature="0"
+       id="path7400"
+       d="m 161.83,180.57 773.79,4.78 c 0.82,0.01 1.49,0.68 1.49,1.51 -0.01,0.83 -0.68,1.5 -1.51,1.49 l -773.79,-4.78 c -0.83,-0.01 -1.5,-0.68 -1.49,-1.51 0.01,-0.83 0.68,-1.5 1.51,-1.49 z m 772.3,1.77 8.97,4.56 -9.03,4.44 z" /><path
+       style="fill:#00b050;fill-rule:evenodd"
+       inkscape:connector-curvature="0"
+       id="path7402"
+       d="m 173.28,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       style="fill:#00b050;fill-rule:evenodd"
+       inkscape:connector-curvature="0"
+       id="path7404"
+       d="m 612.24,183.78 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /></g><g
+     style="fill:#ff0000;fill-rule:evenodd"
+     id="g7420"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       inkscape:connector-curvature="0"
+       id="path7408"
+       d="m 228.12,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7410"
+       d="m 282.96,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7412"
+       d="m 337.8,182.22 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7414"
+       d="m 447.6,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7416"
+       d="m 502.44,182.34 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7418"
+       d="m 557.28,182.34 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /></g><g
+     id="g7426"
+     clip-path="url(#clipPath4003)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7424"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,152.98,149.45)"><tspan
+         id="tspan7422"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v19.11</tspan></text>
+</g><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7428"
+     d="m 499.42541,379.9105 c 0,-6.22651 4.47989,-11.27972 9.99975,-11.27972 5.51986,0 9.99975,5.05321 9.99975,11.27972 0,6.22651 -4.47989,11.27972 -9.99975,11.27972 -5.51986,0 -9.99975,-5.05321 -9.99975,-11.27972 z" /><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7430"
+     d="m 1084.6908,373.67065 c 0,-6.22651 4.4799,-11.27971 9.9997,-11.27971 5.5199,0 9.9998,5.0532 9.9998,11.27971 0,6.22652 -4.4799,11.27972 -9.9998,11.27972 -5.5198,0 -9.9997,-5.0532 -9.9997,-11.27972 z" /><g
+     style="fill:#ff0000;fill-rule:evenodd"
+     id="g7438"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       inkscape:connector-curvature="0"
+       id="path7432"
+       d="m 667.08,185.4 c 0,4.64 3.36,8.4 7.5,8.4 4.14,0 7.5,-3.76 7.5,-8.4 0,-4.64 -3.36,-8.4 -7.5,-8.4 -4.14,0 -7.5,3.76 -7.5,8.4 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7434"
+       d="m 721.92,185.58 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7436"
+       d="m 776.76,185.58 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /></g><g
+     id="g7444"
+     clip-path="url(#clipPath4025)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7442"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,210.14,150.1)"><tspan
+         id="tspan7440"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.02</tspan></text>
+</g><g
+     id="g7450"
+     clip-path="url(#clipPath4037)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7448"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,265.01,150.1)"><tspan
+         id="tspan7446"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.05</tspan></text>
+</g><g
+     id="g7456"
+     clip-path="url(#clipPath4049)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7454"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,319.9,150.77)"><tspan
+         id="tspan7452"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.08</tspan></text>
+</g><g
+     id="g7462"
+     clip-path="url(#clipPath4061)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7460"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,375,150.94)"><tspan
+         id="tspan7458"
+         y="0"
+         x="0 7.9180322 14.992224 22.066416 25.652737 32.726929">V20.11</tspan></text>
+</g><g
+     id="g7468"
+     clip-path="url(#clipPath4073)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7466"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,429.17,150.94)"><tspan
+         id="tspan7464"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.02</tspan></text>
+</g><g
+     id="g7474"
+     clip-path="url(#clipPath4085)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7472"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,483,150.55)"><tspan
+         id="tspan7470"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v21.05</tspan></text>
+</g><g
+     id="g7480"
+     clip-path="url(#clipPath4097)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7478"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,537.38,150.82)"><tspan
+         id="tspan7476"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.08</tspan></text>
+</g><g
+     id="g7486"
+     clip-path="url(#clipPath4109)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7484"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,592.27,150.82)"><tspan
+         id="tspan7482"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.11</tspan></text>
+</g><g
+     id="g7492"
+     clip-path="url(#clipPath4121)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7490"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,647.14,151.46)"><tspan
+         id="tspan7488"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v22.02</tspan></text>
+</g><g
+     id="g7498"
+     clip-path="url(#clipPath4133)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7496"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,702.24,151.63)"><tspan
+         id="tspan7494"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.05</tspan></text>
+</g><g
+     id="g7504"
+     clip-path="url(#clipPath4145)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7502"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,756.43,151.63)"><tspan
+         id="tspan7500"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.08</tspan></text>
+</g><g
+     id="g7510"
+     clip-path="url(#clipPath4157)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7508"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,811.99,151.63)"><tspan
+         id="tspan7506"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.11</tspan></text>
+</g><g
+     id="g7516"
+     clip-path="url(#clipPath4169)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7514"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,105.82,214.18)"><tspan
+         id="tspan7512"
+         y="0"
+         x="0 6.3460798 13.46436">v20</tspan></text>
+</g><g
+     id="g7522"
+     clip-path="url(#clipPath4181)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7520"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,105.5,247.68)"><tspan
+         id="tspan7518"
+         y="0"
+         x="0 6.3569279 13.445184">v21</tspan></text>
+</g><g
+     id="g7528"
+     clip-path="url(#clipPath4193)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7526"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,228.79,214.51)"><tspan
+         id="tspan7524"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7534"
+     clip-path="url(#clipPath4205)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7532"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,283.8,214.51)"><tspan
+         id="tspan7530"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7540"
+     clip-path="url(#clipPath4217)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7538"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,337.68,214.51)"><tspan
+         id="tspan7536"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7546"
+     clip-path="url(#clipPath4229)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7544"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,611.66,285.79)"><tspan
+         id="tspan7542"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7552"
+     clip-path="url(#clipPath4241)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7550"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,666.65,285.79)"><tspan
+         id="tspan7548"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7558"
+     clip-path="url(#clipPath4253)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7556"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,719.4,285.79)"><tspan
+         id="tspan7554"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7564"
+     clip-path="url(#clipPath4265)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7562"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,775.56,285.79)"><tspan
+         id="tspan7560"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7570"
+     clip-path="url(#clipPath4277)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7568"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,398.54,249.22)"><tspan
+         id="tspan7566"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7576"
+     clip-path="url(#clipPath4289)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7574"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,453.53,249.22)"><tspan
+         id="tspan7572"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7582"
+     clip-path="url(#clipPath4301)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7580"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,507.43,249.22)"><tspan
+         id="tspan7578"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7588"
+     clip-path="url(#clipPath4313)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7586"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,561.05,249.22)"><tspan
+         id="tspan7584"
+         y="0"
+         x="0">√</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7590"
+     d="m 217.67245,474.73479 v -25.14603 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14603 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14608 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7596"
+     clip-path="url(#clipPath4327)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7594"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,170.83,214.51)"><tspan
+         id="tspan7592"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7602"
+     clip-path="url(#clipPath4339)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7600"
+       font-weight="bold"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,23.4,272.33)"><tspan
+         id="tspan7598"
+         y="0"
+         x="0 8.5227842 16.412687 20.167776">ABI </tspan></text>
+</g><g
+     id="g7608"
+     clip-path="url(#clipPath4351)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7606"
+       font-weight="bold"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,46.68,272.33)"><tspan
+         id="tspan7604"
+         y="0"
+         x="0 7.566432 14.640624 19.563025 25.174561 28.662432 36.228863">Version</tspan></text>
+</g><g
+     id="g7614"
+     clip-path="url(#clipPath4363)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7612"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,17.64,255.5)"><tspan
+         id="tspan7610"
+         y="0"
+         x="0 7.4271598 14.98068 26.395201 33.934681 40.80024 45.700199 49.154041 56.7216 60.175442 63.671398 67.125237 72.053284">Compatibility</tspan></text>
+</g><g
+     id="g7620"
+     clip-path="url(#clipPath4375)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7618"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,191.28,116.86)"><tspan
+         id="tspan7616"
+         y="0"
+         x="0 6.3460798 13.46436">v20</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7622"
+     d="m 511.7451,474.89479 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7628"
+     clip-path="url(#clipPath4389)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7626"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,407.06,115.63)"><tspan
+         id="tspan7624"
+         y="0"
+         x="0 6.3460798 13.46436">v21</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7630"
+     d="m 804.53778,476.01476 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7636"
+     clip-path="url(#clipPath4403)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7634"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,626.66,114.74)"><tspan
+         id="tspan7632"
+         y="0"
+         x="0 6.3460798 13.46436">v22</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7638"
+     d="m 1098.2904,479.37468 v -25.14604 c 0,-1.10664 -0.8933,-1.99995 -1.9999,-1.99995 -1.1067,0 -2,0.89331 -2,1.99995 v 25.14604 c 0,1.0933 0.8933,1.99995 2,1.99995 1.1066,0 1.9999,-0.90665 1.9999,-1.99995 z m 3.9999,-23.14609 -5.9998,-11.9997 -5.9999,11.9997 z" /><g
+     id="g7644"
+     clip-path="url(#clipPath4417)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7642"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,846.96,112.22)"><tspan
+         id="tspan7640"
+         y="0"
+         x="0 6.3569279 13.445184">v23</tspan></text>
+</g><g
+     id="g7650"
+     clip-path="url(#clipPath4429)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7648"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,832.87,318.46)"><tspan
+         id="tspan7646"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7656"
+     clip-path="url(#clipPath4441)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7654"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,105.5,285.67)"><tspan
+         id="tspan7652"
+         y="0"
+         x="0 6.3460798 13.46436">v22</tspan></text>
+</g><g
+     id="g7662"
+     clip-path="url(#clipPath4453)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7660"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,104.93,319.87)"><tspan
+         id="tspan7658"
+         y="0"
+         x="0 6.3460798 13.46436">v23</tspan></text>
+</g><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7664"
+     stroke-miterlimit="10"
+     d="m 1104.7569,213.75465 -934.60326,0.39999" /><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7666"
+     stroke-miterlimit="10"
+     d="M 1105.3969,255.35361 170.79362,255.7536" /><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7668"
+     stroke-miterlimit="10"
+     d="M 1105.3969,299.35251 170.79362,299.7525" /><g
+     id="g7674"
+     clip-path="url(#clipPath4477)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#8497b0"
+       id="text7672"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,283.8,251.38)"><tspan
+         id="tspan7670"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7680"
+     clip-path="url(#clipPath4489)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7678"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,339.5,251.95)"><tspan
+         id="tspan7676"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7686"
+     clip-path="url(#clipPath4501)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7684"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,229.8,250.63)"><tspan
+         id="tspan7682"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7692"
+     clip-path="url(#clipPath4513)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7690"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,453.53,286.63)"><tspan
+         id="tspan7688"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7698"
+     clip-path="url(#clipPath4525)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7696"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,507.43,286.63)"><tspan
+         id="tspan7694"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7704"
+     clip-path="url(#clipPath4537)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7702"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,561.05,286.63)"><tspan
+         id="tspan7700"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7710"
+     clip-path="url(#clipPath4549)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7708"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,667.39,318.89)"><tspan
+         id="tspan7706"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7716"
+     clip-path="url(#clipPath4561)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7714"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,720.14,318.89)"><tspan
+         id="tspan7712"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7722"
+     clip-path="url(#clipPath4573)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7720"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,776.3,318.89)"><tspan
+         id="tspan7718"
+         y="0"
+         x="0">√</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7724"
+     d="m 211.36594,305.0057 2.18661,-227.154316 c 0.0133,-1.0933 -0.87997,-1.99995 -1.98661,-2.01328 -1.09331,-0.0133 -1.99995,0.87998 -2.01329,1.98662 l -2.18661,227.140986 c -0.0133,1.10663 0.87998,2.01328 1.98662,2.02661 1.10664,0.0133 1.99995,-0.87998 2.01328,-1.98662 z m -7.97313,-2.07994 5.87985,12.06636 6.11985,-11.94637 z" /><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7726"
+     d="M 289.03067,238.94069 V 107.43731 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 131.50338 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m -7.9998,-1.99995 5.99985,11.9997 5.99985,-11.9997 z" /><g
+     id="g7732"
+     clip-path="url(#clipPath4589)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7730"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,164.59,422.74)"><tspan
+         id="tspan7728"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 31.88484 39.578758 43.06068 46.065239 49.294441 54.784081 57.957119 65.271957 72.263878 78.118561 81.347763 88.072922 92.762283 99.754204 107.04096 110.38248 117.10764 120.33684 123.56604 130.17888 137.50777 144.49968 151.78644 155.12796 165.16656 168.43788 173.14128 180.44208 183.67128 190.01736 197.13564 204.19775 207.77795 214.89624 221.94432 225.17352 229.9752 236.70036">v20 ABI is declared aligned with v19.11 LTS</tspan></text>
+</g><g
+     id="g7738"
+     clip-path="url(#clipPath4601)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7736"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,222.12,398.3)"><tspan
+         id="tspan7734"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 23.740032 29.014032 35.385025 46.537777 53.851055 61.262783 64.497505 70.038719 73.034355 79.771011 84.440254 91.401939 94.622589 101.35925 108.65846 115.97174 122.93343 130.2467 133.59393 140.3306 147.62981 154.94308 158.16374 164.52068 171.60893 178.68312 181.90378 187.17778 193.54877 204.70152 212.0148 219.42653 222.66125 228.20247 231.32468 238.06133 242.73058 249.69226 252.81447 263.98129 271.39301 278.77661 282.01132 286.30084 289.53555 296.53943 303.82458 307.34061 310.51904 316.0462 323.3595 330.67276 337.98605 345.39777 350.30612 355.01755 358.13977 362.21832 369.63004 374.53839 377.5762 383.93314 391.02139 398.09558 401.2178 409.36084 417.03979 420.51361 423.6358 429.40204 436.81378 444.04266 448.75412 451.98883 459.28806 466.60132 473.56302 479.06204">v21 symbols are added and v20 symbols are modified, support for v20 ABI continues.</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7740"
+     d="m 510.78512,258.56686 -0.31999,-126.17017 c 0,-1.09331 0.89331,-1.99995 1.99995,-1.99995 1.09331,0 1.99995,0.89331 1.99995,1.99995 l 0.31999,126.15684 c 0,1.10664 -0.89331,2.01328 -1.99995,2.01328 -1.0933,0 -1.99995,-0.89331 -1.99995,-1.99995 z m 7.9998,-2.01328 -5.97318,12.01303 -6.02652,-11.98636 z" /><g
+     id="g7746"
+     clip-path="url(#clipPath4615)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7744"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,388.51,373.39)"><tspan
+         id="tspan7742"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 31.88484 39.578758 43.06068 46.065239 49.294441 54.784081 57.957119 65.271957 72.263878 78.118561 81.347763 88.072922 92.762283 99.754204 107.04096 110.38248 117.10764 120.33684 123.56604 130.17888 137.50777 144.49968 151.78644 155.12796 165.16656 168.43788 173.14128 180.44208 183.67128 190.01736 197.13564 204.19775 207.77795 214.89624 221.94432 225.17352 229.9752 236.70036 243.14471 246.65472 249.78564 254.46095 261.45288 272.58661 279.31177 282.54095 289.86984 293.09903 300.47003 307.02673 310.36823 316.71432 323.83261 330.89471 334.12393 339.40295 345.76309 356.92487 364.23972 371.63879 374.91013 380.39975 383.4324 390.15756 394.83289 401.8248 404.99783 409.71527 416.70721 427.84091 435.23999 441.51587 448.50781 455.79456">v21 ABI is declared aligned with v20.11 LTS, remaining v20 symbols are removed.</tspan></text>
+</g><path
+     style="fill:none;stroke:#7030a0;stroke-width:2.07994795;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7748"
+     stroke-miterlimit="10"
+     d="M 278.23094,342.95142 H 449.58665 V 261.03347 H 278.23094 Z" /><g
+     id="g7754"
+     clip-path="url(#clipPath4629)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7752"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,23.616,114.74)"><tspan
+         id="tspan7750"
+         y="0"
+         x="0 8.5082397 16.4268 20.17548 23.26428 30.817801 37.879921 42.821999 48.423962 51.93396 59.48748 67.026962">ABI Versions</tspan></text>
+</g><g
+     id="g7760"
+     clip-path="url(#clipPath4641)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7758"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,20.064,150.17)"><tspan
+         id="tspan7756"
+         y="0"
+         x="0 8.8451996 16.31448 25.159679 32.839561 36.0126 43.67844 50.740559 54.222481 61.284599 68.248444 73.850403 80.954643">DPDK Releases</tspan></text>
+</g><g
+     id="g7766"
+     clip-path="url(#clipPath4653)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7764"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,444,346.1)"><tspan
+         id="tspan7762"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 29.034719 35.39484 46.556641 53.871479 61.270561 64.541878 70.031517 73.064163 79.789322 84.464638 91.456558 94.629601 101.35476 108.72576 116.02656 123.01848 130.30524 133.64676 140.37192 147.68677 155.0016 158.2308 164.57687 171.69516 178.75728 181.98648 187.26552 193.62564 204.78745 212.10228 219.50136 222.77267 228.26231 231.43536 238.16052 242.80775 249.79968 252.88847 264.05029 271.44937 278.82037 282.04956 286.33176 289.60309 296.595 303.88177 307.39175 310.56479 316.1106 323.42545 330.74026 338.05511 345.45419 350.39627 355.09967 358.20251 362.28815 369.68723 374.62933 377.63388 383.97995 391.09824 398.16037 401.27725 409.4064 417.10031 420.58224 423.69913 429.45551 436.85461 444.09924 448.80264 452.03183 459.33264 466.64749 473.6394 479.12903 488.81665 492.43896">v22 symbols are added and v21 symbols are modified, support for v21 ABI continues…..</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7768"
+     d="m 583.39664,198.26171 -0.13333,-30.49257 c 0,-1.10664 0.89331,-2.01329 1.98662,-2.01329 1.10664,0 2.01328,0.89331 2.01328,1.98662 l 0.13333,30.49257 c 0,1.10664 -0.89331,2.01328 -1.99995,2.01328 -1.0933,0 -1.99995,-0.89331 -1.99995,-1.98661 z m 7.98647,-2.03995 -5.94652,12.02636 -6.05318,-11.97303 z" /><path
+     style="fill:none;stroke:#7030a0;stroke-width:2.07994795;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7770"
+     stroke-miterlimit="10"
+     d="M 571.18361,299.43251 H 742.37933 V 212.87467 H 571.18361 Z" /><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7772"
+     d="m 933.01457,30.959224 c 0,-6.22651 4.50655,-11.27972 10.07975,-11.27972 5.57319,0 10.07974,5.05321 10.07974,11.27972 0,6.22651 -4.50655,11.27972 -10.07974,11.27972 -5.5732,0 -10.07975,-5.05321 -10.07975,-11.27972 z" /><path
+     style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7774"
+     d="m 1081.3309,29.759254 c 0,-6.18651 4.4798,-11.19972 9.9997,-11.19972 5.5199,0 9.9998,5.01321 9.9998,11.19972 0,6.18651 -4.4799,11.19972 -9.9998,11.19972 -5.5199,0 -9.9997,-5.01321 -9.9997,-11.19972 z" /><g
+     id="g7780"
+     clip-path="url(#clipPath4673)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7778"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,744.89,439.54)"><tspan
+         id="tspan7776"
+         y="0"
+         x="0 4.8016801 11.52684 17.971201 21.144239 28.5714 35.56332 38.792519 45.728279 52.453442 57.943081">LTS Release</tspan></text>
+</g><g
+     id="g7786"
+     clip-path="url(#clipPath4685)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7784"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,856.06,439.75)"><tspan
+         id="tspan7782"
+         y="0"
+         x="0 12.0042 15.2334 22.562281 29.961361 34.903439 38.020321 45.461521 52.453442 55.68264 62.618401 69.343559 74.833199">Minor Release</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7788"
+     d="m 779.25841,46.265514 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.0933 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90665 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7794"
+     clip-path="url(#clipPath4699)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7792"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,622.34,439.54)"><tspan
+         id="tspan7790"
+         y="0"
+         x="0 8.1291599 15.82308 19.305 22.309561 29.512079 36.504002 41.151241 46.640881 49.870079 57.339359">ABI Version</tspan></text>
+</g><path
+     style="fill:none;stroke:#002060;stroke-width:1.27996802;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7796"
+     stroke-miterlimit="10"
+     d="M 763.41881,62.078444 H 1236.847 V 0.63998401 H 763.41881 Z" /></svg>
\ No newline at end of file
diff --git a/doc/guides/contributing/img/what_is_an_abi.svg b/doc/guides/contributing/img/what_is_an_abi.svg
new file mode 100644
index 0000000..fd3d993
--- /dev/null
+++ b/doc/guides/contributing/img/what_is_an_abi.svg
@@ -0,0 +1,382 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="970.69568"
+   height="522.22693"
+   version="1.1"
+   viewBox="0 0 970.69568 522.22693"
+   xml:space="preserve"
+   id="svg8399"
+   sodipodi:docname="what_is_an_abi.svg"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
+     id="metadata8403"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview8401"
+     showgrid="false"
+     inkscape:zoom="0.62755727"
+     inkscape:cx="820.83951"
+     inkscape:cy="-47.473217"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg8399" /><defs
+     id="defs8269"><clipPath
+       id="clipPath26"><path
+         d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
+         id="path8206"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><radialGradient
+       id="radialGradient40"
+       cx="0"
+       cy="0"
+       r="1"
+       gradientTransform="matrix(386.44367,-1.3123672e-5,-1.3123672e-5,-386.44367,470.30824,246.15384)"
+       gradientUnits="userSpaceOnUse"><stop
+         stop-color="#f9d8e2"
+         offset="0"
+         id="stop8209" /><stop
+         stop-color="#fff"
+         offset=".74"
+         id="stop8211" /><stop
+         stop-color="#fff"
+         offset=".83"
+         id="stop8213" /><stop
+         stop-color="#fff"
+         offset="1"
+         id="stop8215" /></radialGradient><clipPath
+       id="clipPath56"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8218"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath68"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8221"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath82"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8224"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath96"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8227"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath108"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8230"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath120"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8233"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath132"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8236"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath144"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8239"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath156"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8242"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath168"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8245"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath180"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8248"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath192"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8251"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath204"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8254"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath216"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8257"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath228"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8260"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath240"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8263"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath260"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8266"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath></defs><path
+     inkscape:connector-curvature="0"
+     style="fill:url(#radialGradient40);fill-rule:evenodd;stroke-width:1.33329999"
+     id="path8275"
+     d="m 116.15709,143.06309 c 0,-28.46596 23.07942,-51.545378 51.54538,-51.545378 h 605.21154 c 28.46595,0 51.54537,23.079418 51.54537,51.545378 V 349.2446 c 0,28.46595 -23.07942,51.54538 -51.54537,51.54538 H 167.70247 c -28.46595,0 -51.54538,-23.07943 -51.54538,-51.54538 z" /><path
+     style="fill:#00b050;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8277"
+     d="m 478.70803,73.758152 0.58665,373.057338 c 0,1.67996 -1.35997,3.03993 -3.03992,3.03993 -1.67996,0.0133 -3.03993,-1.34663 -3.03993,-3.02659 L 472.62818,73.758152 c 0,-1.67995 1.35997,-3.03992 3.03992,-3.03992 1.67996,0 3.03993,1.35997 3.03993,3.03992 z m 6.65317,370.004088 -9.09311,18.25287 -9.14644,-18.22621 z" /><path
+     style="fill:none;stroke:#7030a0;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8279"
+     stroke-miterlimit="10"
+     d="m 3.0399239,186.92866 c 0,-36.70575 29.7459201,-66.45167 66.4516701,-66.45167 H 778.00721 c 36.70575,0 66.45167,29.74592 66.45167,66.45167 v 265.80669 c 0,36.70574 -29.74592,66.45167 -66.45167,66.45167 H 69.491594 c -36.70575,0 -66.4516701,-29.74593 -66.4516701,-66.45167 z" /><path
+     style="fill:none;stroke:#3b3059;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8281"
+     stroke-miterlimit="10"
+     d="m 101.27746,71.464882 c 0,-37.78572 30.63924,-68.4249581 68.42496,-68.4249581 h 729.52846 c 37.7857,0 68.4249,30.6392381 68.4249,68.4249581 V 345.1647 c 0,37.78572 -30.6392,68.42496 -68.4249,68.42496 H 169.70242 c -37.78572,0 -68.42496,-30.63924 -68.42496,-68.42496 z" /><g
+     id="g8287"
+     clip-path="url(#clipPath56)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.06399918px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8285"
+       font-size="32.064px"
+       transform="matrix(1,0,0,-1,409.78,93.312)"><tspan
+         id="tspan8283"
+         y="0"
+         x="0 23.855616 42.837505 66.693123">DPDK</tspan></text>
+</g><g
+     id="g8293"
+     clip-path="url(#clipPath68)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.06399918px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8291"
+       font-size="32.064px"
+       transform="matrix(1,0,0,-1,358.03,435.43)"><tspan
+         id="tspan8289"
+         y="0"
+         x="0 23.72736 45.595009 67.462654 73.875458 80.160004 100.90541 122.80512 133.54655 139.95937 160.96127">Application</tspan></text>
+</g><path
+     style="fill:#f9d8e2;fill-opacity:0.70196001;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8295"
+     d="M 424.30939,345.59136 H 531.18672 V 277.91305 H 424.30939 Z" /><g
+     id="g8301"
+     clip-path="url(#clipPath82)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.04000092px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8299"
+       font-size="32.04px"
+       transform="matrix(1,0,0,-1,432.96,231.41)"><tspan
+         id="tspan8297"
+         y="0"
+         x="0 23.7096 42.67728">API</tspan></text>
+</g><path
+     style="fill:#f9d8e2;fill-opacity:0.70196001;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8303"
+     d="m 422.38944,213.91465 h 107.19732 v -67.8383 H 422.38944 Z" /><g
+     id="g8309"
+     clip-path="url(#clipPath96)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.04000092px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8307"
+       font-size="32.04px"
+       transform="matrix(1,0,0,-1,431.54,330.29)"><tspan
+         id="tspan8305"
+         y="0"
+         x="0 23.7096 42.100559">ABI</tspan></text>
+</g><g
+     id="g8315"
+     clip-path="url(#clipPath108)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8313"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,293.23)"><tspan
+         id="tspan8311"
+         y="0"
+         x="0 9.4483204 14.25228 24.706079 35.447159 40.203239 51.10392 66.106323 81.076797 84.332642 94.068237">Programming</tspan></text>
+</g><g
+     id="g8321"
+     clip-path="url(#clipPath120)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.98400021px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8319"
+       font-size="15.984px"
+       transform="matrix(1,0,0,-1,221.78,274.03)"><tspan
+         id="tspan8317"
+         y="0"
+         x="0 7.320672 18.237743 27.987984 38.633327 48.351601 59.268673 69.945984">Language</tspan></text>
+</g><g
+     id="g8327"
+     clip-path="url(#clipPath132)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8325"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,254.81)"><tspan
+         id="tspan8323"
+         y="0"
+         x="0 7.6767602 17.38044 27.116039 37.442162 42.708961 45.93288 56.386681 66.122276">Functions</tspan></text>
+</g><g
+     id="g8333"
+     clip-path="url(#clipPath144)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8331"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,235.61)"><tspan
+         id="tspan8329"
+         y="0"
+         x="0 11.87424 22.77492 28.073641 38.974319 44.273041 52.891441 63.776161 74.150162">Datatypes</tspan></text>
+</g><g
+     id="g8339"
+     clip-path="url(#clipPath156)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8337"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,216.41)"><tspan
+         id="tspan8335"
+         y="0"
+         x="0 9.6877203 20.06172 25.312559 35.016239 39.820202 49.555801 54.216122 60.823559 69.441963 80.326683 90.700684">Return Types</tspan></text>
+</g><g
+     id="g8345"
+     clip-path="url(#clipPath168)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8343"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,197.21)"><tspan
+         id="tspan8341"
+         y="0"
+         x="0 12.97548 23.429279 33.164879 39.357361 44.640121 55.540798 65.276398 70.559158">Constants</tspan></text>
+</g><g
+     id="g8351"
+     clip-path="url(#clipPath180)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8349"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,178.01)"><tspan
+         id="tspan8347"
+         y="0"
+         x="0">…</tspan></text>
+</g><g
+     id="g8357"
+     clip-path="url(#clipPath192)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8355"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,354.12)"><tspan
+         id="tspan8353"
+         y="0"
+         x="0 3.8304 13.566 19.75848 25.07316 29.877119 39.580799 49.906921 55.189678 58.413601 68.867401 78.602997 83.2314 89.423882 99.797882">Instruction set</tspan></text>
+</g><g
+     id="g8363"
+     clip-path="url(#clipPath204)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.98400021px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8361"
+       font-size="15.984px"
+       transform="matrix(1,0,0,-1,546.38,332.88)"><tspan
+         id="tspan8359"
+         y="0"
+         x="0 8.5674238 16.239744 26.517456 36.859104 46.577377 51.836113 62.753185 73.654274 77.026894 87.352562 91.892014 103.99191 108.33955 115.66022 118.85703 128.60727 136.63123 147.02083">Executable &amp; Linker</tspan></text>
+</g><g
+     id="g8369"
+     clip-path="url(#clipPath216)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8367"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,313.66)"><tspan
+         id="tspan8365"
+         y="0"
+         x="0 7.6767602 18.13056 22.934521 37.904999 48.805679">Format</tspan></text>
+</g><g
+     id="g8375"
+     clip-path="url(#clipPath228)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8373"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,292.42)"><tspan
+         id="tspan8371"
+         y="0"
+         x="0 12.97548 23.87616 27.22776 30.579359 33.80328 43.538879 54.200161 58.39764 71.373123 81.82692 91.562523 100.6278 110.95392 120.68952 125.95632 129.18024 139.63403 149.36964 155.56212">Calling Conventions.</tspan></text>
+</g><g
+     id="g8381"
+     clip-path="url(#clipPath240)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8379"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,271.3)"><tspan
+         id="tspan8377"
+         y="0"
+         x="0">…</tspan></text>
+</g><path
+     style="fill:none;stroke:#ffffff;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:18.239544, 24.319392"
+     inkscape:connector-curvature="0"
+     id="path8383"
+     stroke-miterlimit="10"
+     d="M 122.71693,120.47699 H 782.84709" /><path
+     style="fill:none;stroke:#ffffff;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:18.239544, 24.319392"
+     inkscape:connector-curvature="0"
+     id="path8385"
+     stroke-miterlimit="10"
+     d="M 177.27556,413.58966 H 837.40573" /><g
+     id="g8391"
+     clip-path="url(#clipPath260)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-style:italic;font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8389"
+       font-style="italic"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,483.19,405.82)"><tspan
+         id="tspan8387"
+         y="0"
+         x="0 5.0114398 14.71512 24.45072 34.77684 40.299 43.522919 53.976719 63.712318 68.13324 78.459358 89.360039 92.583961 95.807877">function calls</tspan></text>
+</g><path
+     style="fill:none;stroke:#3b3059;stroke-width:0.95997602;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8393"
+     stroke-miterlimit="10"
+     d="m 574.38564,303.03242 c -11.93304,0 -21.59946,-1.61329 -21.59946,-3.59991 V 164.62255 c 0,-1.98662 -9.66643,-3.59991 -21.59946,-3.59991 11.93303,0 21.59946,-1.61329 21.59946,-3.59991 v -18.30621 c 0,-1.98662 9.66642,-3.59991 21.59946,-3.59991" /><path
+     style="fill:none;stroke:#3b3059;stroke-width:0.95997602;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8395"
+     stroke-miterlimit="10"
+     d="m 372.63068,389.43026 c 13.293,0 24.0794,-1.79995 24.0794,-4.01323 v -91.53105 c 0,-2.21327 10.78639,-4.01323 24.0794,-4.01323 -13.29301,0 -24.0794,-1.79995 -24.0794,-4.01323 v -65.3717 c 0,-2.21328 -10.7864,-4.01323 -24.0794,-4.01323" /></svg>
\ No newline at end of file
diff --git a/doc/guides/contributing/stable.rst b/doc/guides/contributing/stable.rst
index 6a5eee9..4d38bb8 100644
--- a/doc/guides/contributing/stable.rst
+++ b/doc/guides/contributing/stable.rst
@@ -1,7 +1,7 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2018 The DPDK contributors
 
-.. stable_lts_releases:
+.. _stable_lts_releases:
 
 DPDK Stable Releases and Long Term Support
 ==========================================
@@ -53,6 +53,9 @@ year's November (X.11) release will be maintained as an LTS for 2 years.
 After the X.11 release, an LTS branch will be created for it at
 http://git.dpdk.org/dpdk-stable where bugfixes will be backported to.
 
+A LTS release may align with the declaration of a new major ABI version,
+please read the :doc:`abi_policy` for more information.
+
 It is anticipated that there will be at least 4 releases per year of the LTS
 or approximately 1 every 3 months. However, the cadence can be shorter or
 longer depending on the number and criticality of the backported
@@ -119,10 +122,3 @@ A Stable Release will be released by:
   list.
 
 Stable releases are available on the `dpdk.org download page <http://core.dpdk.org/download/>`_.
-
-
-ABI
----
-
-The Stable Release should not be seen as a way of breaking or circumventing
-the DPDK ABI policy.
-- 
2.7.4


^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v11 1/3] doc: separate versioning.rst into version and policy
  2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
@ 2019-11-11 11:57 18%   ` Ray Kinsella
  2019-11-11 11:57 23%   ` [dpdk-dev] [PATCH v11 2/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 11:57 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Separate versioning.rst into abi versioning and abi policy guidance, in
preparation for adding more detail to the abi policy. Add an entry to the
maintainer file for the abi policy.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS                                |   4 +
 doc/guides/contributing/abi_policy.rst     | 167 ++++++++
 doc/guides/contributing/abi_versioning.rst | 433 +++++++++++++++++++++
 doc/guides/contributing/index.rst          |   3 +-
 doc/guides/contributing/patches.rst        |   2 +-
 doc/guides/contributing/versioning.rst     | 597 -----------------------------
 doc/guides/rel_notes/deprecation.rst       |   2 +-
 7 files changed, 608 insertions(+), 600 deletions(-)
 create mode 100644 doc/guides/contributing/abi_policy.rst
 create mode 100644 doc/guides/contributing/abi_versioning.rst
 delete mode 100644 doc/guides/contributing/versioning.rst

diff --git a/MAINTAINERS b/MAINTAINERS
index e8d79ea..aedb593 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -84,6 +84,10 @@ M: Marko Kovacevic <marko.kovacevic@intel.com>
 F: README
 F: doc/
 
+ABI Policy
+M: Ray Kinsella <mdr@ashroe.eu>
+F: doc/guides/contributing/abi_*.rst
+
 Developers and Maintainers Tools
 M: Thomas Monjalon <thomas@monjalon.net>
 F: MAINTAINERS
diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
new file mode 100644
index 0000000..d4f4e9f
--- /dev/null
+++ b/doc/guides/contributing/abi_policy.rst
@@ -0,0 +1,167 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright 2018 The DPDK contributors
+
+DPDK ABI/API policy
+===================
+
+Description
+-----------
+
+This document details some methods for handling ABI management in the DPDK.
+
+General Guidelines
+------------------
+
+#. Whenever possible, ABI should be preserved
+#. ABI/API may be changed with a deprecation process
+#. The modification of symbols can generally be managed with versioning
+#. Libraries or APIs marked in ``experimental`` state may change without constraint
+#. New APIs will be marked as ``experimental`` for at least one release to allow
+   any issues found by users of the new API to be fixed quickly
+#. The addition of symbols is generally not problematic
+#. The removal of symbols generally is an ABI break and requires bumping of the
+   LIBABIVER macro
+#. Updates to the minimum hardware requirements, which drop support for hardware which
+   was previously supported, should be treated as an ABI change.
+
+What is an ABI
+~~~~~~~~~~~~~~
+
+An ABI (Application Binary Interface) is the set of runtime interfaces exposed
+by a library. It is similar to an API (Application Programming Interface) but
+is the result of compilation.  It is also effectively cloned when applications
+link to dynamic libraries.  That is to say when an application is compiled to
+link against dynamic libraries, it is assumed that the ABI remains constant
+between the time the application is compiled/linked, and the time that it runs.
+Therefore, in the case of dynamic linking, it is critical that an ABI is
+preserved, or (when modified), done in such a way that the application is unable
+to behave improperly or in an unexpected fashion.
+
+
+ABI/API Deprecation
+-------------------
+
+The DPDK ABI policy
+~~~~~~~~~~~~~~~~~~~
+
+ABI versions are set at the time of major release labeling, and the ABI may
+change multiple times, without warning, between the last release label and the
+HEAD label of the git tree.
+
+ABI versions, once released, are available until such time as their
+deprecation has been noted in the Release Notes for at least one major release
+cycle. For example consider the case where the ABI for DPDK 2.0 has been
+shipped and then a decision is made to modify it during the development of
+DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
+release and the modification will be made available in the DPDK 2.2 release.
+
+ABI versions may be deprecated in whole or in part as needed by a given
+update.
+
+Some ABI changes may be too significant to reasonably maintain multiple
+versions. In those cases ABI's may be updated without backward compatibility
+being provided. The requirements for doing so are:
+
+#. At least 3 acknowledgments of the need to do so must be made on the
+   dpdk.org mailing list.
+
+   - The acknowledgment of the maintainer of the component is mandatory, or if
+     no maintainer is available for the component, the tree/sub-tree maintainer
+     for that component must acknowledge the ABI change instead.
+
+   - It is also recommended that acknowledgments from different "areas of
+     interest" be sought for each deprecation, for example: from NIC vendors,
+     CPU vendors, end-users, etc.
+
+#. The changes (including an alternative map file) can be included with
+   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
+   to provide more details about oncoming changes.
+   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
+   More preferred way to provide this information is sending the feature
+   as a separate patch and reference it in deprecation notice.
+
+#. A full deprecation cycle, as explained above, must be made to offer
+   downstream consumers sufficient warning of the change.
+
+Note that the above process for ABI deprecation should not be undertaken
+lightly. ABI stability is extremely important for downstream consumers of the
+DPDK, especially when distributed in shared object form. Every effort should
+be made to preserve the ABI whenever possible. The ABI should only be changed
+for significant reasons, such as performance enhancements. ABI breakage due to
+changes such as reorganizing public structure fields for aesthetic or
+readability purposes should be avoided.
+
+.. note::
+
+   Updates to the minimum hardware requirements, which drop support for hardware
+   which was previously supported, should be treated as an ABI change, and
+   follow the relevant deprecation policy procedures as above: 3 acks and
+   announcement at least one release in advance.
+
+Examples of Deprecation Notices
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following are some examples of ABI deprecation notices which would be
+added to the Release Notes:
+
+* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
+  to be replaced with the inline function ``rte_foo()``.
+
+* The function ``rte_mbuf_grok()`` has been updated to include a new parameter
+  in version 2.0. Backwards compatibility will be maintained for this function
+  until the release of version 2.1
+
+* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
+  performance reasons. Existing binary applications will have backwards
+  compatibility in release 2.0, while newly built binaries will need to
+  reference the new structure variant ``struct rte_foo2``. Compatibility will
+  be removed in release 2.2, and all applications will require updating and
+  rebuilding to the new structure at that time, which will be renamed to the
+  original ``struct rte_foo``.
+
+* Significant ABI changes are planned for the ``librte_dostuff`` library. The
+  upcoming release 2.0 will not contain these changes, but release 2.1 will,
+  and no backwards compatibility is planned due to the extensive nature of
+  these changes. Binaries using this library built prior to version 2.1 will
+  require updating and recompilation.
+
+New API replacing previous one
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a new API proposed functionally replaces an existing one, when the new API
+becomes non-experimental then the old one is marked with ``__rte_deprecated``.
+Deprecated APIs are removed completely just after the next LTS.
+
+Reminder that old API should follow deprecation process to be removed.
+
+
+Experimental APIs
+-----------------
+
+APIs marked as ``experimental`` are not considered part of the ABI and may
+change without warning at any time.  Since changes to APIs are most likely
+immediately after their introduction, as users begin to take advantage of
+those new APIs and start finding issues with them, new DPDK APIs will be
+automatically marked as ``experimental`` to allow for a period of stabilization
+before they become part of a tracked ABI.
+
+Note that marking an API as experimental is a multi step process.
+To mark an API as experimental, the symbols which are desired to be exported
+must be placed in an EXPERIMENTAL version block in the corresponding libraries'
+version map script.
+Secondly, the corresponding prototypes of those exported functions (in the
+development header files), must be marked with the ``__rte_experimental`` tag
+(see ``rte_compat.h``).
+The DPDK build makefiles perform a check to ensure that the map file and the
+C code reflect the same list of symbols.
+This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
+during compilation in the corresponding library Makefile.
+
+In addition to tagging the code with ``__rte_experimental``,
+the doxygen markup must also contain the EXPERIMENTAL string,
+and the MAINTAINERS file should note the EXPERIMENTAL libraries.
+
+For removing the experimental tag associated with an API, deprecation notice
+is not required. Though, an API should remain in experimental state for at least
+one release. Thereafter, normal process of posting patch for review to mailing
+list can be followed.
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
new file mode 100644
index 0000000..d278de4
--- /dev/null
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -0,0 +1,433 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright 2018 The DPDK contributors
+
+.. library_versioning:
+
+Library versioning
+------------------
+
+Downstreams might want to provide different DPDK releases at the same time to
+support multiple consumers of DPDK linked against older and newer sonames.
+
+Also due to the interdependencies that DPDK libraries can have applications
+might end up with an executable space in which multiple versions of a library
+are mapped by ld.so.
+
+Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
+depending on LibA.
+
+.. note::
+
+    Application
+    \-> LibA.old
+    \-> LibB.new -> LibA.new
+
+That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
+If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
+library - versions defined in the libraries ``LIBABIVER``.
+An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
+``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
+
+
+ABI versioning
+--------------
+
+Versioning Macros
+~~~~~~~~~~~~~~~~~
+
+When a symbol is exported from a library to provide an API, it also provides a
+calling convention (ABI) that is embodied in its name, return type and
+arguments. Occasionally that function may need to change to accommodate new
+functionality or behavior. When that occurs, it is desirable to allow for
+backward compatibility for a time with older binaries that are dynamically
+linked to the DPDK.
+
+To support backward compatibility the ``rte_function_versioning.h``
+header file provides macros to use when updating exported functions. These
+macros are used in conjunction with the ``rte_<library>_version.map`` file for
+a given library to allow multiple versions of a symbol to exist in a shared
+library so that older binaries need not be immediately recompiled.
+
+The macros exported are:
+
+* ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
+  versioned symbol ``b@DPDK_n`` to the internal function ``be``.
+
+* ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
+  the linker to bind references to symbol ``b`` to the internal symbol
+  ``be``.
+
+* ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
+  fully qualified function ``p``, so that if a symbol becomes versioned, it
+  can still be mapped back to the public symbol name.
+
+* ``__vsym``:  Annotation to be used in a declaration of the internal symbol
+  ``be`` to signal that it is being used as an implementation of a particular
+  version of symbol ``b``.
+
+Examples of ABI Macro use
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Updating a public API
+_____________________
+
+Assume we have a function as follows
+
+.. code-block:: c
+
+ /*
+  * Create an acl context object for apps to
+  * manipulate
+  */
+ struct rte_acl_ctx *
+ rte_acl_create(const struct rte_acl_param *param)
+ {
+        ...
+ }
+
+
+Assume that struct rte_acl_ctx is a private structure, and that a developer
+wishes to enhance the acl api so that a debugging flag can be enabled on a
+per-context basis.  This requires an addition to the structure (which, being
+private, is safe), but it also requires modifying the code as follows
+
+.. code-block:: c
+
+ /*
+  * Create an acl context object for apps to
+  * manipulate
+  */
+ struct rte_acl_ctx *
+ rte_acl_create(const struct rte_acl_param *param, int debug)
+ {
+        ...
+ }
+
+
+Note also that, being a public function, the header file prototype must also be
+changed, as must all the call sites, to reflect the new ABI footprint.  We will
+maintain previous ABI versions that are accessible only to previously compiled
+binaries
+
+The addition of a parameter to the function is ABI breaking as the function is
+public, and existing application may use it in its current form.  However, the
+compatibility macros in DPDK allow a developer to use symbol versioning so that
+multiple functions can be mapped to the same public symbol based on when an
+application was linked to it.  To see how this is done, we start with the
+requisite libraries version map file.  Initially the version map file for the
+acl library looks like this
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_create;
+        rte_acl_dump;
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+This file needs to be modified as follows
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_create;
+        rte_acl_dump;
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+   DPDK_2.1 {
+        global:
+        rte_acl_create;
+
+   } DPDK_2.0;
+
+The addition of the new block tells the linker that a new version node is
+available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
+symbols from the DPDK_2.0 node.  This list is directly translated into a list of
+exported symbols when DPDK is compiled as a shared library
+
+Next, we need to specify in the code which function map to the rte_acl_create
+symbol at which versions.  First, at the site of the initial symbol definition,
+we need to update the function so that it is uniquely named, and not in conflict
+with the public symbol name
+
+.. code-block:: c
+
+ -struct rte_acl_ctx *
+ -rte_acl_create(const struct rte_acl_param *param)
+ +struct rte_acl_ctx * __vsym
+ +rte_acl_create_v20(const struct rte_acl_param *param)
+ {
+        size_t sz;
+        struct rte_acl_ctx *ctx;
+        ...
+
+Note that the base name of the symbol was kept intact, as this is conducive to
+the macros used for versioning symbols and we have annotated the function as an
+implementation of versioned symbol.  That is our next step, mapping this new
+symbol name to the initial symbol name at version node 2.0.  Immediately after
+the function, we add this line of code
+
+.. code-block:: c
+
+   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+
+Remembering to also add the rte_function_versioning.h header to the requisite c file where
+these changes are being made.  The above macro instructs the linker to create a
+new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
+builds, but now points to the above newly named function.  We have now mapped
+the original rte_acl_create symbol to the original function (but with a new
+name)
+
+Next, we need to create the 2.1 version of the symbol.  We create a new function
+name, with a different suffix, and  implement it appropriately
+
+.. code-block:: c
+
+   struct rte_acl_ctx * __vsym
+   rte_acl_create_v21(const struct rte_acl_param *param, int debug);
+   {
+        struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
+
+        ctx->debug = debug;
+
+        return ctx;
+   }
+
+This code serves as our new API call.  Its the same as our old call, but adds
+the new parameter in place.  Next we need to map this function to the symbol
+``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
+in the header file, adding the macro there to inform all including applications,
+that on re-link, the default rte_acl_create symbol should point to this
+function.  Note that we could do this by simply naming the function above
+rte_acl_create, and the linker would chose the most recent version tag to apply
+in the version script, but we can also do this in the header file
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   -rte_acl_create(const struct rte_acl_param *param);
+   +rte_acl_create(const struct rte_acl_param *param, int debug);
+   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+
+The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
+header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
+version node to it.  This method is more explicit and flexible than just
+re-implementing the exact symbol name, and allows for other features (such as
+linking to the old symbol version by default, when the new ABI is to be opt-in
+for a period.
+
+One last thing we need to do.  Note that we've taken what was a public symbol,
+and duplicated it into two uniquely and differently named symbols.  We've then
+mapped each of those back to the public symbol ``rte_acl_create`` with different
+version tags.  This only applies to dynamic linking, as static linking has no
+notion of versioning.  That leaves this code in a position of no longer having a
+symbol simply named ``rte_acl_create`` and a static build will fail on that
+missing symbol.
+
+To correct this, we can simply map a function of our choosing back to the public
+symbol in the static build with the ``MAP_STATIC_SYMBOL`` macro.  Generally the
+assumption is that the most recent version of the symbol is the one you want to
+map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
+defined, we add this
+
+.. code-block:: c
+
+   struct rte_acl_ctx * __vsym
+   rte_acl_create_v21(const struct rte_acl_param *param, int debug)
+   {
+        ...
+   }
+   MAP_STATIC_SYMBOL(struct rte_acl_ctx *rte_acl_create(const struct rte_acl_param *param, int debug), rte_acl_create_v21);
+
+That tells the compiler that, when building a static library, any calls to the
+symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
+
+That's it, on the next shared library rebuild, there will be two versions of
+rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
+and a new DPDK_2.1 version, used by future built applications.
+
+
+Deprecating part of a public API
+________________________________
+
+Lets assume that you've done the above update, and after a few releases have
+passed you decide you would like to retire the old version of the function.
+After having gone through the ABI deprecation announcement process, removal is
+easy.  Start by removing the symbol from the requisite version map file:
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_dump;
+ -      rte_acl_create
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+   DPDK_2.1 {
+        global:
+        rte_acl_create;
+   } DPDK_2.0;
+
+
+Next remove the corresponding versioned export.
+
+.. code-block:: c
+
+ -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+
+
+Note that the internal function definition could also be removed, but its used
+in our example by the newer version _v21, so we leave it in place.  This is a
+coding style choice.
+
+Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
+indicate to applications doing dynamic linking that this is a later, and
+possibly incompatible library version:
+
+.. code-block:: c
+
+   -LIBABIVER := 1
+   +LIBABIVER := 2
+
+Deprecating an entire ABI version
+_________________________________
+
+While removing a symbol from and ABI may be useful, it is often more practical
+to remove an entire version node at once.  If a version node completely
+specifies an API, then removing part of it, typically makes it incomplete.  In
+those cases it is better to remove the entire node
+
+To do this, start by modifying the version map file, such that all symbols from
+the node to be removed are merged into the next node in the map
+
+In the case of our map above, it would transform to look as follows
+
+.. code-block:: none
+
+   DPDK_2.1 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_dump;
+        rte_acl_create
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+ };
+
+Then any uses of BIND_DEFAULT_SYMBOL that pointed to the old node should be
+updated to point to the new version node in any header files for all affected
+symbols.
+
+.. code-block:: c
+
+ -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
+ +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+
+Lastly, any VERSION_SYMBOL macros that point to the old version node should be
+removed, taking care to keep, where need old code in place to support newer
+versions of the symbol.
+
+
+Running the ABI Validator
+-------------------------
+
+The ``devtools`` directory in the DPDK source tree contains a utility program,
+``validate-abi.sh``, for validating the DPDK ABI based on the Linux `ABI
+Compliance Checker
+<http://ispras.linuxbase.org/index.php/ABI_compliance_checker>`_.
+
+This has a dependency on the ``abi-compliance-checker`` and ``and abi-dumper``
+utilities which can be installed via a package manager. For example::
+
+   sudo yum install abi-compliance-checker
+   sudo yum install abi-dumper
+
+The syntax of the ``validate-abi.sh`` utility is::
+
+   ./devtools/validate-abi.sh <REV1> <REV2>
+
+Where ``REV1`` and ``REV2`` are valid gitrevisions(7)
+https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
+on the local repo.
+
+For example::
+
+   # Check between the previous and latest commit:
+   ./devtools/validate-abi.sh HEAD~1 HEAD
+
+   # Check on a specific compilation target:
+   ./devtools/validate-abi.sh -t x86_64-native-linux-gcc HEAD~1 HEAD
+
+   # Check between two tags:
+   ./devtools/validate-abi.sh v2.0.0 v2.1.0
+
+   # Check between git master and local topic-branch "vhost-hacking":
+   ./devtools/validate-abi.sh master vhost-hacking
+
+After the validation script completes (it can take a while since it need to
+compile both tags) it will create compatibility reports in the
+``./abi-check/compat_report`` directory. Listed incompatibilities can be found
+as follows::
+
+  grep -lr Incompatible abi-check/compat_reports/
diff --git a/doc/guides/contributing/index.rst b/doc/guides/contributing/index.rst
index e2608d3..2fefd91 100644
--- a/doc/guides/contributing/index.rst
+++ b/doc/guides/contributing/index.rst
@@ -10,7 +10,8 @@ Contributor's Guidelines
 
     coding_style
     design
-    versioning
+    abi_policy
+    abi_versioning
     documentation
     patches
     vulnerability
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index 9e1013b..c9ec529 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -157,7 +157,7 @@ Make your planned changes in the cloned ``dpdk`` repo. Here are some guidelines
   * For other PMDs and more info, refer to the ``MAINTAINERS`` file.
 
 * New external functions should be added to the local ``version.map`` file.
-  See the :doc:`Guidelines for ABI policy and versioning </contributing/versioning>`.
+  See the :doc:`Guidelines for ABI policy and versioning </contributing/abi_versioning>`.
   New external functions should also be added in alphabetical order.
 
 * Important changes will require an addition to the release notes in ``doc/guides/rel_notes/``.
diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
deleted file mode 100644
index fcd2d50..0000000
--- a/doc/guides/contributing/versioning.rst
+++ /dev/null
@@ -1,597 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright 2018 The DPDK contributors
-
-DPDK ABI/API policy
-===================
-
-Description
------------
-
-This document details some methods for handling ABI management in the DPDK.
-
-General Guidelines
-------------------
-
-#. Whenever possible, ABI should be preserved
-#. ABI/API may be changed with a deprecation process
-#. The modification of symbols can generally be managed with versioning
-#. Libraries or APIs marked in ``experimental`` state may change without constraint
-#. New APIs will be marked as ``experimental`` for at least one release to allow
-   any issues found by users of the new API to be fixed quickly
-#. The addition of symbols is generally not problematic
-#. The removal of symbols generally is an ABI break and requires bumping of the
-   LIBABIVER macro
-#. Updates to the minimum hardware requirements, which drop support for hardware which
-   was previously supported, should be treated as an ABI change.
-
-What is an ABI
-~~~~~~~~~~~~~~
-
-An ABI (Application Binary Interface) is the set of runtime interfaces exposed
-by a library. It is similar to an API (Application Programming Interface) but
-is the result of compilation.  It is also effectively cloned when applications
-link to dynamic libraries.  That is to say when an application is compiled to
-link against dynamic libraries, it is assumed that the ABI remains constant
-between the time the application is compiled/linked, and the time that it runs.
-Therefore, in the case of dynamic linking, it is critical that an ABI is
-preserved, or (when modified), done in such a way that the application is unable
-to behave improperly or in an unexpected fashion.
-
-
-ABI/API Deprecation
--------------------
-
-The DPDK ABI policy
-~~~~~~~~~~~~~~~~~~~
-
-ABI versions are set at the time of major release labeling, and the ABI may
-change multiple times, without warning, between the last release label and the
-HEAD label of the git tree.
-
-ABI versions, once released, are available until such time as their
-deprecation has been noted in the Release Notes for at least one major release
-cycle. For example consider the case where the ABI for DPDK 2.0 has been
-shipped and then a decision is made to modify it during the development of
-DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
-release and the modification will be made available in the DPDK 2.2 release.
-
-ABI versions may be deprecated in whole or in part as needed by a given
-update.
-
-Some ABI changes may be too significant to reasonably maintain multiple
-versions. In those cases ABI's may be updated without backward compatibility
-being provided. The requirements for doing so are:
-
-#. At least 3 acknowledgments of the need to do so must be made on the
-   dpdk.org mailing list.
-
-   - The acknowledgment of the maintainer of the component is mandatory, or if
-     no maintainer is available for the component, the tree/sub-tree maintainer
-     for that component must acknowledge the ABI change instead.
-
-   - It is also recommended that acknowledgments from different "areas of
-     interest" be sought for each deprecation, for example: from NIC vendors,
-     CPU vendors, end-users, etc.
-
-#. The changes (including an alternative map file) can be included with
-   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
-   to provide more details about oncoming changes.
-   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
-   More preferred way to provide this information is sending the feature
-   as a separate patch and reference it in deprecation notice.
-
-#. A full deprecation cycle, as explained above, must be made to offer
-   downstream consumers sufficient warning of the change.
-
-Note that the above process for ABI deprecation should not be undertaken
-lightly. ABI stability is extremely important for downstream consumers of the
-DPDK, especially when distributed in shared object form. Every effort should
-be made to preserve the ABI whenever possible. The ABI should only be changed
-for significant reasons, such as performance enhancements. ABI breakage due to
-changes such as reorganizing public structure fields for aesthetic or
-readability purposes should be avoided.
-
-.. note::
-
-   Updates to the minimum hardware requirements, which drop support for hardware
-   which was previously supported, should be treated as an ABI change, and
-   follow the relevant deprecation policy procedures as above: 3 acks and
-   announcement at least one release in advance.
-
-Examples of Deprecation Notices
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The following are some examples of ABI deprecation notices which would be
-added to the Release Notes:
-
-* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
-  to be replaced with the inline function ``rte_foo()``.
-
-* The function ``rte_mbuf_grok()`` has been updated to include a new parameter
-  in version 2.0. Backwards compatibility will be maintained for this function
-  until the release of version 2.1
-
-* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
-  performance reasons. Existing binary applications will have backwards
-  compatibility in release 2.0, while newly built binaries will need to
-  reference the new structure variant ``struct rte_foo2``. Compatibility will
-  be removed in release 2.2, and all applications will require updating and
-  rebuilding to the new structure at that time, which will be renamed to the
-  original ``struct rte_foo``.
-
-* Significant ABI changes are planned for the ``librte_dostuff`` library. The
-  upcoming release 2.0 will not contain these changes, but release 2.1 will,
-  and no backwards compatibility is planned due to the extensive nature of
-  these changes. Binaries using this library built prior to version 2.1 will
-  require updating and recompilation.
-
-New API replacing previous one
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If a new API proposed functionally replaces an existing one, when the new API
-becomes non-experimental then the old one is marked with ``__rte_deprecated``.
-Deprecated APIs are removed completely just after the next LTS.
-
-Reminder that old API should follow deprecation process to be removed.
-
-
-Experimental APIs
------------------
-
-APIs marked as ``experimental`` are not considered part of the ABI and may
-change without warning at any time.  Since changes to APIs are most likely
-immediately after their introduction, as users begin to take advantage of
-those new APIs and start finding issues with them, new DPDK APIs will be
-automatically marked as ``experimental`` to allow for a period of stabilization
-before they become part of a tracked ABI.
-
-Note that marking an API as experimental is a multi step process.
-To mark an API as experimental, the symbols which are desired to be exported
-must be placed in an EXPERIMENTAL version block in the corresponding libraries'
-version map script.
-Secondly, the corresponding prototypes of those exported functions (in the
-development header files), must be marked with the ``__rte_experimental`` tag
-(see ``rte_compat.h``).
-The DPDK build makefiles perform a check to ensure that the map file and the
-C code reflect the same list of symbols.
-This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
-during compilation in the corresponding library Makefile.
-
-In addition to tagging the code with ``__rte_experimental``,
-the doxygen markup must also contain the EXPERIMENTAL string,
-and the MAINTAINERS file should note the EXPERIMENTAL libraries.
-
-For removing the experimental tag associated with an API, deprecation notice
-is not required. Though, an API should remain in experimental state for at least
-one release. Thereafter, normal process of posting patch for review to mailing
-list can be followed.
-
-
-Library versioning
-------------------
-
-Downstreams might want to provide different DPDK releases at the same time to
-support multiple consumers of DPDK linked against older and newer sonames.
-
-Also due to the interdependencies that DPDK libraries can have applications
-might end up with an executable space in which multiple versions of a library
-are mapped by ld.so.
-
-Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
-depending on LibA.
-
-.. note::
-
-    Application
-    \-> LibA.old
-    \-> LibB.new -> LibA.new
-
-That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
-If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
-library - versions defined in the libraries ``LIBABIVER``.
-An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
-``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
-
-
-ABI versioning
---------------
-
-Versioning Macros
-~~~~~~~~~~~~~~~~~
-
-When a symbol is exported from a library to provide an API, it also provides a
-calling convention (ABI) that is embodied in its name, return type and
-arguments. Occasionally that function may need to change to accommodate new
-functionality or behavior. When that occurs, it is desirable to allow for
-backward compatibility for a time with older binaries that are dynamically
-linked to the DPDK.
-
-To support backward compatibility the ``rte_function_versioning.h``
-header file provides macros to use when updating exported functions. These
-macros are used in conjunction with the ``rte_<library>_version.map`` file for
-a given library to allow multiple versions of a symbol to exist in a shared
-library so that older binaries need not be immediately recompiled.
-
-The macros exported are:
-
-* ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
-  versioned symbol ``b@DPDK_n`` to the internal function ``be``.
-
-* ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
-  the linker to bind references to symbol ``b`` to the internal symbol
-  ``be``.
-
-* ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
-  fully qualified function ``p``, so that if a symbol becomes versioned, it
-  can still be mapped back to the public symbol name.
-
-* ``__vsym``:  Annotation to be used in a declaration of the internal symbol
-  ``be`` to signal that it is being used as an implementation of a particular
-  version of symbol ``b``.
-
-Examples of ABI Macro use
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Updating a public API
-_____________________
-
-Assume we have a function as follows
-
-.. code-block:: c
-
- /*
-  * Create an acl context object for apps to
-  * manipulate
-  */
- struct rte_acl_ctx *
- rte_acl_create(const struct rte_acl_param *param)
- {
-        ...
- }
-
-
-Assume that struct rte_acl_ctx is a private structure, and that a developer
-wishes to enhance the acl api so that a debugging flag can be enabled on a
-per-context basis.  This requires an addition to the structure (which, being
-private, is safe), but it also requires modifying the code as follows
-
-.. code-block:: c
-
- /*
-  * Create an acl context object for apps to
-  * manipulate
-  */
- struct rte_acl_ctx *
- rte_acl_create(const struct rte_acl_param *param, int debug)
- {
-        ...
- }
-
-
-Note also that, being a public function, the header file prototype must also be
-changed, as must all the call sites, to reflect the new ABI footprint.  We will
-maintain previous ABI versions that are accessible only to previously compiled
-binaries
-
-The addition of a parameter to the function is ABI breaking as the function is
-public, and existing application may use it in its current form.  However, the
-compatibility macros in DPDK allow a developer to use symbol versioning so that
-multiple functions can be mapped to the same public symbol based on when an
-application was linked to it.  To see how this is done, we start with the
-requisite libraries version map file.  Initially the version map file for the
-acl library looks like this
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_create;
-        rte_acl_dump;
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-This file needs to be modified as follows
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_create;
-        rte_acl_dump;
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-   DPDK_2.1 {
-        global:
-        rte_acl_create;
-
-   } DPDK_2.0;
-
-The addition of the new block tells the linker that a new version node is
-available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
-symbols from the DPDK_2.0 node.  This list is directly translated into a list of
-exported symbols when DPDK is compiled as a shared library
-
-Next, we need to specify in the code which function map to the rte_acl_create
-symbol at which versions.  First, at the site of the initial symbol definition,
-we need to update the function so that it is uniquely named, and not in conflict
-with the public symbol name
-
-.. code-block:: c
-
- -struct rte_acl_ctx *
- -rte_acl_create(const struct rte_acl_param *param)
- +struct rte_acl_ctx * __vsym
- +rte_acl_create_v20(const struct rte_acl_param *param)
- {
-        size_t sz;
-        struct rte_acl_ctx *ctx;
-        ...
-
-Note that the base name of the symbol was kept intact, as this is conducive to
-the macros used for versioning symbols and we have annotated the function as an
-implementation of versioned symbol.  That is our next step, mapping this new
-symbol name to the initial symbol name at version node 2.0.  Immediately after
-the function, we add this line of code
-
-.. code-block:: c
-
-   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
-
-Remembering to also add the rte_function_versioning.h header to the requisite c file where
-these changes are being made.  The above macro instructs the linker to create a
-new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
-builds, but now points to the above newly named function.  We have now mapped
-the original rte_acl_create symbol to the original function (but with a new
-name)
-
-Next, we need to create the 2.1 version of the symbol.  We create a new function
-name, with a different suffix, and  implement it appropriately
-
-.. code-block:: c
-
-   struct rte_acl_ctx * __vsym
-   rte_acl_create_v21(const struct rte_acl_param *param, int debug);
-   {
-        struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
-
-        ctx->debug = debug;
-
-        return ctx;
-   }
-
-This code serves as our new API call.  Its the same as our old call, but adds
-the new parameter in place.  Next we need to map this function to the symbol
-``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
-in the header file, adding the macro there to inform all including applications,
-that on re-link, the default rte_acl_create symbol should point to this
-function.  Note that we could do this by simply naming the function above
-rte_acl_create, and the linker would chose the most recent version tag to apply
-in the version script, but we can also do this in the header file
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   -rte_acl_create(const struct rte_acl_param *param);
-   +rte_acl_create(const struct rte_acl_param *param, int debug);
-   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
-
-The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
-header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
-version node to it.  This method is more explicit and flexible than just
-re-implementing the exact symbol name, and allows for other features (such as
-linking to the old symbol version by default, when the new ABI is to be opt-in
-for a period.
-
-One last thing we need to do.  Note that we've taken what was a public symbol,
-and duplicated it into two uniquely and differently named symbols.  We've then
-mapped each of those back to the public symbol ``rte_acl_create`` with different
-version tags.  This only applies to dynamic linking, as static linking has no
-notion of versioning.  That leaves this code in a position of no longer having a
-symbol simply named ``rte_acl_create`` and a static build will fail on that
-missing symbol.
-
-To correct this, we can simply map a function of our choosing back to the public
-symbol in the static build with the ``MAP_STATIC_SYMBOL`` macro.  Generally the
-assumption is that the most recent version of the symbol is the one you want to
-map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
-defined, we add this
-
-.. code-block:: c
-
-   struct rte_acl_ctx * __vsym
-   rte_acl_create_v21(const struct rte_acl_param *param, int debug)
-   {
-        ...
-   }
-   MAP_STATIC_SYMBOL(struct rte_acl_ctx *rte_acl_create(const struct rte_acl_param *param, int debug), rte_acl_create_v21);
-
-That tells the compiler that, when building a static library, any calls to the
-symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
-
-That's it, on the next shared library rebuild, there will be two versions of
-rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
-and a new DPDK_2.1 version, used by future built applications.
-
-
-Deprecating part of a public API
-________________________________
-
-Lets assume that you've done the above update, and after a few releases have
-passed you decide you would like to retire the old version of the function.
-After having gone through the ABI deprecation announcement process, removal is
-easy.  Start by removing the symbol from the requisite version map file:
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_dump;
- -      rte_acl_create
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-   DPDK_2.1 {
-        global:
-        rte_acl_create;
-   } DPDK_2.0;
-
-
-Next remove the corresponding versioned export.
-
-.. code-block:: c
-
- -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
-
-
-Note that the internal function definition could also be removed, but its used
-in our example by the newer version _v21, so we leave it in place.  This is a
-coding style choice.
-
-Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
-indicate to applications doing dynamic linking that this is a later, and
-possibly incompatible library version:
-
-.. code-block:: c
-
-   -LIBABIVER := 1
-   +LIBABIVER := 2
-
-Deprecating an entire ABI version
-_________________________________
-
-While removing a symbol from and ABI may be useful, it is often more practical
-to remove an entire version node at once.  If a version node completely
-specifies an API, then removing part of it, typically makes it incomplete.  In
-those cases it is better to remove the entire node
-
-To do this, start by modifying the version map file, such that all symbols from
-the node to be removed are merged into the next node in the map
-
-In the case of our map above, it would transform to look as follows
-
-.. code-block:: none
-
-   DPDK_2.1 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_dump;
-        rte_acl_create
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
- };
-
-Then any uses of BIND_DEFAULT_SYMBOL that pointed to the old node should be
-updated to point to the new version node in any header files for all affected
-symbols.
-
-.. code-block:: c
-
- -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
- +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
-
-Lastly, any VERSION_SYMBOL macros that point to the old version node should be
-removed, taking care to keep, where need old code in place to support newer
-versions of the symbol.
-
-
-Running the ABI Validator
--------------------------
-
-The ``devtools`` directory in the DPDK source tree contains a utility program,
-``validate-abi.sh``, for validating the DPDK ABI based on the Linux `ABI
-Compliance Checker
-<http://ispras.linuxbase.org/index.php/ABI_compliance_checker>`_.
-
-This has a dependency on the ``abi-compliance-checker`` and ``and abi-dumper``
-utilities which can be installed via a package manager. For example::
-
-   sudo yum install abi-compliance-checker
-   sudo yum install abi-dumper
-
-The syntax of the ``validate-abi.sh`` utility is::
-
-   ./devtools/validate-abi.sh <REV1> <REV2>
-
-Where ``REV1`` and ``REV2`` are valid gitrevisions(7)
-https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
-on the local repo.
-
-For example::
-
-   # Check between the previous and latest commit:
-   ./devtools/validate-abi.sh HEAD~1 HEAD
-
-   # Check on a specific compilation target:
-   ./devtools/validate-abi.sh -t x86_64-native-linux-gcc HEAD~1 HEAD
-
-   # Check between two tags:
-   ./devtools/validate-abi.sh v2.0.0 v2.1.0
-
-   # Check between git master and local topic-branch "vhost-hacking":
-   ./devtools/validate-abi.sh master vhost-hacking
-
-After the validation script completes (it can take a while since it need to
-compile both tags) it will create compatibility reports in the
-``./abi-check/compat_report`` directory. Listed incompatibilities can be found
-as follows::
-
-  grep -lr Incompatible abi-check/compat_reports/
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index fad208b..3de702a 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,7 +4,7 @@
 ABI and API Deprecation
 =======================
 
-See the :doc:`guidelines document for details of the ABI policy </contributing/versioning>`.
+See the :doc:`guidelines document for details of the ABI policy </contributing/abi_versioning>`.
 API and ABI deprecation notices are to be posted here.
 
 
-- 
2.7.4


^ permalink raw reply	[relevance 18%]

* [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major abi versions
  2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
                   ` (4 preceding siblings ...)
  2019-11-11 10:37 10% ` [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-11 11:57 10% ` Ray Kinsella
  2019-11-11 11:57 18%   ` [dpdk-dev] [PATCH v11 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
                     ` (3 more replies)
  5 siblings, 4 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 11:57 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

TL;DR abbreviation:
A major ABI version that all DPDK releases during an agreed period support. ABI
versioning is managed at a project-level, in place of library-level management.
ABI changes to add new features are permitted, as long as ABI compatibility with
the major ABI version is maintained.

Detail:
This patch introduces major ABI versions, initally released aligned with the LTS
release and maintained for one year through subsequent releases. The intention
is that the one year abi support period, will then be reviewed after the initial
year with the intention of lengthening the period for the next ABI version and
declaring new major ABI versions less frequently.

ABI changes that preserve ABI compatibility with the major ABI version are
permitted in subsequent releases. ABI changes, follow similar approval rules as
before with the additional gate of now requiring technical board approval. The
merging and release of ABI breaking changes would now be pushed to the
declaration of the next major ABI version.

This change encourages developers to maintain ABI compatibility with the major
ABI version, by promoting a permissive culture around those changes that
preserve ABI compatibility. This approach begins to align DPDK with those
projects that declare major ABI versions (e.g. version 2.x, 3.x) and support
those versions for some period, typically two years or more.

To provide an example of how this might work in practice:

 * DPDK v20 is declared as the supported ABI version for one year, aligned with
   the DPDK v19.11 (LTS) release. All library sonames are updated to reflect the
   new ABI version, e.g. librte_eal.so.20, librte_acl.so.20...
 * DPDK v20.02 .. v20.08 releases are ABI compatible with the DPDK v20 ABI. ABI
   changes are permitted from DPDK v20.02 onwards, with the condition that ABI
   compatibility with DPDK v20 is preserved.
 * DPDK v21 is declared as the new supported ABI version for two years, aligned
   with the DPDK v20.11 (LTS) release. The DPDK v20 ABI is now depreciated,
   library sonames are updated to v21 and ABI compatibility breaking changes may
   be introduced.

v11
 * Neglected to rebase the v10 onto origin/master, fixed in v11.

v10
 * Fixed the upwording on experimental libraries in summary.

v9
 * Loosened up word around when new major ABI's are declared.
   (as suggested by Thomas Monjalon and agreed at the Techboard)

v8
 * Fixed intermediate build warnings, figure annotations and typo's.
   (as suggested by John McNamara).

v7
 * PNGs are now SVG. Some additional clarifications. Fixed typos and grammatical
   errors. (as suggested by Thomas Monjalon and David Marchand)

v6
 * Added figure to abi_policy.rst, comparing and contrasting the DPDK abi and
   api. (as suggested by Aaron Conole)

v5
 * Added figure to abi_policy.rst, mapping abi versions and abi compatibility to
   DPDK releases. (as suggested by Neil Horman)

v4
 * Removed changes to stable.rst, fixed typos and clarified the ABI policy
   "warning".

v3
 * Added myself as the maintainer of the ABI policy.
 * Updated the policy and versioning guides to use the year of the LTS+1 (e.g.
   v20), as the abi major version number.

v2
 * Restructured the patch into 3 patches:
   1. Splits the original versioning document into an ABI policy document
     and ABI versioning document.
   2. Add changes to the policy document introducing major ABI versions.
   3. Fixes up the versioning document in light of major ABI versioning. 
 * Reduces the initial ABI stability from two years to one year, with a review
   after the first year.
 * Adds detail around ABI version handling for experimental libraries.
 * Adds detail around chain of responsility for removing deprecated symbols.

Ray Kinsella (3):
  doc: separate versioning.rst into version and policy
  doc: changes to abi policy introducing major abi versions
  doc: updates to versioning guide for abi versions

 MAINTAINERS                                        |    4 +
 doc/guides/contributing/abi_policy.rst             |  327 ++++++
 doc/guides/contributing/abi_versioning.rst         |  521 ++++++++++
 .../contributing/img/abi_stability_policy.svg      | 1059 ++++++++++++++++++++
 doc/guides/contributing/img/what_is_an_abi.svg     |  382 +++++++
 doc/guides/contributing/index.rst                  |    3 +-
 doc/guides/contributing/patches.rst                |    6 +-
 doc/guides/contributing/stable.rst                 |   12 +-
 doc/guides/contributing/versioning.rst             |  597 -----------
 doc/guides/rel_notes/deprecation.rst               |    6 +-
 10 files changed, 2305 insertions(+), 612 deletions(-)
 create mode 100644 doc/guides/contributing/abi_policy.rst
 create mode 100644 doc/guides/contributing/abi_versioning.rst
 create mode 100644 doc/guides/contributing/img/abi_stability_policy.svg
 create mode 100644 doc/guides/contributing/img/what_is_an_abi.svg
 delete mode 100644 doc/guides/contributing/versioning.rst

-- 
2.7.4


^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-11 11:15  0%                       ` Ferruh Yigit
@ 2019-11-11 11:33  0%                         ` Matan Azrad
  2019-11-11 12:21  0%                           ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2019-11-11 11:33 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev



From: Ferruh Yigit
> On 11/9/2019 6:20 PM, Matan Azrad wrote:
> > Hi
> >
> > From: Ferruh Yigit
> >> On 11/8/2019 11:56 AM, Matan Azrad wrote:
> >>>
> >>>
> >>> From: Ferruh Yigit
> >>>> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> >>>>>
> >>>>>
> >>>>> From: Ferruh Yigit
> >>>>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> >>>>>>> Hi
> >>>>>>>
> >>>>>>> From: Ferruh Yigit
> >>>>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> >>>>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> >>>>>>>>>
> >>>>>>>> 	RTE_ETHER_MAX_LEN;
> >>>>>>>>>  	}
> >>>>>>>>>
> >>>>>>>>> +	/*
> >>>>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
> >>>> packet
> >>>>>>>>> +	 * size is supported by the configured device.
> >>>>>>>>> +	 */
> >>>>>>>>> +	if (dev_conf->rxmode.offloads &
> >>>> DEV_RX_OFFLOAD_TCP_LRO) {
> >>>>>>>>> +		ret = check_lro_pkt_size(
> >>>>>>>>> +				port_id, dev_conf-
> >>>>>>>>> rxmode.max_lro_pkt_size,
> >>>>>>>>> +				dev_info.max_lro_pkt_size);
> >>>>>>>>> +		if (ret != 0)
> >>>>>>>>> +			goto rollback;
> >>>>>>>>> +	}
> >>>>>>>>> +
> >>>>>>>>
> >>>>>>>> This check forces applications that enable LRO to provide
> >>>>>> 'max_lro_pkt_size'
> >>>>>>>> config value.
> >>>>>>>
> >>>>>>> Yes.(we can break an API, we noticed it)
> >>>>>>
> >>>>>> I am not talking about API/ABI breakage, that part is OK.
> >>>>>> With this check, if the application requested LRO offload but not
> >>>>>> provided 'max_lro_pkt_size' value, device configuration will fail.
> >>>>>>
> >>>>> Yes
> >>>>>> Can there be a case application is good with whatever the PMD can
> >>>>>> support as max?
> >>>>> Yes can be - you know, we can do everything we want but it is
> >>>>> better to be
> >>>> consistent:
> >>>>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> >>>>> offload, max
> >>>> lro pkt len should be mandatory for LRO offload.
> >>>>>
> >>>>> So your question is actually why both, non-lro packets and LRO
> >>>>> packets max
> >>>> size are mandatory...
> >>>>>
> >>>>>
> >>>>> I think it should be important values for net applications management.
> >>>>> Also good for mbuf size managements.
> >>>>>
> >>>>>>>
> >>>>>>>> - Why it is mandatory now, how it was working before if it is
> >>>>>>>> mandatory value?
> >>>>>>>
> >>>>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> >>>>>>> frame
> >>>>>> offload.
> >>>>>>> So now, when the user configures a LRO offload he must to set
> >>>>>>> max lro pkt
> >>>>>> len.
> >>>>>>> We don't want to confuse the user here with the max rx pkt len
> >>>>>> configurations and behaviors, they should be with same logic.
> >>>>>>>
> >>>>>>> This parameter defines well the LRO behavior.
> >>>>>>> Before this, each PMD took its own interpretation to what should
> >>>>>>> be the
> >>>>>> maximum size for LRO aggregated packets.
> >>>>>>> Now, the user must say what is his intension, and the ethdev can
> >>>>>>> limit it
> >>>>>> according to the device capability.
> >>>>>>> By this way, also, the PMD can organize\optimize its data-path
> more.
> >>>>>>> Also, the application can create different mempools for LRO
> >>>>>>> queues to
> >>>>>> allow bigger packet receiving for LRO traffic.
> >>>>>>>
> >>>>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it
> >>>>>>>> is
> >> '0'?
> >>>>>>> Yes, you can see the feature description Dekel added.
> >>>>>>> This patch also updates all the PMDs support an LRO for non-0
> value.
> >>>>>>
> >>>>>> Of course I can see the updates Matan, my point is "What happens
> >>>>>> if PMD doesn't provide 'max_lro_pkt_size'",
> >>>>>> 1) There is no check for it right, so it is acceptable?
> >>>>>
> >>>>> There is check.
> >>>>> If the capability is 0, any non-zero configuration will fail.
> >>>>>
> >>>>>> 2) Are we making this filed mandatory to provide for PMDs, it is
> >>>>>> easy to make new fields mandatory for PMDs but is this really
> >> necessary?
> >>>>>
> >>>>> Yes, for consistence.
> >>>>>
> >>>>>>>
> >>>>>>> as same as max rx pkt len, no?
> >>>>>>>
> >>>>>>>> - What do you think setting 'max_lro_pkt_size' config value to
> >>>>>>>> what PMD provided if application doesn't provide it?
> >>>>>>> Same answers as above.
> >>>>>>>
> >>>>>>
> >>>>>> If application doesn't care the value, as it has been till now,
> >>>>>> and not provided explicit 'max_lro_pkt_size', why not ethdev
> >>>>>> level use the value provided by PMD instead of failing?
> >>>>>
> >>>>> Again, same question we can ask on max rx pkt len.
> >>>>>
> >>>>> Looks like the packet size is very important value which should be
> >>>>> set by
> >>>> the application.
> >>>>>
> >>>>> Previous applications have no option to configure it, so they
> >>>>> haven't
> >>>> configure it, (probably cover it somehow) I think it is our miss to
> >>>> supply this info.
> >>>>>
> >>>>> Let's do it in same way as we do max rx pkt len (as this patch main
> idea).
> >>>>> Later, we can change both to other meaning.
> >>>>>
> >>>>
> >>>> I think it is not a good reason to introduce a new mandatory config
> >>>> option for application because of 'max_rx_pkt_len' does it.
> >>>
> >>> It is mandatory only if LRO offload is configured.
> >>>
> >>>> Will it work, if:
> >>>> - If application doesn't provide this value, use the PMD max
> >>>
> >>> May cause a problem if the mbuf size is not enough for the PMD
> maximum.
> >>
> >> OK, this is what I was missing, for this case I was thinking
> >> max_rx_pkt_len will be used but you already explained that
> >> application may want to use different mempools for LRO queues.
> >>
> > So , are you agree with the idea?
> >
> >> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
> >> account and program the device accordingly (of course in LRO enabled
> >> case) ?
> >> This part seems missing and should be highlighted to other PMD
> maintainers.
> >
> >
> > Yes, you are right.
> > PMDs must limit the LRO aggregated packet according to the new field,
> > And it probably very hard for the patch introducer to understand how to do
> it for each PMD.
> >
> > I think each new configuration requires other maintainers\developers to
> adjust their own PMD code to the new configuration and it should be done in
> limited time.
> 
> Agree.
> But experience showed that this synchronization is not as easy as it sounds,
> whoever changing the interface/library says other PMDs should reflect the
> change but most of the times other PMD maintainers not aware of it or if
> they do they have other priorities for the release, so the changes should be
> in a way to give more time to PMDs to adapt it and during this time library
> change shouldn't break other PMDs.
> 

Yes.

> > My suggestion here:
> > 1. To reserve the info field and the configuration field for rc2.(if
> > it is critical not to break ABI for rc3) 2. To merge the ethdev patch in the
> start of rc3.
> > 3. Request each relevant PMD to adjust its PMD to the new configuration
> for the end of rc3.
> > 	Note: this should be small change and only for ~5 PMDs:
> > 		a. Introduce the info field according to the device ability.
> > 		b. For each LRO queue:
> > 			Use the LRO max size configuration instead of the
> current max rx pkt len configuration(looks like small condition).
> >
> > What do you think?
> 
> There is already a v6 which only updates dev_info fields to have the
> 'max_lro_pktlen' field, the PMD updates there also looks safe, so I think we
> can go with it for rc2.
> 

Doesn’t make sense to expose the info field without the configuration.


> For the configuration part, I suggest deferring it next release, which gives
> more time for discussion and enough time for other PMDs to implement it.
> 
> 
> And related configuration, right now devices already configured to limit the
> packet size to 'max_rx_pkt_len', it can be an optimization to increase it to
> 'max_lro_pkt_len' for the queues LRO is supported, why not make this
> configuration more explicitly with specific API as Konstantin suggested [1],
> this way it only affects the applications that are interested in and the PMDs
> that want to support this.
> Current implementation is under 'rte_eth_dev_configure()' which is used by
> all DPDK applications and impact of changing it is much larger, also it makes
> mandatory for applications to provide this config option when LRO enabled,
> explicit API gives same result without making a mandatory config option.
> 
> [1]
> int rte_eth_dev_set_max_lro(uint16_t port_id, uint32_t lro);

Please see my answers to Konstantin regarding this topic.



One more option:
In order to not break PMDs because of this feature:
0 in the capability field means, The PMD doesn't support LRO special limitation so if the application configuration is not the same like max_rx_pkt_len the validation will fail.







^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-09 18:20  3%                     ` Matan Azrad
  2019-11-10 23:40  0%                       ` Ananyev, Konstantin
@ 2019-11-11 11:15  0%                       ` Ferruh Yigit
  2019-11-11 11:33  0%                         ` Matan Azrad
  1 sibling, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-11 11:15 UTC (permalink / raw)
  To: Matan Azrad, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

On 11/9/2019 6:20 PM, Matan Azrad wrote:
> Hi
> 
> From: Ferruh Yigit
>> On 11/8/2019 11:56 AM, Matan Azrad wrote:
>>>
>>>
>>> From: Ferruh Yigit
>>>> On 11/8/2019 10:10 AM, Matan Azrad wrote:
>>>>>
>>>>>
>>>>> From: Ferruh Yigit
>>>>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
>>>>>>> Hi
>>>>>>>
>>>>>>> From: Ferruh Yigit
>>>>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
>>>>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>>>>>>>>>
>>>>>>>> 	RTE_ETHER_MAX_LEN;
>>>>>>>>>  	}
>>>>>>>>>
>>>>>>>>> +	/*
>>>>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
>>>> packet
>>>>>>>>> +	 * size is supported by the configured device.
>>>>>>>>> +	 */
>>>>>>>>> +	if (dev_conf->rxmode.offloads &
>>>> DEV_RX_OFFLOAD_TCP_LRO) {
>>>>>>>>> +		ret = check_lro_pkt_size(
>>>>>>>>> +				port_id, dev_conf-
>>>>>>>>> rxmode.max_lro_pkt_size,
>>>>>>>>> +				dev_info.max_lro_pkt_size);
>>>>>>>>> +		if (ret != 0)
>>>>>>>>> +			goto rollback;
>>>>>>>>> +	}
>>>>>>>>> +
>>>>>>>>
>>>>>>>> This check forces applications that enable LRO to provide
>>>>>> 'max_lro_pkt_size'
>>>>>>>> config value.
>>>>>>>
>>>>>>> Yes.(we can break an API, we noticed it)
>>>>>>
>>>>>> I am not talking about API/ABI breakage, that part is OK.
>>>>>> With this check, if the application requested LRO offload but not
>>>>>> provided 'max_lro_pkt_size' value, device configuration will fail.
>>>>>>
>>>>> Yes
>>>>>> Can there be a case application is good with whatever the PMD can
>>>>>> support as max?
>>>>> Yes can be - you know, we can do everything we want but it is better
>>>>> to be
>>>> consistent:
>>>>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
>>>>> offload, max
>>>> lro pkt len should be mandatory for LRO offload.
>>>>>
>>>>> So your question is actually why both, non-lro packets and LRO
>>>>> packets max
>>>> size are mandatory...
>>>>>
>>>>>
>>>>> I think it should be important values for net applications management.
>>>>> Also good for mbuf size managements.
>>>>>
>>>>>>>
>>>>>>>> - Why it is mandatory now, how it was working before if it is
>>>>>>>> mandatory value?
>>>>>>>
>>>>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
>>>>>>> frame
>>>>>> offload.
>>>>>>> So now, when the user configures a LRO offload he must to set max
>>>>>>> lro pkt
>>>>>> len.
>>>>>>> We don't want to confuse the user here with the max rx pkt len
>>>>>> configurations and behaviors, they should be with same logic.
>>>>>>>
>>>>>>> This parameter defines well the LRO behavior.
>>>>>>> Before this, each PMD took its own interpretation to what should
>>>>>>> be the
>>>>>> maximum size for LRO aggregated packets.
>>>>>>> Now, the user must say what is his intension, and the ethdev can
>>>>>>> limit it
>>>>>> according to the device capability.
>>>>>>> By this way, also, the PMD can organize\optimize its data-path more.
>>>>>>> Also, the application can create different mempools for LRO queues
>>>>>>> to
>>>>>> allow bigger packet receiving for LRO traffic.
>>>>>>>
>>>>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
>> '0'?
>>>>>>> Yes, you can see the feature description Dekel added.
>>>>>>> This patch also updates all the PMDs support an LRO for non-0 value.
>>>>>>
>>>>>> Of course I can see the updates Matan, my point is "What happens if
>>>>>> PMD doesn't provide 'max_lro_pkt_size'",
>>>>>> 1) There is no check for it right, so it is acceptable?
>>>>>
>>>>> There is check.
>>>>> If the capability is 0, any non-zero configuration will fail.
>>>>>
>>>>>> 2) Are we making this filed mandatory to provide for PMDs, it is
>>>>>> easy to make new fields mandatory for PMDs but is this really
>> necessary?
>>>>>
>>>>> Yes, for consistence.
>>>>>
>>>>>>>
>>>>>>> as same as max rx pkt len, no?
>>>>>>>
>>>>>>>> - What do you think setting 'max_lro_pkt_size' config value to
>>>>>>>> what PMD provided if application doesn't provide it?
>>>>>>> Same answers as above.
>>>>>>>
>>>>>>
>>>>>> If application doesn't care the value, as it has been till now, and
>>>>>> not provided explicit 'max_lro_pkt_size', why not ethdev level use
>>>>>> the value provided by PMD instead of failing?
>>>>>
>>>>> Again, same question we can ask on max rx pkt len.
>>>>>
>>>>> Looks like the packet size is very important value which should be
>>>>> set by
>>>> the application.
>>>>>
>>>>> Previous applications have no option to configure it, so they
>>>>> haven't
>>>> configure it, (probably cover it somehow) I think it is our miss to
>>>> supply this info.
>>>>>
>>>>> Let's do it in same way as we do max rx pkt len (as this patch main idea).
>>>>> Later, we can change both to other meaning.
>>>>>
>>>>
>>>> I think it is not a good reason to introduce a new mandatory config
>>>> option for application because of 'max_rx_pkt_len' does it.
>>>
>>> It is mandatory only if LRO offload is configured.
>>>
>>>> Will it work, if:
>>>> - If application doesn't provide this value, use the PMD max
>>>
>>> May cause a problem if the mbuf size is not enough for the PMD maximum.
>>
>> OK, this is what I was missing, for this case I was thinking max_rx_pkt_len will
>> be used but you already explained that application may want to use different
>> mempools for LRO queues.
>>
> So , are you agree with the idea?
> 
>> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
>> account and program the device accordingly (of course in LRO enabled case)
>> ?
>> This part seems missing and should be highlighted to other PMD maintainers.
> 
> 
> Yes, you are right.
> PMDs must limit the LRO aggregated packet according to the new field,
> And it probably very hard for the patch introducer to understand how to do it for each PMD. 
> 
> I think each new configuration requires other maintainers\developers to adjust their own PMD code to the new configuration and it should be done in limited time.

Agree.
But experience showed that this synchronization is not as easy as it sounds,
whoever changing the interface/library says other PMDs should reflect the change
but most of the times other PMD maintainers not aware of it or if they do they
have other priorities for the release, so the changes should be in a way to give
more time to PMDs to adapt it and during this time library change shouldn't
break other PMDs.

> 
> My suggestion here:
> 1. To reserve the info field and the configuration field for rc2.(if it is critical not to break ABI for rc3)
> 2. To merge the ethdev patch in the start of rc3.
> 3. Request each relevant PMD to adjust its PMD to the new configuration for the end of rc3.
> 	Note: this should be small change and only for ~5 PMDs:
> 		a. Introduce the info field according to the device ability.
> 		b. For each LRO queue:
> 			Use the LRO max size configuration instead of the current max rx pkt len configuration(looks like small condition). 
> 
> What do you think?

There is already a v6 which only updates dev_info fields to have the
'max_lro_pktlen' field, the PMD updates there also looks safe, so I think we can
go with it for rc2.

For the configuration part, I suggest deferring it next release, which gives
more time for discussion and enough time for other PMDs to implement it.


And related configuration, right now devices already configured to limit the
packet size to 'max_rx_pkt_len', it can be an optimization to increase it to
'max_lro_pkt_len' for the queues LRO is supported, why not make this
configuration more explicitly with specific API as Konstantin suggested [1],
this way it only affects the applications that are interested in and the PMDs
that want to support this.
Current implementation is under 'rte_eth_dev_configure()' which is used by all
DPDK applications and impact of changing it is much larger, also it makes
mandatory for applications to provide this config option when LRO enabled,
explicit API gives same result without making a mandatory config option.

[1]
int rte_eth_dev_set_max_lro(uint16_t port_id, uint32_t lro);


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions
  2019-11-08 17:38  5%       ` Thomas Monjalon
@ 2019-11-11 11:03  5%         ` Ray Kinsella
  0 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 11:03 UTC (permalink / raw)
  To: Thomas Monjalon, dpdk-dev



On 08/11/2019 17:38, Thomas Monjalon wrote:
> 08/11/2019 18:12, Ray Kinsella:
>> On 08/11/2019 17:11, Thomas Monjalon wrote:
>>> 08/11/2019 13:46, Ray Kinsella:
>>>> +#. The ABI version is managed at a project level in DPDK, with the ABI version
>>>> +   reflected in all library's soname.
>>>
>>> It is not specifying the experimental lib exception.
>>> But I can live without it.
>>
>> I will fix in a follow up on Monday.
> 
> If you send a new version, please rebase as there was a change in master
> with LTO series. Thanks

Balls, neglected to rebase before sending the v10.
I will take care of it.

Ray K

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v2] ethdev: reserve space in main structs for extension
  2019-11-11  7:26  4% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
@ 2019-11-11 10:54  0%   ` Ferruh Yigit
  2019-11-11 16:22  0%     ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-11 10:54 UTC (permalink / raw)
  To: Thomas Monjalon, Andrew Rybchenko; +Cc: dev

On 11/11/2019 7:26 AM, Thomas Monjalon wrote:
> In order to allow smooth addition of features without breaking
> ABI compatibility, some space is reserved in several core structs
> of ethdev API.
> 
> The struct rte_eth_dev and rte_eth_dev_data are supposed
> to be used internally only, but there is a chance that
> increasing their size would break ABI for some applications.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>

Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v10 2/3] doc: changes to abi policy introducing major abi versions
  2019-11-11 10:37 10% ` [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
  2019-11-11 10:37 18%   ` [dpdk-dev] [PATCH v10 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
@ 2019-11-11 10:37 23%   ` Ray Kinsella
  2019-11-11 10:37 35%   ` [dpdk-dev] [PATCH v10 3/3] doc: updates to versioning guide for " Ray Kinsella
  2 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 10:37 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

This policy change introduces major ABI versions, these are
declared every year, typically aligned with the LTS release
and are supported by subsequent releases in the following year.
This change is intended to improve ABI stabilty for those projects
consuming DPDK.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/contributing/abi_policy.rst             |  325 ++++--
 .../contributing/img/abi_stability_policy.svg      | 1059 ++++++++++++++++++++
 doc/guides/contributing/img/what_is_an_abi.svg     |  382 +++++++
 doc/guides/contributing/stable.rst                 |   12 +-
 4 files changed, 1687 insertions(+), 91 deletions(-)
 create mode 100644 doc/guides/contributing/img/abi_stability_policy.svg
 create mode 100644 doc/guides/contributing/img/what_is_an_abi.svg

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index d4f4e9f..81b617c 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -1,31 +1,48 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright 2018 The DPDK contributors
+    Copyright 2019 The DPDK contributors
 
-DPDK ABI/API policy
-===================
+ABI Policy
+==========
 
 Description
 -----------
 
-This document details some methods for handling ABI management in the DPDK.
+This document details the management policy that ensures the long-term stability
+of the DPDK ABI and API.
 
 General Guidelines
 ------------------
 
-#. Whenever possible, ABI should be preserved
-#. ABI/API may be changed with a deprecation process
-#. The modification of symbols can generally be managed with versioning
-#. Libraries or APIs marked in ``experimental`` state may change without constraint
-#. New APIs will be marked as ``experimental`` for at least one release to allow
-   any issues found by users of the new API to be fixed quickly
-#. The addition of symbols is generally not problematic
-#. The removal of symbols generally is an ABI break and requires bumping of the
-   LIBABIVER macro
-#. Updates to the minimum hardware requirements, which drop support for hardware which
-   was previously supported, should be treated as an ABI change.
-
-What is an ABI
-~~~~~~~~~~~~~~
+#. Major ABI versions are declared no more frequently than yearly. Compatibility
+   with the major ABI version is mandatory in subsequent releases until a new
+   major ABI version is declared.
+#. Major ABI versions are usually but not always declared aligned with a
+   :ref:`LTS release <stable_lts_releases>`.
+#. The ABI version is managed at a project level in DPDK, and is reflected in
+   all non-experimental library's soname. 
+#. The ABI should be preserved and not changed lightly. ABI changes must follow
+   the outlined :ref:`deprecation process <abi_changes>`.
+#. The addition of symbols is generally not problematic. The modification of
+   symbols is managed with ABI Versioning.
+#. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
+   once approved these will form part of the next ABI version.
+#. Libraries or APIs marked as :ref:`experimental <experimental_apis>` may
+   change without constraint, as they are not considered part of an ABI version.
+   Experimental libraries have the major ABI version ``0``.
+#. Updates to the :ref:`minimum hardware requirements <hw_rqmts>`, which drop
+   support for hardware which was previously supported, should be treated as an
+   ABI change.
+
+.. note::
+
+   In 2019, the DPDK community stated its intention to move to ABI stable
+   releases, over a number of release cycles. This change begins with
+   maintaining ABI stability through one year of DPDK releases starting from
+   DPDK 19.11. This policy will be reviewed in 2020, with intention of
+   lengthening the stability period.
+
+What is an ABI?
+~~~~~~~~~~~~~~~
 
 An ABI (Application Binary Interface) is the set of runtime interfaces exposed
 by a library. It is similar to an API (Application Programming Interface) but
@@ -37,30 +54,82 @@ Therefore, in the case of dynamic linking, it is critical that an ABI is
 preserved, or (when modified), done in such a way that the application is unable
 to behave improperly or in an unexpected fashion.
 
+.. _figure_what_is_an_abi:
+
+.. figure:: img/what_is_an_abi.*
+
+	    Illustration of DPDK API and ABI.
 
-ABI/API Deprecation
--------------------
+
+What is an ABI version?
+~~~~~~~~~~~~~~~~~~~~~~~
+
+An ABI version is an instance of a library's ABI at a specific release. Certain
+releases are considered to be milestone releases, the yearly LTS release for
+example. The ABI of a milestone release may be declared as a 'major ABI
+version', where this ABI version is then supported for some number of subsequent
+releases and is annotated in the library's soname.
+
+ABI version support in subsequent releases facilitates application upgrades, by
+enabling applications built against the milestone release to upgrade to
+subsequent releases of a library without a rebuild.
+
+More details on major ABI version can be found in the ABI Versioning guide.
 
 The DPDK ABI policy
-~~~~~~~~~~~~~~~~~~~
+-------------------
+
+A new major ABI version is declared no more frequently than yearly, with
+declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
+Compatibility with the major ABI version is then mandatory in subsequent
+releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
+20.11.
 
-ABI versions are set at the time of major release labeling, and the ABI may
-change multiple times, without warning, between the last release label and the
-HEAD label of the git tree.
+At the declaration of a major ABI version, major version numbers encoded in
+libraries' sonames are bumped to indicate the new version, with the minor
+version reset to ``0``. An example would be ``librte_eal.so.20.3`` would become
+``librte_eal.so.21.0``.
 
-ABI versions, once released, are available until such time as their
-deprecation has been noted in the Release Notes for at least one major release
-cycle. For example consider the case where the ABI for DPDK 2.0 has been
-shipped and then a decision is made to modify it during the development of
-DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
-release and the modification will be made available in the DPDK 2.2 release.
+The ABI may then change multiple times, without warning, between the last major
+ABI version increment and the HEAD label of the git tree, with the condition
+that ABI compatibility with the major ABI version is preserved and therefore
+sonames do not change.
 
-ABI versions may be deprecated in whole or in part as needed by a given
-update.
+Minor versions are incremented to indicate the release of a new ABI compatible
+DPDK release, typically the DPDK quarterly releases. An example of this, might
+be that ``librte_eal.so.20.1`` would indicate the first ABI compatible DPDK
+release, following the declaration of the new major ABI version ``20``.
 
-Some ABI changes may be too significant to reasonably maintain multiple
-versions. In those cases ABI's may be updated without backward compatibility
-being provided. The requirements for doing so are:
+An ABI version is supported in all new releases until the next major ABI version
+is declared. When changing the major ABI version, the release notes will detail
+all ABI changes.
+
+.. _figure_abi_stability_policy:
+
+.. figure:: img/abi_stability_policy.*
+
+	    Mapping of new ABI versions and ABI version compatibility to DPDK
+	    releases.
+
+.. _abi_changes:
+
+ABI Changes
+~~~~~~~~~~~
+
+The ABI may still change after the declaration of a major ABI version, that is
+new APIs may be still added or existing APIs may be modified.
+
+.. Warning::
+
+   Note that, this policy details the method by which the ABI may be changed,
+   with due regard to preserving compatibility and observing deprecation
+   notices. This process however should not be undertaken lightly, as a general
+   rule ABI stability is extremely important for downstream consumers of DPDK.
+   The API should only be changed for significant reasons, such as performance
+   enhancements. API breakages due to changes such as reorganizing public
+   structure fields for aesthetic or readability purposes should be avoided.
+
+The requirements for changing the ABI are:
 
 #. At least 3 acknowledgments of the need to do so must be made on the
    dpdk.org mailing list.
@@ -69,34 +138,119 @@ being provided. The requirements for doing so are:
      no maintainer is available for the component, the tree/sub-tree maintainer
      for that component must acknowledge the ABI change instead.
 
+   - The acknowledgment of three members of the technical board, as delegates
+     of the `technical board <https://core.dpdk.org/techboard/>`_ acknowledging
+     the need for the ABI change, is also mandatory.
+
    - It is also recommended that acknowledgments from different "areas of
      interest" be sought for each deprecation, for example: from NIC vendors,
      CPU vendors, end-users, etc.
 
-#. The changes (including an alternative map file) can be included with
-   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
-   to provide more details about oncoming changes.
-   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
-   More preferred way to provide this information is sending the feature
-   as a separate patch and reference it in deprecation notice.
+#. Backward compatibility with the major ABI version must be maintained through
+   ABI Versioning, with :ref:`forward-only <forward-only>` compatibility
+   offered for any ABI changes that are indicated to be part of the next ABI
+   version.
 
-#. A full deprecation cycle, as explained above, must be made to offer
-   downstream consumers sufficient warning of the change.
+   - In situations where backward compatibility is not possible, read the
+     section on :ref:`abi_breakages`.
 
-Note that the above process for ABI deprecation should not be undertaken
-lightly. ABI stability is extremely important for downstream consumers of the
-DPDK, especially when distributed in shared object form. Every effort should
-be made to preserve the ABI whenever possible. The ABI should only be changed
-for significant reasons, such as performance enhancements. ABI breakage due to
-changes such as reorganizing public structure fields for aesthetic or
-readability purposes should be avoided.
+   - No backward or forward compatibility is offered for API changes marked as
+     ``experimental``, as described in the section on :ref:`Experimental APIs
+     and Libraries <experimental_apis>`.
 
-.. note::
+#. If a newly proposed API functionally replaces an existing one, when the new
+   API becomes non-experimental, then the old one is marked with
+   ``__rte_deprecated``.
+
+    - The depreciated API should follow the notification process to be removed,
+      see  :ref:`deprecation_notices`.
+
+    - At the declaration of the next major ABI version, those ABI changes then
+      become a formal part of the new ABI and the requirement to preserve ABI
+      compatibility with the last major ABI version is then dropped.
+
+    - The responsibility for removing redundant ABI compatibility code rests
+      with the original contributor of the ABI changes, failing that, then with
+      the contributor's company and then finally with the maintainer.
+
+.. _forward-only:
+
+.. Note::
+
+   Note that forward-only compatibility is offered for those changes made
+   between major ABI versions. As a library's soname can only describe
+   compatibility with the last major ABI version, until the next major ABI
+   version is declared, these changes therefore cannot be resolved as a runtime
+   dependency through the soname. Therefore any application wishing to make use
+   of these ABI changes can only ensure that its runtime dependencies are met
+   through Operating System package versioning.
+
+.. _hw_rqmts:
+
+.. Note::
 
    Updates to the minimum hardware requirements, which drop support for hardware
    which was previously supported, should be treated as an ABI change, and
-   follow the relevant deprecation policy procedures as above: 3 acks and
-   announcement at least one release in advance.
+   follow the relevant deprecation policy procedures as above: 3 acks, technical
+   board approval and announcement at least one release in advance.
+
+.. _abi_breakages:
+
+ABI Breakages
+~~~~~~~~~~~~~
+
+For those ABI changes that are too significant to reasonably maintain multiple
+symbol versions, there is an amended process. In these cases, ABIs may be
+updated without the requirement of backward compatibility being provided. These
+changes must follow the same process :ref:`described above <abi_changes>` as non-breaking
+changes, however with the following additional requirements:
+
+#. ABI breaking changes (including an alternative map file) can be included with
+   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option, to provide
+   more details about oncoming changes. ``RTE_NEXT_ABI`` wrapper will be removed
+   at the declaration of the next major ABI version.
+
+#. Once approved, and after the deprecation notice has been observed these
+   changes will form part of the next declared major ABI version.
+
+Examples of ABI Changes
+~~~~~~~~~~~~~~~~~~~~~~~
+
+The following are examples of allowable ABI changes occurring between
+declarations of major ABI versions.
+
+* DPDK 19.11 release, defines the function ``rte_foo()``, and ``rte_foo()``
+  as part of the major ABI version ``20``.
+
+* DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
+  this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
+  preserved through ABI Versioning.
+
+  - The new function may be marked with the ``__rte_experimental`` tag for a
+    number of releases, as described in the section :ref:`experimental_apis`.
+
+  - Once ``rte_foo(uint8_t bar)`` becomes non-experimental ``rte_foo()`` is then
+    declared as ``__rte_depreciated``, with an associated deprecation notice
+    provided.
+
+* DPDK 19.11 is not re-released to include ``rte_foo(uint8_t bar)``, the new
+  version of ``rte_foo`` only exists from DPDK 20.02 onwards as described in the
+  :ref:`note on forward-only compatibility<forward-only>`.
+
+* DPDK 20.02 release defines the experimental function ``__rte_experimental
+  rte_baz()``. This function may or may not exist in the DPDK 20.05 release.
+
+* An application ``dPacket`` wishes to use ``rte_foo(uint8_t bar)``, before the
+  declaration of the DPDK ``21`` major API version. The application can only
+  ensure its runtime dependencies are met by specifying ``DPDK (>= 20.2)`` as
+  an explicit package dependency, as the soname only may only indicate the
+  supported major ABI version.
+
+* At the release of DPDK 20.11, the function ``rte_foo(uint8_t bar)`` becomes
+  formally part of then new major ABI version DPDK 21.0 and ``rte_foo()`` may be
+  removed.
+
+.. _deprecation_notices:
 
 Examples of Deprecation Notices
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -104,46 +258,42 @@ Examples of Deprecation Notices
 The following are some examples of ABI deprecation notices which would be
 added to the Release Notes:
 
-* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
-  to be replaced with the inline function ``rte_foo()``.
+* The Macro ``#RTE_FOO`` is deprecated and will be removed with ABI version
+  21, to be replaced with the inline function ``rte_foo()``.
 
 * The function ``rte_mbuf_grok()`` has been updated to include a new parameter
-  in version 2.0. Backwards compatibility will be maintained for this function
-  until the release of version 2.1
+  in version 20.2. Backwards compatibility will be maintained for this function
+  until the release of the new DPDK major ABI version 21, in DPDK version
+  20.11.
 
-* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
+* The members of ``struct rte_foo`` have been reorganized in DPDK 20.02 for
   performance reasons. Existing binary applications will have backwards
-  compatibility in release 2.0, while newly built binaries will need to
-  reference the new structure variant ``struct rte_foo2``. Compatibility will
-  be removed in release 2.2, and all applications will require updating and
+  compatibility in release 20.02, while newly built binaries will need to
+  reference the new structure variant ``struct rte_foo2``. Compatibility will be
+  removed in release 20.11, and all applications will require updating and
   rebuilding to the new structure at that time, which will be renamed to the
   original ``struct rte_foo``.
 
 * Significant ABI changes are planned for the ``librte_dostuff`` library. The
-  upcoming release 2.0 will not contain these changes, but release 2.1 will,
+  upcoming release 20.02 will not contain these changes, but release 20.11 will,
   and no backwards compatibility is planned due to the extensive nature of
-  these changes. Binaries using this library built prior to version 2.1 will
+  these changes. Binaries using this library built prior to ABI version 21 will
   require updating and recompilation.
 
-New API replacing previous one
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If a new API proposed functionally replaces an existing one, when the new API
-becomes non-experimental then the old one is marked with ``__rte_deprecated``.
-Deprecated APIs are removed completely just after the next LTS.
+.. _experimental_apis:
 
-Reminder that old API should follow deprecation process to be removed.
+Experimental
+------------
 
+APIs
+~~~~
 
-Experimental APIs
------------------
-
-APIs marked as ``experimental`` are not considered part of the ABI and may
-change without warning at any time.  Since changes to APIs are most likely
-immediately after their introduction, as users begin to take advantage of
-those new APIs and start finding issues with them, new DPDK APIs will be
-automatically marked as ``experimental`` to allow for a period of stabilization
-before they become part of a tracked ABI.
+APIs marked as ``experimental`` are not considered part of an ABI version and
+may change without warning at any time. Since changes to APIs are most likely
+immediately after their introduction, as users begin to take advantage of those
+new APIs and start finding issues with them, new DPDK APIs will be automatically
+marked as ``experimental`` to allow for a period of stabilization before they
+become part of a tracked ABI version.
 
 Note that marking an API as experimental is a multi step process.
 To mark an API as experimental, the symbols which are desired to be exported
@@ -161,7 +311,16 @@ In addition to tagging the code with ``__rte_experimental``,
 the doxygen markup must also contain the EXPERIMENTAL string,
 and the MAINTAINERS file should note the EXPERIMENTAL libraries.
 
-For removing the experimental tag associated with an API, deprecation notice
-is not required. Though, an API should remain in experimental state for at least
-one release. Thereafter, normal process of posting patch for review to mailing
-list can be followed.
+For removing the experimental tag associated with an API, deprecation notice is
+not required. Though, an API should remain in experimental state for at least
+one release. Thereafter, the normal process of posting patch for review to
+mailing list can be followed.
+
+Libraries
+~~~~~~~~~
+
+Libraries marked as ``experimental`` are entirely not considered part of an ABI
+version, and may change without warning at any time. Experimental libraries
+always have a major version of ``0`` to indicate they exist outside of
+ABI Versioning, with the minor version incremented with each ABI change
+to library.
diff --git a/doc/guides/contributing/img/abi_stability_policy.svg b/doc/guides/contributing/img/abi_stability_policy.svg
new file mode 100644
index 0000000..4fd4007
--- /dev/null
+++ b/doc/guides/contributing/img/abi_stability_policy.svg
@@ -0,0 +1,1059 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1237.4869"
+   height="481.37463"
+   version="1.1"
+   viewBox="0 0 1237.4869 481.37463"
+   xml:space="preserve"
+   id="svg7800"
+   sodipodi:docname="abi_stability_policy.svg"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
+     id="metadata7804"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview7802"
+     showgrid="false"
+     inkscape:zoom="0.8875"
+     inkscape:cx="840.50495"
+     inkscape:cy="179.36692"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg7800" /><defs
+     id="defs7394"><clipPath
+       id="clipPath3975"><path
+         d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
+         id="path7226"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4003"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7229"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4025"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7232"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4037"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7235"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4049"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7238"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4061"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7241"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4073"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7244"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4085"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7247"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4097"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7250"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4109"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7253"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4121"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7256"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4133"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7259"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4145"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7262"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4157"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7265"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4169"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7268"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4181"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7271"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4193"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7274"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4205"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7277"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4217"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7280"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4229"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7283"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4241"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7286"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4253"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7289"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4265"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7292"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4277"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7295"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4289"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7298"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4301"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7301"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4313"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7304"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4327"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7307"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4339"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7310"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4351"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7313"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4363"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7316"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4375"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7319"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4389"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7322"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4403"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7325"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4417"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7328"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4429"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7331"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4441"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7334"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4453"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7337"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4477"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7340"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4489"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7343"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4501"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7346"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4513"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7349"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4525"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7352"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4537"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7355"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4549"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7358"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4561"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7361"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4573"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7364"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4589"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7367"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4601"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7370"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4615"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7373"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4629"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7376"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4641"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7379"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4653"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7382"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4673"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7385"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4685"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7388"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4699"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7391"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath></defs><g
+     id="g7406"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       style="fill:#44546a"
+       inkscape:connector-curvature="0"
+       id="path7400"
+       d="m 161.83,180.57 773.79,4.78 c 0.82,0.01 1.49,0.68 1.49,1.51 -0.01,0.83 -0.68,1.5 -1.51,1.49 l -773.79,-4.78 c -0.83,-0.01 -1.5,-0.68 -1.49,-1.51 0.01,-0.83 0.68,-1.5 1.51,-1.49 z m 772.3,1.77 8.97,4.56 -9.03,4.44 z" /><path
+       style="fill:#00b050;fill-rule:evenodd"
+       inkscape:connector-curvature="0"
+       id="path7402"
+       d="m 173.28,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       style="fill:#00b050;fill-rule:evenodd"
+       inkscape:connector-curvature="0"
+       id="path7404"
+       d="m 612.24,183.78 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /></g><g
+     style="fill:#ff0000;fill-rule:evenodd"
+     id="g7420"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       inkscape:connector-curvature="0"
+       id="path7408"
+       d="m 228.12,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7410"
+       d="m 282.96,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7412"
+       d="m 337.8,182.22 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7414"
+       d="m 447.6,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7416"
+       d="m 502.44,182.34 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7418"
+       d="m 557.28,182.34 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /></g><g
+     id="g7426"
+     clip-path="url(#clipPath4003)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7424"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,152.98,149.45)"><tspan
+         id="tspan7422"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v19.11</tspan></text>
+</g><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7428"
+     d="m 499.42541,379.9105 c 0,-6.22651 4.47989,-11.27972 9.99975,-11.27972 5.51986,0 9.99975,5.05321 9.99975,11.27972 0,6.22651 -4.47989,11.27972 -9.99975,11.27972 -5.51986,0 -9.99975,-5.05321 -9.99975,-11.27972 z" /><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7430"
+     d="m 1084.6908,373.67065 c 0,-6.22651 4.4799,-11.27971 9.9997,-11.27971 5.5199,0 9.9998,5.0532 9.9998,11.27971 0,6.22652 -4.4799,11.27972 -9.9998,11.27972 -5.5198,0 -9.9997,-5.0532 -9.9997,-11.27972 z" /><g
+     style="fill:#ff0000;fill-rule:evenodd"
+     id="g7438"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       inkscape:connector-curvature="0"
+       id="path7432"
+       d="m 667.08,185.4 c 0,4.64 3.36,8.4 7.5,8.4 4.14,0 7.5,-3.76 7.5,-8.4 0,-4.64 -3.36,-8.4 -7.5,-8.4 -4.14,0 -7.5,3.76 -7.5,8.4 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7434"
+       d="m 721.92,185.58 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7436"
+       d="m 776.76,185.58 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /></g><g
+     id="g7444"
+     clip-path="url(#clipPath4025)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7442"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,210.14,150.1)"><tspan
+         id="tspan7440"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.02</tspan></text>
+</g><g
+     id="g7450"
+     clip-path="url(#clipPath4037)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7448"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,265.01,150.1)"><tspan
+         id="tspan7446"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.05</tspan></text>
+</g><g
+     id="g7456"
+     clip-path="url(#clipPath4049)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7454"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,319.9,150.77)"><tspan
+         id="tspan7452"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.08</tspan></text>
+</g><g
+     id="g7462"
+     clip-path="url(#clipPath4061)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7460"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,375,150.94)"><tspan
+         id="tspan7458"
+         y="0"
+         x="0 7.9180322 14.992224 22.066416 25.652737 32.726929">V20.11</tspan></text>
+</g><g
+     id="g7468"
+     clip-path="url(#clipPath4073)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7466"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,429.17,150.94)"><tspan
+         id="tspan7464"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.02</tspan></text>
+</g><g
+     id="g7474"
+     clip-path="url(#clipPath4085)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7472"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,483,150.55)"><tspan
+         id="tspan7470"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v21.05</tspan></text>
+</g><g
+     id="g7480"
+     clip-path="url(#clipPath4097)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7478"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,537.38,150.82)"><tspan
+         id="tspan7476"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.08</tspan></text>
+</g><g
+     id="g7486"
+     clip-path="url(#clipPath4109)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7484"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,592.27,150.82)"><tspan
+         id="tspan7482"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.11</tspan></text>
+</g><g
+     id="g7492"
+     clip-path="url(#clipPath4121)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7490"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,647.14,151.46)"><tspan
+         id="tspan7488"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v22.02</tspan></text>
+</g><g
+     id="g7498"
+     clip-path="url(#clipPath4133)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7496"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,702.24,151.63)"><tspan
+         id="tspan7494"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.05</tspan></text>
+</g><g
+     id="g7504"
+     clip-path="url(#clipPath4145)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7502"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,756.43,151.63)"><tspan
+         id="tspan7500"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.08</tspan></text>
+</g><g
+     id="g7510"
+     clip-path="url(#clipPath4157)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7508"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,811.99,151.63)"><tspan
+         id="tspan7506"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.11</tspan></text>
+</g><g
+     id="g7516"
+     clip-path="url(#clipPath4169)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7514"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,105.82,214.18)"><tspan
+         id="tspan7512"
+         y="0"
+         x="0 6.3460798 13.46436">v20</tspan></text>
+</g><g
+     id="g7522"
+     clip-path="url(#clipPath4181)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7520"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,105.5,247.68)"><tspan
+         id="tspan7518"
+         y="0"
+         x="0 6.3569279 13.445184">v21</tspan></text>
+</g><g
+     id="g7528"
+     clip-path="url(#clipPath4193)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7526"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,228.79,214.51)"><tspan
+         id="tspan7524"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7534"
+     clip-path="url(#clipPath4205)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7532"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,283.8,214.51)"><tspan
+         id="tspan7530"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7540"
+     clip-path="url(#clipPath4217)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7538"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,337.68,214.51)"><tspan
+         id="tspan7536"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7546"
+     clip-path="url(#clipPath4229)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7544"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,611.66,285.79)"><tspan
+         id="tspan7542"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7552"
+     clip-path="url(#clipPath4241)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7550"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,666.65,285.79)"><tspan
+         id="tspan7548"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7558"
+     clip-path="url(#clipPath4253)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7556"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,719.4,285.79)"><tspan
+         id="tspan7554"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7564"
+     clip-path="url(#clipPath4265)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7562"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,775.56,285.79)"><tspan
+         id="tspan7560"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7570"
+     clip-path="url(#clipPath4277)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7568"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,398.54,249.22)"><tspan
+         id="tspan7566"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7576"
+     clip-path="url(#clipPath4289)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7574"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,453.53,249.22)"><tspan
+         id="tspan7572"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7582"
+     clip-path="url(#clipPath4301)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7580"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,507.43,249.22)"><tspan
+         id="tspan7578"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7588"
+     clip-path="url(#clipPath4313)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7586"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,561.05,249.22)"><tspan
+         id="tspan7584"
+         y="0"
+         x="0">√</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7590"
+     d="m 217.67245,474.73479 v -25.14603 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14603 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14608 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7596"
+     clip-path="url(#clipPath4327)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7594"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,170.83,214.51)"><tspan
+         id="tspan7592"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7602"
+     clip-path="url(#clipPath4339)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7600"
+       font-weight="bold"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,23.4,272.33)"><tspan
+         id="tspan7598"
+         y="0"
+         x="0 8.5227842 16.412687 20.167776">ABI </tspan></text>
+</g><g
+     id="g7608"
+     clip-path="url(#clipPath4351)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7606"
+       font-weight="bold"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,46.68,272.33)"><tspan
+         id="tspan7604"
+         y="0"
+         x="0 7.566432 14.640624 19.563025 25.174561 28.662432 36.228863">Version</tspan></text>
+</g><g
+     id="g7614"
+     clip-path="url(#clipPath4363)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7612"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,17.64,255.5)"><tspan
+         id="tspan7610"
+         y="0"
+         x="0 7.4271598 14.98068 26.395201 33.934681 40.80024 45.700199 49.154041 56.7216 60.175442 63.671398 67.125237 72.053284">Compatibility</tspan></text>
+</g><g
+     id="g7620"
+     clip-path="url(#clipPath4375)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7618"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,191.28,116.86)"><tspan
+         id="tspan7616"
+         y="0"
+         x="0 6.3460798 13.46436">v20</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7622"
+     d="m 511.7451,474.89479 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7628"
+     clip-path="url(#clipPath4389)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7626"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,407.06,115.63)"><tspan
+         id="tspan7624"
+         y="0"
+         x="0 6.3460798 13.46436">v21</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7630"
+     d="m 804.53778,476.01476 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7636"
+     clip-path="url(#clipPath4403)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7634"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,626.66,114.74)"><tspan
+         id="tspan7632"
+         y="0"
+         x="0 6.3460798 13.46436">v22</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7638"
+     d="m 1098.2904,479.37468 v -25.14604 c 0,-1.10664 -0.8933,-1.99995 -1.9999,-1.99995 -1.1067,0 -2,0.89331 -2,1.99995 v 25.14604 c 0,1.0933 0.8933,1.99995 2,1.99995 1.1066,0 1.9999,-0.90665 1.9999,-1.99995 z m 3.9999,-23.14609 -5.9998,-11.9997 -5.9999,11.9997 z" /><g
+     id="g7644"
+     clip-path="url(#clipPath4417)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7642"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,846.96,112.22)"><tspan
+         id="tspan7640"
+         y="0"
+         x="0 6.3569279 13.445184">v23</tspan></text>
+</g><g
+     id="g7650"
+     clip-path="url(#clipPath4429)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7648"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,832.87,318.46)"><tspan
+         id="tspan7646"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7656"
+     clip-path="url(#clipPath4441)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7654"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,105.5,285.67)"><tspan
+         id="tspan7652"
+         y="0"
+         x="0 6.3460798 13.46436">v22</tspan></text>
+</g><g
+     id="g7662"
+     clip-path="url(#clipPath4453)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7660"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,104.93,319.87)"><tspan
+         id="tspan7658"
+         y="0"
+         x="0 6.3460798 13.46436">v23</tspan></text>
+</g><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7664"
+     stroke-miterlimit="10"
+     d="m 1104.7569,213.75465 -934.60326,0.39999" /><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7666"
+     stroke-miterlimit="10"
+     d="M 1105.3969,255.35361 170.79362,255.7536" /><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7668"
+     stroke-miterlimit="10"
+     d="M 1105.3969,299.35251 170.79362,299.7525" /><g
+     id="g7674"
+     clip-path="url(#clipPath4477)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#8497b0"
+       id="text7672"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,283.8,251.38)"><tspan
+         id="tspan7670"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7680"
+     clip-path="url(#clipPath4489)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7678"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,339.5,251.95)"><tspan
+         id="tspan7676"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7686"
+     clip-path="url(#clipPath4501)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7684"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,229.8,250.63)"><tspan
+         id="tspan7682"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7692"
+     clip-path="url(#clipPath4513)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7690"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,453.53,286.63)"><tspan
+         id="tspan7688"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7698"
+     clip-path="url(#clipPath4525)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7696"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,507.43,286.63)"><tspan
+         id="tspan7694"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7704"
+     clip-path="url(#clipPath4537)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7702"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,561.05,286.63)"><tspan
+         id="tspan7700"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7710"
+     clip-path="url(#clipPath4549)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7708"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,667.39,318.89)"><tspan
+         id="tspan7706"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7716"
+     clip-path="url(#clipPath4561)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7714"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,720.14,318.89)"><tspan
+         id="tspan7712"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7722"
+     clip-path="url(#clipPath4573)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7720"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,776.3,318.89)"><tspan
+         id="tspan7718"
+         y="0"
+         x="0">√</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7724"
+     d="m 211.36594,305.0057 2.18661,-227.154316 c 0.0133,-1.0933 -0.87997,-1.99995 -1.98661,-2.01328 -1.09331,-0.0133 -1.99995,0.87998 -2.01329,1.98662 l -2.18661,227.140986 c -0.0133,1.10663 0.87998,2.01328 1.98662,2.02661 1.10664,0.0133 1.99995,-0.87998 2.01328,-1.98662 z m -7.97313,-2.07994 5.87985,12.06636 6.11985,-11.94637 z" /><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7726"
+     d="M 289.03067,238.94069 V 107.43731 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 131.50338 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m -7.9998,-1.99995 5.99985,11.9997 5.99985,-11.9997 z" /><g
+     id="g7732"
+     clip-path="url(#clipPath4589)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7730"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,164.59,422.74)"><tspan
+         id="tspan7728"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 31.88484 39.578758 43.06068 46.065239 49.294441 54.784081 57.957119 65.271957 72.263878 78.118561 81.347763 88.072922 92.762283 99.754204 107.04096 110.38248 117.10764 120.33684 123.56604 130.17888 137.50777 144.49968 151.78644 155.12796 165.16656 168.43788 173.14128 180.44208 183.67128 190.01736 197.13564 204.19775 207.77795 214.89624 221.94432 225.17352 229.9752 236.70036">v20 ABI is declared aligned with v19.11 LTS</tspan></text>
+</g><g
+     id="g7738"
+     clip-path="url(#clipPath4601)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7736"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,222.12,398.3)"><tspan
+         id="tspan7734"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 23.740032 29.014032 35.385025 46.537777 53.851055 61.262783 64.497505 70.038719 73.034355 79.771011 84.440254 91.401939 94.622589 101.35925 108.65846 115.97174 122.93343 130.2467 133.59393 140.3306 147.62981 154.94308 158.16374 164.52068 171.60893 178.68312 181.90378 187.17778 193.54877 204.70152 212.0148 219.42653 222.66125 228.20247 231.32468 238.06133 242.73058 249.69226 252.81447 263.98129 271.39301 278.77661 282.01132 286.30084 289.53555 296.53943 303.82458 307.34061 310.51904 316.0462 323.3595 330.67276 337.98605 345.39777 350.30612 355.01755 358.13977 362.21832 369.63004 374.53839 377.5762 383.93314 391.02139 398.09558 401.2178 409.36084 417.03979 420.51361 423.6358 429.40204 436.81378 444.04266 448.75412 451.98883 459.28806 466.60132 473.56302 479.06204">v21 symbols are added and v20 symbols are modified, support for v20 ABI continues.</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7740"
+     d="m 510.78512,258.56686 -0.31999,-126.17017 c 0,-1.09331 0.89331,-1.99995 1.99995,-1.99995 1.09331,0 1.99995,0.89331 1.99995,1.99995 l 0.31999,126.15684 c 0,1.10664 -0.89331,2.01328 -1.99995,2.01328 -1.0933,0 -1.99995,-0.89331 -1.99995,-1.99995 z m 7.9998,-2.01328 -5.97318,12.01303 -6.02652,-11.98636 z" /><g
+     id="g7746"
+     clip-path="url(#clipPath4615)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7744"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,388.51,373.39)"><tspan
+         id="tspan7742"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 31.88484 39.578758 43.06068 46.065239 49.294441 54.784081 57.957119 65.271957 72.263878 78.118561 81.347763 88.072922 92.762283 99.754204 107.04096 110.38248 117.10764 120.33684 123.56604 130.17888 137.50777 144.49968 151.78644 155.12796 165.16656 168.43788 173.14128 180.44208 183.67128 190.01736 197.13564 204.19775 207.77795 214.89624 221.94432 225.17352 229.9752 236.70036 243.14471 246.65472 249.78564 254.46095 261.45288 272.58661 279.31177 282.54095 289.86984 293.09903 300.47003 307.02673 310.36823 316.71432 323.83261 330.89471 334.12393 339.40295 345.76309 356.92487 364.23972 371.63879 374.91013 380.39975 383.4324 390.15756 394.83289 401.8248 404.99783 409.71527 416.70721 427.84091 435.23999 441.51587 448.50781 455.79456">v21 ABI is declared aligned with v20.11 LTS, remaining v20 symbols are removed.</tspan></text>
+</g><path
+     style="fill:none;stroke:#7030a0;stroke-width:2.07994795;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7748"
+     stroke-miterlimit="10"
+     d="M 278.23094,342.95142 H 449.58665 V 261.03347 H 278.23094 Z" /><g
+     id="g7754"
+     clip-path="url(#clipPath4629)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7752"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,23.616,114.74)"><tspan
+         id="tspan7750"
+         y="0"
+         x="0 8.5082397 16.4268 20.17548 23.26428 30.817801 37.879921 42.821999 48.423962 51.93396 59.48748 67.026962">ABI Versions</tspan></text>
+</g><g
+     id="g7760"
+     clip-path="url(#clipPath4641)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7758"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,20.064,150.17)"><tspan
+         id="tspan7756"
+         y="0"
+         x="0 8.8451996 16.31448 25.159679 32.839561 36.0126 43.67844 50.740559 54.222481 61.284599 68.248444 73.850403 80.954643">DPDK Releases</tspan></text>
+</g><g
+     id="g7766"
+     clip-path="url(#clipPath4653)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7764"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,444,346.1)"><tspan
+         id="tspan7762"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 29.034719 35.39484 46.556641 53.871479 61.270561 64.541878 70.031517 73.064163 79.789322 84.464638 91.456558 94.629601 101.35476 108.72576 116.02656 123.01848 130.30524 133.64676 140.37192 147.68677 155.0016 158.2308 164.57687 171.69516 178.75728 181.98648 187.26552 193.62564 204.78745 212.10228 219.50136 222.77267 228.26231 231.43536 238.16052 242.80775 249.79968 252.88847 264.05029 271.44937 278.82037 282.04956 286.33176 289.60309 296.595 303.88177 307.39175 310.56479 316.1106 323.42545 330.74026 338.05511 345.45419 350.39627 355.09967 358.20251 362.28815 369.68723 374.62933 377.63388 383.97995 391.09824 398.16037 401.27725 409.4064 417.10031 420.58224 423.69913 429.45551 436.85461 444.09924 448.80264 452.03183 459.33264 466.64749 473.6394 479.12903 488.81665 492.43896">v22 symbols are added and v21 symbols are modified, support for v21 ABI continues…..</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7768"
+     d="m 583.39664,198.26171 -0.13333,-30.49257 c 0,-1.10664 0.89331,-2.01329 1.98662,-2.01329 1.10664,0 2.01328,0.89331 2.01328,1.98662 l 0.13333,30.49257 c 0,1.10664 -0.89331,2.01328 -1.99995,2.01328 -1.0933,0 -1.99995,-0.89331 -1.99995,-1.98661 z m 7.98647,-2.03995 -5.94652,12.02636 -6.05318,-11.97303 z" /><path
+     style="fill:none;stroke:#7030a0;stroke-width:2.07994795;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7770"
+     stroke-miterlimit="10"
+     d="M 571.18361,299.43251 H 742.37933 V 212.87467 H 571.18361 Z" /><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7772"
+     d="m 933.01457,30.959224 c 0,-6.22651 4.50655,-11.27972 10.07975,-11.27972 5.57319,0 10.07974,5.05321 10.07974,11.27972 0,6.22651 -4.50655,11.27972 -10.07974,11.27972 -5.5732,0 -10.07975,-5.05321 -10.07975,-11.27972 z" /><path
+     style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7774"
+     d="m 1081.3309,29.759254 c 0,-6.18651 4.4798,-11.19972 9.9997,-11.19972 5.5199,0 9.9998,5.01321 9.9998,11.19972 0,6.18651 -4.4799,11.19972 -9.9998,11.19972 -5.5199,0 -9.9997,-5.01321 -9.9997,-11.19972 z" /><g
+     id="g7780"
+     clip-path="url(#clipPath4673)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7778"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,744.89,439.54)"><tspan
+         id="tspan7776"
+         y="0"
+         x="0 4.8016801 11.52684 17.971201 21.144239 28.5714 35.56332 38.792519 45.728279 52.453442 57.943081">LTS Release</tspan></text>
+</g><g
+     id="g7786"
+     clip-path="url(#clipPath4685)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7784"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,856.06,439.75)"><tspan
+         id="tspan7782"
+         y="0"
+         x="0 12.0042 15.2334 22.562281 29.961361 34.903439 38.020321 45.461521 52.453442 55.68264 62.618401 69.343559 74.833199">Minor Release</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7788"
+     d="m 779.25841,46.265514 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.0933 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90665 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7794"
+     clip-path="url(#clipPath4699)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7792"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,622.34,439.54)"><tspan
+         id="tspan7790"
+         y="0"
+         x="0 8.1291599 15.82308 19.305 22.309561 29.512079 36.504002 41.151241 46.640881 49.870079 57.339359">ABI Version</tspan></text>
+</g><path
+     style="fill:none;stroke:#002060;stroke-width:1.27996802;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7796"
+     stroke-miterlimit="10"
+     d="M 763.41881,62.078444 H 1236.847 V 0.63998401 H 763.41881 Z" /></svg>
\ No newline at end of file
diff --git a/doc/guides/contributing/img/what_is_an_abi.svg b/doc/guides/contributing/img/what_is_an_abi.svg
new file mode 100644
index 0000000..fd3d993
--- /dev/null
+++ b/doc/guides/contributing/img/what_is_an_abi.svg
@@ -0,0 +1,382 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="970.69568"
+   height="522.22693"
+   version="1.1"
+   viewBox="0 0 970.69568 522.22693"
+   xml:space="preserve"
+   id="svg8399"
+   sodipodi:docname="what_is_an_abi.svg"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
+     id="metadata8403"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview8401"
+     showgrid="false"
+     inkscape:zoom="0.62755727"
+     inkscape:cx="820.83951"
+     inkscape:cy="-47.473217"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg8399" /><defs
+     id="defs8269"><clipPath
+       id="clipPath26"><path
+         d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
+         id="path8206"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><radialGradient
+       id="radialGradient40"
+       cx="0"
+       cy="0"
+       r="1"
+       gradientTransform="matrix(386.44367,-1.3123672e-5,-1.3123672e-5,-386.44367,470.30824,246.15384)"
+       gradientUnits="userSpaceOnUse"><stop
+         stop-color="#f9d8e2"
+         offset="0"
+         id="stop8209" /><stop
+         stop-color="#fff"
+         offset=".74"
+         id="stop8211" /><stop
+         stop-color="#fff"
+         offset=".83"
+         id="stop8213" /><stop
+         stop-color="#fff"
+         offset="1"
+         id="stop8215" /></radialGradient><clipPath
+       id="clipPath56"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8218"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath68"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8221"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath82"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8224"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath96"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8227"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath108"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8230"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath120"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8233"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath132"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8236"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath144"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8239"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath156"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8242"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath168"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8245"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath180"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8248"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath192"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8251"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath204"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8254"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath216"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8257"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath228"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8260"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath240"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8263"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath260"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8266"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath></defs><path
+     inkscape:connector-curvature="0"
+     style="fill:url(#radialGradient40);fill-rule:evenodd;stroke-width:1.33329999"
+     id="path8275"
+     d="m 116.15709,143.06309 c 0,-28.46596 23.07942,-51.545378 51.54538,-51.545378 h 605.21154 c 28.46595,0 51.54537,23.079418 51.54537,51.545378 V 349.2446 c 0,28.46595 -23.07942,51.54538 -51.54537,51.54538 H 167.70247 c -28.46595,0 -51.54538,-23.07943 -51.54538,-51.54538 z" /><path
+     style="fill:#00b050;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8277"
+     d="m 478.70803,73.758152 0.58665,373.057338 c 0,1.67996 -1.35997,3.03993 -3.03992,3.03993 -1.67996,0.0133 -3.03993,-1.34663 -3.03993,-3.02659 L 472.62818,73.758152 c 0,-1.67995 1.35997,-3.03992 3.03992,-3.03992 1.67996,0 3.03993,1.35997 3.03993,3.03992 z m 6.65317,370.004088 -9.09311,18.25287 -9.14644,-18.22621 z" /><path
+     style="fill:none;stroke:#7030a0;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8279"
+     stroke-miterlimit="10"
+     d="m 3.0399239,186.92866 c 0,-36.70575 29.7459201,-66.45167 66.4516701,-66.45167 H 778.00721 c 36.70575,0 66.45167,29.74592 66.45167,66.45167 v 265.80669 c 0,36.70574 -29.74592,66.45167 -66.45167,66.45167 H 69.491594 c -36.70575,0 -66.4516701,-29.74593 -66.4516701,-66.45167 z" /><path
+     style="fill:none;stroke:#3b3059;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8281"
+     stroke-miterlimit="10"
+     d="m 101.27746,71.464882 c 0,-37.78572 30.63924,-68.4249581 68.42496,-68.4249581 h 729.52846 c 37.7857,0 68.4249,30.6392381 68.4249,68.4249581 V 345.1647 c 0,37.78572 -30.6392,68.42496 -68.4249,68.42496 H 169.70242 c -37.78572,0 -68.42496,-30.63924 -68.42496,-68.42496 z" /><g
+     id="g8287"
+     clip-path="url(#clipPath56)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.06399918px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8285"
+       font-size="32.064px"
+       transform="matrix(1,0,0,-1,409.78,93.312)"><tspan
+         id="tspan8283"
+         y="0"
+         x="0 23.855616 42.837505 66.693123">DPDK</tspan></text>
+</g><g
+     id="g8293"
+     clip-path="url(#clipPath68)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.06399918px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8291"
+       font-size="32.064px"
+       transform="matrix(1,0,0,-1,358.03,435.43)"><tspan
+         id="tspan8289"
+         y="0"
+         x="0 23.72736 45.595009 67.462654 73.875458 80.160004 100.90541 122.80512 133.54655 139.95937 160.96127">Application</tspan></text>
+</g><path
+     style="fill:#f9d8e2;fill-opacity:0.70196001;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8295"
+     d="M 424.30939,345.59136 H 531.18672 V 277.91305 H 424.30939 Z" /><g
+     id="g8301"
+     clip-path="url(#clipPath82)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.04000092px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8299"
+       font-size="32.04px"
+       transform="matrix(1,0,0,-1,432.96,231.41)"><tspan
+         id="tspan8297"
+         y="0"
+         x="0 23.7096 42.67728">API</tspan></text>
+</g><path
+     style="fill:#f9d8e2;fill-opacity:0.70196001;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8303"
+     d="m 422.38944,213.91465 h 107.19732 v -67.8383 H 422.38944 Z" /><g
+     id="g8309"
+     clip-path="url(#clipPath96)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.04000092px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8307"
+       font-size="32.04px"
+       transform="matrix(1,0,0,-1,431.54,330.29)"><tspan
+         id="tspan8305"
+         y="0"
+         x="0 23.7096 42.100559">ABI</tspan></text>
+</g><g
+     id="g8315"
+     clip-path="url(#clipPath108)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8313"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,293.23)"><tspan
+         id="tspan8311"
+         y="0"
+         x="0 9.4483204 14.25228 24.706079 35.447159 40.203239 51.10392 66.106323 81.076797 84.332642 94.068237">Programming</tspan></text>
+</g><g
+     id="g8321"
+     clip-path="url(#clipPath120)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.98400021px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8319"
+       font-size="15.984px"
+       transform="matrix(1,0,0,-1,221.78,274.03)"><tspan
+         id="tspan8317"
+         y="0"
+         x="0 7.320672 18.237743 27.987984 38.633327 48.351601 59.268673 69.945984">Language</tspan></text>
+</g><g
+     id="g8327"
+     clip-path="url(#clipPath132)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8325"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,254.81)"><tspan
+         id="tspan8323"
+         y="0"
+         x="0 7.6767602 17.38044 27.116039 37.442162 42.708961 45.93288 56.386681 66.122276">Functions</tspan></text>
+</g><g
+     id="g8333"
+     clip-path="url(#clipPath144)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8331"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,235.61)"><tspan
+         id="tspan8329"
+         y="0"
+         x="0 11.87424 22.77492 28.073641 38.974319 44.273041 52.891441 63.776161 74.150162">Datatypes</tspan></text>
+</g><g
+     id="g8339"
+     clip-path="url(#clipPath156)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8337"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,216.41)"><tspan
+         id="tspan8335"
+         y="0"
+         x="0 9.6877203 20.06172 25.312559 35.016239 39.820202 49.555801 54.216122 60.823559 69.441963 80.326683 90.700684">Return Types</tspan></text>
+</g><g
+     id="g8345"
+     clip-path="url(#clipPath168)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8343"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,197.21)"><tspan
+         id="tspan8341"
+         y="0"
+         x="0 12.97548 23.429279 33.164879 39.357361 44.640121 55.540798 65.276398 70.559158">Constants</tspan></text>
+</g><g
+     id="g8351"
+     clip-path="url(#clipPath180)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8349"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,178.01)"><tspan
+         id="tspan8347"
+         y="0"
+         x="0">…</tspan></text>
+</g><g
+     id="g8357"
+     clip-path="url(#clipPath192)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8355"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,354.12)"><tspan
+         id="tspan8353"
+         y="0"
+         x="0 3.8304 13.566 19.75848 25.07316 29.877119 39.580799 49.906921 55.189678 58.413601 68.867401 78.602997 83.2314 89.423882 99.797882">Instruction set</tspan></text>
+</g><g
+     id="g8363"
+     clip-path="url(#clipPath204)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.98400021px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8361"
+       font-size="15.984px"
+       transform="matrix(1,0,0,-1,546.38,332.88)"><tspan
+         id="tspan8359"
+         y="0"
+         x="0 8.5674238 16.239744 26.517456 36.859104 46.577377 51.836113 62.753185 73.654274 77.026894 87.352562 91.892014 103.99191 108.33955 115.66022 118.85703 128.60727 136.63123 147.02083">Executable &amp; Linker</tspan></text>
+</g><g
+     id="g8369"
+     clip-path="url(#clipPath216)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8367"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,313.66)"><tspan
+         id="tspan8365"
+         y="0"
+         x="0 7.6767602 18.13056 22.934521 37.904999 48.805679">Format</tspan></text>
+</g><g
+     id="g8375"
+     clip-path="url(#clipPath228)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8373"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,292.42)"><tspan
+         id="tspan8371"
+         y="0"
+         x="0 12.97548 23.87616 27.22776 30.579359 33.80328 43.538879 54.200161 58.39764 71.373123 81.82692 91.562523 100.6278 110.95392 120.68952 125.95632 129.18024 139.63403 149.36964 155.56212">Calling Conventions.</tspan></text>
+</g><g
+     id="g8381"
+     clip-path="url(#clipPath240)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8379"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,271.3)"><tspan
+         id="tspan8377"
+         y="0"
+         x="0">…</tspan></text>
+</g><path
+     style="fill:none;stroke:#ffffff;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:18.239544, 24.319392"
+     inkscape:connector-curvature="0"
+     id="path8383"
+     stroke-miterlimit="10"
+     d="M 122.71693,120.47699 H 782.84709" /><path
+     style="fill:none;stroke:#ffffff;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:18.239544, 24.319392"
+     inkscape:connector-curvature="0"
+     id="path8385"
+     stroke-miterlimit="10"
+     d="M 177.27556,413.58966 H 837.40573" /><g
+     id="g8391"
+     clip-path="url(#clipPath260)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-style:italic;font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8389"
+       font-style="italic"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,483.19,405.82)"><tspan
+         id="tspan8387"
+         y="0"
+         x="0 5.0114398 14.71512 24.45072 34.77684 40.299 43.522919 53.976719 63.712318 68.13324 78.459358 89.360039 92.583961 95.807877">function calls</tspan></text>
+</g><path
+     style="fill:none;stroke:#3b3059;stroke-width:0.95997602;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8393"
+     stroke-miterlimit="10"
+     d="m 574.38564,303.03242 c -11.93304,0 -21.59946,-1.61329 -21.59946,-3.59991 V 164.62255 c 0,-1.98662 -9.66643,-3.59991 -21.59946,-3.59991 11.93303,0 21.59946,-1.61329 21.59946,-3.59991 v -18.30621 c 0,-1.98662 9.66642,-3.59991 21.59946,-3.59991" /><path
+     style="fill:none;stroke:#3b3059;stroke-width:0.95997602;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8395"
+     stroke-miterlimit="10"
+     d="m 372.63068,389.43026 c 13.293,0 24.0794,-1.79995 24.0794,-4.01323 v -91.53105 c 0,-2.21327 10.78639,-4.01323 24.0794,-4.01323 -13.29301,0 -24.0794,-1.79995 -24.0794,-4.01323 v -65.3717 c 0,-2.21328 -10.7864,-4.01323 -24.0794,-4.01323" /></svg>
\ No newline at end of file
diff --git a/doc/guides/contributing/stable.rst b/doc/guides/contributing/stable.rst
index 6a5eee9..4d38bb8 100644
--- a/doc/guides/contributing/stable.rst
+++ b/doc/guides/contributing/stable.rst
@@ -1,7 +1,7 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2018 The DPDK contributors
 
-.. stable_lts_releases:
+.. _stable_lts_releases:
 
 DPDK Stable Releases and Long Term Support
 ==========================================
@@ -53,6 +53,9 @@ year's November (X.11) release will be maintained as an LTS for 2 years.
 After the X.11 release, an LTS branch will be created for it at
 http://git.dpdk.org/dpdk-stable where bugfixes will be backported to.
 
+A LTS release may align with the declaration of a new major ABI version,
+please read the :doc:`abi_policy` for more information.
+
 It is anticipated that there will be at least 4 releases per year of the LTS
 or approximately 1 every 3 months. However, the cadence can be shorter or
 longer depending on the number and criticality of the backported
@@ -119,10 +122,3 @@ A Stable Release will be released by:
   list.
 
 Stable releases are available on the `dpdk.org download page <http://core.dpdk.org/download/>`_.
-
-
-ABI
----
-
-The Stable Release should not be seen as a way of breaking or circumventing
-the DPDK ABI policy.
-- 
2.7.4


^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v10 1/3] doc: separate versioning.rst into version and policy
  2019-11-11 10:37 10% ` [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-11 10:37 18%   ` Ray Kinsella
  2019-11-11 10:37 23%   ` [dpdk-dev] [PATCH v10 2/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
  2019-11-11 10:37 35%   ` [dpdk-dev] [PATCH v10 3/3] doc: updates to versioning guide for " Ray Kinsella
  2 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 10:37 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Separate versioning.rst into abi versioning and abi policy guidance, in
preparation for adding more detail to the abi policy. Add an entry to the
maintainer file for the abi policy.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS                                |   4 +
 doc/guides/contributing/abi_policy.rst     | 167 ++++++++
 doc/guides/contributing/abi_versioning.rst | 427 +++++++++++++++++++++
 doc/guides/contributing/index.rst          |   3 +-
 doc/guides/contributing/patches.rst        |   2 +-
 doc/guides/contributing/versioning.rst     | 591 -----------------------------
 doc/guides/rel_notes/deprecation.rst       |   2 +-
 7 files changed, 602 insertions(+), 594 deletions(-)
 create mode 100644 doc/guides/contributing/abi_policy.rst
 create mode 100644 doc/guides/contributing/abi_versioning.rst
 delete mode 100644 doc/guides/contributing/versioning.rst

diff --git a/MAINTAINERS b/MAINTAINERS
index 717c318..d5bb806 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -84,6 +84,10 @@ M: Marko Kovacevic <marko.kovacevic@intel.com>
 F: README
 F: doc/
 
+ABI Policy
+M: Ray Kinsella <mdr@ashroe.eu>
+F: doc/guides/contributing/abi_*.rst
+
 Developers and Maintainers Tools
 M: Thomas Monjalon <thomas@monjalon.net>
 F: MAINTAINERS
diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
new file mode 100644
index 0000000..d4f4e9f
--- /dev/null
+++ b/doc/guides/contributing/abi_policy.rst
@@ -0,0 +1,167 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright 2018 The DPDK contributors
+
+DPDK ABI/API policy
+===================
+
+Description
+-----------
+
+This document details some methods for handling ABI management in the DPDK.
+
+General Guidelines
+------------------
+
+#. Whenever possible, ABI should be preserved
+#. ABI/API may be changed with a deprecation process
+#. The modification of symbols can generally be managed with versioning
+#. Libraries or APIs marked in ``experimental`` state may change without constraint
+#. New APIs will be marked as ``experimental`` for at least one release to allow
+   any issues found by users of the new API to be fixed quickly
+#. The addition of symbols is generally not problematic
+#. The removal of symbols generally is an ABI break and requires bumping of the
+   LIBABIVER macro
+#. Updates to the minimum hardware requirements, which drop support for hardware which
+   was previously supported, should be treated as an ABI change.
+
+What is an ABI
+~~~~~~~~~~~~~~
+
+An ABI (Application Binary Interface) is the set of runtime interfaces exposed
+by a library. It is similar to an API (Application Programming Interface) but
+is the result of compilation.  It is also effectively cloned when applications
+link to dynamic libraries.  That is to say when an application is compiled to
+link against dynamic libraries, it is assumed that the ABI remains constant
+between the time the application is compiled/linked, and the time that it runs.
+Therefore, in the case of dynamic linking, it is critical that an ABI is
+preserved, or (when modified), done in such a way that the application is unable
+to behave improperly or in an unexpected fashion.
+
+
+ABI/API Deprecation
+-------------------
+
+The DPDK ABI policy
+~~~~~~~~~~~~~~~~~~~
+
+ABI versions are set at the time of major release labeling, and the ABI may
+change multiple times, without warning, between the last release label and the
+HEAD label of the git tree.
+
+ABI versions, once released, are available until such time as their
+deprecation has been noted in the Release Notes for at least one major release
+cycle. For example consider the case where the ABI for DPDK 2.0 has been
+shipped and then a decision is made to modify it during the development of
+DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
+release and the modification will be made available in the DPDK 2.2 release.
+
+ABI versions may be deprecated in whole or in part as needed by a given
+update.
+
+Some ABI changes may be too significant to reasonably maintain multiple
+versions. In those cases ABI's may be updated without backward compatibility
+being provided. The requirements for doing so are:
+
+#. At least 3 acknowledgments of the need to do so must be made on the
+   dpdk.org mailing list.
+
+   - The acknowledgment of the maintainer of the component is mandatory, or if
+     no maintainer is available for the component, the tree/sub-tree maintainer
+     for that component must acknowledge the ABI change instead.
+
+   - It is also recommended that acknowledgments from different "areas of
+     interest" be sought for each deprecation, for example: from NIC vendors,
+     CPU vendors, end-users, etc.
+
+#. The changes (including an alternative map file) can be included with
+   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
+   to provide more details about oncoming changes.
+   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
+   More preferred way to provide this information is sending the feature
+   as a separate patch and reference it in deprecation notice.
+
+#. A full deprecation cycle, as explained above, must be made to offer
+   downstream consumers sufficient warning of the change.
+
+Note that the above process for ABI deprecation should not be undertaken
+lightly. ABI stability is extremely important for downstream consumers of the
+DPDK, especially when distributed in shared object form. Every effort should
+be made to preserve the ABI whenever possible. The ABI should only be changed
+for significant reasons, such as performance enhancements. ABI breakage due to
+changes such as reorganizing public structure fields for aesthetic or
+readability purposes should be avoided.
+
+.. note::
+
+   Updates to the minimum hardware requirements, which drop support for hardware
+   which was previously supported, should be treated as an ABI change, and
+   follow the relevant deprecation policy procedures as above: 3 acks and
+   announcement at least one release in advance.
+
+Examples of Deprecation Notices
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following are some examples of ABI deprecation notices which would be
+added to the Release Notes:
+
+* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
+  to be replaced with the inline function ``rte_foo()``.
+
+* The function ``rte_mbuf_grok()`` has been updated to include a new parameter
+  in version 2.0. Backwards compatibility will be maintained for this function
+  until the release of version 2.1
+
+* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
+  performance reasons. Existing binary applications will have backwards
+  compatibility in release 2.0, while newly built binaries will need to
+  reference the new structure variant ``struct rte_foo2``. Compatibility will
+  be removed in release 2.2, and all applications will require updating and
+  rebuilding to the new structure at that time, which will be renamed to the
+  original ``struct rte_foo``.
+
+* Significant ABI changes are planned for the ``librte_dostuff`` library. The
+  upcoming release 2.0 will not contain these changes, but release 2.1 will,
+  and no backwards compatibility is planned due to the extensive nature of
+  these changes. Binaries using this library built prior to version 2.1 will
+  require updating and recompilation.
+
+New API replacing previous one
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a new API proposed functionally replaces an existing one, when the new API
+becomes non-experimental then the old one is marked with ``__rte_deprecated``.
+Deprecated APIs are removed completely just after the next LTS.
+
+Reminder that old API should follow deprecation process to be removed.
+
+
+Experimental APIs
+-----------------
+
+APIs marked as ``experimental`` are not considered part of the ABI and may
+change without warning at any time.  Since changes to APIs are most likely
+immediately after their introduction, as users begin to take advantage of
+those new APIs and start finding issues with them, new DPDK APIs will be
+automatically marked as ``experimental`` to allow for a period of stabilization
+before they become part of a tracked ABI.
+
+Note that marking an API as experimental is a multi step process.
+To mark an API as experimental, the symbols which are desired to be exported
+must be placed in an EXPERIMENTAL version block in the corresponding libraries'
+version map script.
+Secondly, the corresponding prototypes of those exported functions (in the
+development header files), must be marked with the ``__rte_experimental`` tag
+(see ``rte_compat.h``).
+The DPDK build makefiles perform a check to ensure that the map file and the
+C code reflect the same list of symbols.
+This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
+during compilation in the corresponding library Makefile.
+
+In addition to tagging the code with ``__rte_experimental``,
+the doxygen markup must also contain the EXPERIMENTAL string,
+and the MAINTAINERS file should note the EXPERIMENTAL libraries.
+
+For removing the experimental tag associated with an API, deprecation notice
+is not required. Though, an API should remain in experimental state for at least
+one release. Thereafter, normal process of posting patch for review to mailing
+list can be followed.
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
new file mode 100644
index 0000000..1c5612c
--- /dev/null
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -0,0 +1,427 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright 2018 The DPDK contributors
+
+.. library_versioning:
+
+Library versioning
+------------------
+
+Downstreams might want to provide different DPDK releases at the same time to
+support multiple consumers of DPDK linked against older and newer sonames.
+
+Also due to the interdependencies that DPDK libraries can have applications
+might end up with an executable space in which multiple versions of a library
+are mapped by ld.so.
+
+Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
+depending on LibA.
+
+.. note::
+
+    Application
+    \-> LibA.old
+    \-> LibB.new -> LibA.new
+
+That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
+If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
+library - versions defined in the libraries ``LIBABIVER``.
+An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
+``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
+
+
+ABI versioning
+--------------
+
+Versioning Macros
+~~~~~~~~~~~~~~~~~
+
+When a symbol is exported from a library to provide an API, it also provides a
+calling convention (ABI) that is embodied in its name, return type and
+arguments. Occasionally that function may need to change to accommodate new
+functionality or behavior. When that occurs, it is desirable to allow for
+backward compatibility for a time with older binaries that are dynamically
+linked to the DPDK.
+
+To support backward compatibility the ``rte_function_versioning.h``
+header file provides macros to use when updating exported functions. These
+macros are used in conjunction with the ``rte_<library>_version.map`` file for
+a given library to allow multiple versions of a symbol to exist in a shared
+library so that older binaries need not be immediately recompiled.
+
+The macros exported are:
+
+* ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
+  versioned symbol ``b@DPDK_n`` to the internal function ``b_e``.
+
+* ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
+  the linker to bind references to symbol ``b`` to the internal symbol
+  ``b_e``.
+
+* ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
+  fully qualified function ``p``, so that if a symbol becomes versioned, it
+  can still be mapped back to the public symbol name.
+
+Examples of ABI Macro use
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Updating a public API
+_____________________
+
+Assume we have a function as follows
+
+.. code-block:: c
+
+ /*
+  * Create an acl context object for apps to
+  * manipulate
+  */
+ struct rte_acl_ctx *
+ rte_acl_create(const struct rte_acl_param *param)
+ {
+        ...
+ }
+
+
+Assume that struct rte_acl_ctx is a private structure, and that a developer
+wishes to enhance the acl api so that a debugging flag can be enabled on a
+per-context basis.  This requires an addition to the structure (which, being
+private, is safe), but it also requires modifying the code as follows
+
+.. code-block:: c
+
+ /*
+  * Create an acl context object for apps to
+  * manipulate
+  */
+ struct rte_acl_ctx *
+ rte_acl_create(const struct rte_acl_param *param, int debug)
+ {
+        ...
+ }
+
+
+Note also that, being a public function, the header file prototype must also be
+changed, as must all the call sites, to reflect the new ABI footprint.  We will
+maintain previous ABI versions that are accessible only to previously compiled
+binaries
+
+The addition of a parameter to the function is ABI breaking as the function is
+public, and existing application may use it in its current form.  However, the
+compatibility macros in DPDK allow a developer to use symbol versioning so that
+multiple functions can be mapped to the same public symbol based on when an
+application was linked to it.  To see how this is done, we start with the
+requisite libraries version map file.  Initially the version map file for the
+acl library looks like this
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_create;
+        rte_acl_dump;
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+This file needs to be modified as follows
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_create;
+        rte_acl_dump;
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+   DPDK_2.1 {
+        global:
+        rte_acl_create;
+
+   } DPDK_2.0;
+
+The addition of the new block tells the linker that a new version node is
+available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
+symbols from the DPDK_2.0 node.  This list is directly translated into a list of
+exported symbols when DPDK is compiled as a shared library
+
+Next, we need to specify in the code which function map to the rte_acl_create
+symbol at which versions.  First, at the site of the initial symbol definition,
+we need to update the function so that it is uniquely named, and not in conflict
+with the public symbol name
+
+.. code-block:: c
+
+  struct rte_acl_ctx *
+ -rte_acl_create(const struct rte_acl_param *param)
+ +rte_acl_create_v20(const struct rte_acl_param *param)
+ {
+        size_t sz;
+        struct rte_acl_ctx *ctx;
+        ...
+
+Note that the base name of the symbol was kept intact, as this is conducive to
+the macros used for versioning symbols.  That is our next step, mapping this new
+symbol name to the initial symbol name at version node 2.0.  Immediately after
+the function, we add this line of code
+
+.. code-block:: c
+
+   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+
+Remembering to also add the rte_function_versioning.h header to the requisite c file where
+these changes are being made.  The above macro instructs the linker to create a
+new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
+builds, but now points to the above newly named function.  We have now mapped
+the original rte_acl_create symbol to the original function (but with a new
+name)
+
+Next, we need to create the 2.1 version of the symbol.  We create a new function
+name, with a different suffix, and  implement it appropriately
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   rte_acl_create_v21(const struct rte_acl_param *param, int debug);
+   {
+        struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
+
+        ctx->debug = debug;
+
+        return ctx;
+   }
+
+This code serves as our new API call.  Its the same as our old call, but adds
+the new parameter in place.  Next we need to map this function to the symbol
+``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
+in the header file, adding the macro there to inform all including applications,
+that on re-link, the default rte_acl_create symbol should point to this
+function.  Note that we could do this by simply naming the function above
+rte_acl_create, and the linker would chose the most recent version tag to apply
+in the version script, but we can also do this in the header file
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   -rte_acl_create(const struct rte_acl_param *param);
+   +rte_acl_create(const struct rte_acl_param *param, int debug);
+   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+
+The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
+header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
+version node to it.  This method is more explicit and flexible than just
+re-implementing the exact symbol name, and allows for other features (such as
+linking to the old symbol version by default, when the new ABI is to be opt-in
+for a period.
+
+One last thing we need to do.  Note that we've taken what was a public symbol,
+and duplicated it into two uniquely and differently named symbols.  We've then
+mapped each of those back to the public symbol ``rte_acl_create`` with different
+version tags.  This only applies to dynamic linking, as static linking has no
+notion of versioning.  That leaves this code in a position of no longer having a
+symbol simply named ``rte_acl_create`` and a static build will fail on that
+missing symbol.
+
+To correct this, we can simply map a function of our choosing back to the public
+symbol in the static build with the ``MAP_STATIC_SYMBOL`` macro.  Generally the
+assumption is that the most recent version of the symbol is the one you want to
+map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
+defined, we add this
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   rte_acl_create_v21(const struct rte_acl_param *param, int debug)
+   {
+        ...
+   }
+   MAP_STATIC_SYMBOL(struct rte_acl_ctx *rte_acl_create(const struct rte_acl_param *param, int debug), rte_acl_create_v21);
+
+That tells the compiler that, when building a static library, any calls to the
+symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
+
+That's it, on the next shared library rebuild, there will be two versions of
+rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
+and a new DPDK_2.1 version, used by future built applications.
+
+
+Deprecating part of a public API
+________________________________
+
+Lets assume that you've done the above update, and after a few releases have
+passed you decide you would like to retire the old version of the function.
+After having gone through the ABI deprecation announcement process, removal is
+easy.  Start by removing the symbol from the requisite version map file:
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_dump;
+ -      rte_acl_create
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+   DPDK_2.1 {
+        global:
+        rte_acl_create;
+   } DPDK_2.0;
+
+
+Next remove the corresponding versioned export.
+
+.. code-block:: c
+
+ -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+
+
+Note that the internal function definition could also be removed, but its used
+in our example by the newer version _v21, so we leave it in place.  This is a
+coding style choice.
+
+Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
+indicate to applications doing dynamic linking that this is a later, and
+possibly incompatible library version:
+
+.. code-block:: c
+
+   -LIBABIVER := 1
+   +LIBABIVER := 2
+
+Deprecating an entire ABI version
+_________________________________
+
+While removing a symbol from and ABI may be useful, it is often more practical
+to remove an entire version node at once.  If a version node completely
+specifies an API, then removing part of it, typically makes it incomplete.  In
+those cases it is better to remove the entire node
+
+To do this, start by modifying the version map file, such that all symbols from
+the node to be removed are merged into the next node in the map
+
+In the case of our map above, it would transform to look as follows
+
+.. code-block:: none
+
+   DPDK_2.1 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_dump;
+        rte_acl_create
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+ };
+
+Then any uses of BIND_DEFAULT_SYMBOL that pointed to the old node should be
+updated to point to the new version node in any header files for all affected
+symbols.
+
+.. code-block:: c
+
+ -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
+ +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+
+Lastly, any VERSION_SYMBOL macros that point to the old version node should be
+removed, taking care to keep, where need old code in place to support newer
+versions of the symbol.
+
+
+Running the ABI Validator
+-------------------------
+
+The ``devtools`` directory in the DPDK source tree contains a utility program,
+``validate-abi.sh``, for validating the DPDK ABI based on the Linux `ABI
+Compliance Checker
+<http://ispras.linuxbase.org/index.php/ABI_compliance_checker>`_.
+
+This has a dependency on the ``abi-compliance-checker`` and ``and abi-dumper``
+utilities which can be installed via a package manager. For example::
+
+   sudo yum install abi-compliance-checker
+   sudo yum install abi-dumper
+
+The syntax of the ``validate-abi.sh`` utility is::
+
+   ./devtools/validate-abi.sh <REV1> <REV2>
+
+Where ``REV1`` and ``REV2`` are valid gitrevisions(7)
+https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
+on the local repo.
+
+For example::
+
+   # Check between the previous and latest commit:
+   ./devtools/validate-abi.sh HEAD~1 HEAD
+
+   # Check on a specific compilation target:
+   ./devtools/validate-abi.sh -t x86_64-native-linux-gcc HEAD~1 HEAD
+
+   # Check between two tags:
+   ./devtools/validate-abi.sh v2.0.0 v2.1.0
+
+   # Check between git master and local topic-branch "vhost-hacking":
+   ./devtools/validate-abi.sh master vhost-hacking
+
+After the validation script completes (it can take a while since it need to
+compile both tags) it will create compatibility reports in the
+``./abi-check/compat_report`` directory. Listed incompatibilities can be found
+as follows::
+
+  grep -lr Incompatible abi-check/compat_reports/
diff --git a/doc/guides/contributing/index.rst b/doc/guides/contributing/index.rst
index e2608d3..2fefd91 100644
--- a/doc/guides/contributing/index.rst
+++ b/doc/guides/contributing/index.rst
@@ -10,7 +10,8 @@ Contributor's Guidelines
 
     coding_style
     design
-    versioning
+    abi_policy
+    abi_versioning
     documentation
     patches
     vulnerability
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index 9e1013b..c9ec529 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -157,7 +157,7 @@ Make your planned changes in the cloned ``dpdk`` repo. Here are some guidelines
   * For other PMDs and more info, refer to the ``MAINTAINERS`` file.
 
 * New external functions should be added to the local ``version.map`` file.
-  See the :doc:`Guidelines for ABI policy and versioning </contributing/versioning>`.
+  See the :doc:`Guidelines for ABI policy and versioning </contributing/abi_versioning>`.
   New external functions should also be added in alphabetical order.
 
 * Important changes will require an addition to the release notes in ``doc/guides/rel_notes/``.
diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
deleted file mode 100644
index 64984c5..0000000
--- a/doc/guides/contributing/versioning.rst
+++ /dev/null
@@ -1,591 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright 2018 The DPDK contributors
-
-DPDK ABI/API policy
-===================
-
-Description
------------
-
-This document details some methods for handling ABI management in the DPDK.
-
-General Guidelines
-------------------
-
-#. Whenever possible, ABI should be preserved
-#. ABI/API may be changed with a deprecation process
-#. The modification of symbols can generally be managed with versioning
-#. Libraries or APIs marked in ``experimental`` state may change without constraint
-#. New APIs will be marked as ``experimental`` for at least one release to allow
-   any issues found by users of the new API to be fixed quickly
-#. The addition of symbols is generally not problematic
-#. The removal of symbols generally is an ABI break and requires bumping of the
-   LIBABIVER macro
-#. Updates to the minimum hardware requirements, which drop support for hardware which
-   was previously supported, should be treated as an ABI change.
-
-What is an ABI
-~~~~~~~~~~~~~~
-
-An ABI (Application Binary Interface) is the set of runtime interfaces exposed
-by a library. It is similar to an API (Application Programming Interface) but
-is the result of compilation.  It is also effectively cloned when applications
-link to dynamic libraries.  That is to say when an application is compiled to
-link against dynamic libraries, it is assumed that the ABI remains constant
-between the time the application is compiled/linked, and the time that it runs.
-Therefore, in the case of dynamic linking, it is critical that an ABI is
-preserved, or (when modified), done in such a way that the application is unable
-to behave improperly or in an unexpected fashion.
-
-
-ABI/API Deprecation
--------------------
-
-The DPDK ABI policy
-~~~~~~~~~~~~~~~~~~~
-
-ABI versions are set at the time of major release labeling, and the ABI may
-change multiple times, without warning, between the last release label and the
-HEAD label of the git tree.
-
-ABI versions, once released, are available until such time as their
-deprecation has been noted in the Release Notes for at least one major release
-cycle. For example consider the case where the ABI for DPDK 2.0 has been
-shipped and then a decision is made to modify it during the development of
-DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
-release and the modification will be made available in the DPDK 2.2 release.
-
-ABI versions may be deprecated in whole or in part as needed by a given
-update.
-
-Some ABI changes may be too significant to reasonably maintain multiple
-versions. In those cases ABI's may be updated without backward compatibility
-being provided. The requirements for doing so are:
-
-#. At least 3 acknowledgments of the need to do so must be made on the
-   dpdk.org mailing list.
-
-   - The acknowledgment of the maintainer of the component is mandatory, or if
-     no maintainer is available for the component, the tree/sub-tree maintainer
-     for that component must acknowledge the ABI change instead.
-
-   - It is also recommended that acknowledgments from different "areas of
-     interest" be sought for each deprecation, for example: from NIC vendors,
-     CPU vendors, end-users, etc.
-
-#. The changes (including an alternative map file) can be included with
-   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
-   to provide more details about oncoming changes.
-   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
-   More preferred way to provide this information is sending the feature
-   as a separate patch and reference it in deprecation notice.
-
-#. A full deprecation cycle, as explained above, must be made to offer
-   downstream consumers sufficient warning of the change.
-
-Note that the above process for ABI deprecation should not be undertaken
-lightly. ABI stability is extremely important for downstream consumers of the
-DPDK, especially when distributed in shared object form. Every effort should
-be made to preserve the ABI whenever possible. The ABI should only be changed
-for significant reasons, such as performance enhancements. ABI breakage due to
-changes such as reorganizing public structure fields for aesthetic or
-readability purposes should be avoided.
-
-.. note::
-
-   Updates to the minimum hardware requirements, which drop support for hardware
-   which was previously supported, should be treated as an ABI change, and
-   follow the relevant deprecation policy procedures as above: 3 acks and
-   announcement at least one release in advance.
-
-Examples of Deprecation Notices
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The following are some examples of ABI deprecation notices which would be
-added to the Release Notes:
-
-* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
-  to be replaced with the inline function ``rte_foo()``.
-
-* The function ``rte_mbuf_grok()`` has been updated to include a new parameter
-  in version 2.0. Backwards compatibility will be maintained for this function
-  until the release of version 2.1
-
-* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
-  performance reasons. Existing binary applications will have backwards
-  compatibility in release 2.0, while newly built binaries will need to
-  reference the new structure variant ``struct rte_foo2``. Compatibility will
-  be removed in release 2.2, and all applications will require updating and
-  rebuilding to the new structure at that time, which will be renamed to the
-  original ``struct rte_foo``.
-
-* Significant ABI changes are planned for the ``librte_dostuff`` library. The
-  upcoming release 2.0 will not contain these changes, but release 2.1 will,
-  and no backwards compatibility is planned due to the extensive nature of
-  these changes. Binaries using this library built prior to version 2.1 will
-  require updating and recompilation.
-
-New API replacing previous one
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If a new API proposed functionally replaces an existing one, when the new API
-becomes non-experimental then the old one is marked with ``__rte_deprecated``.
-Deprecated APIs are removed completely just after the next LTS.
-
-Reminder that old API should follow deprecation process to be removed.
-
-
-Experimental APIs
------------------
-
-APIs marked as ``experimental`` are not considered part of the ABI and may
-change without warning at any time.  Since changes to APIs are most likely
-immediately after their introduction, as users begin to take advantage of
-those new APIs and start finding issues with them, new DPDK APIs will be
-automatically marked as ``experimental`` to allow for a period of stabilization
-before they become part of a tracked ABI.
-
-Note that marking an API as experimental is a multi step process.
-To mark an API as experimental, the symbols which are desired to be exported
-must be placed in an EXPERIMENTAL version block in the corresponding libraries'
-version map script.
-Secondly, the corresponding prototypes of those exported functions (in the
-development header files), must be marked with the ``__rte_experimental`` tag
-(see ``rte_compat.h``).
-The DPDK build makefiles perform a check to ensure that the map file and the
-C code reflect the same list of symbols.
-This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
-during compilation in the corresponding library Makefile.
-
-In addition to tagging the code with ``__rte_experimental``,
-the doxygen markup must also contain the EXPERIMENTAL string,
-and the MAINTAINERS file should note the EXPERIMENTAL libraries.
-
-For removing the experimental tag associated with an API, deprecation notice
-is not required. Though, an API should remain in experimental state for at least
-one release. Thereafter, normal process of posting patch for review to mailing
-list can be followed.
-
-
-Library versioning
-------------------
-
-Downstreams might want to provide different DPDK releases at the same time to
-support multiple consumers of DPDK linked against older and newer sonames.
-
-Also due to the interdependencies that DPDK libraries can have applications
-might end up with an executable space in which multiple versions of a library
-are mapped by ld.so.
-
-Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
-depending on LibA.
-
-.. note::
-
-    Application
-    \-> LibA.old
-    \-> LibB.new -> LibA.new
-
-That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
-If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
-library - versions defined in the libraries ``LIBABIVER``.
-An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
-``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
-
-
-ABI versioning
---------------
-
-Versioning Macros
-~~~~~~~~~~~~~~~~~
-
-When a symbol is exported from a library to provide an API, it also provides a
-calling convention (ABI) that is embodied in its name, return type and
-arguments. Occasionally that function may need to change to accommodate new
-functionality or behavior. When that occurs, it is desirable to allow for
-backward compatibility for a time with older binaries that are dynamically
-linked to the DPDK.
-
-To support backward compatibility the ``rte_function_versioning.h``
-header file provides macros to use when updating exported functions. These
-macros are used in conjunction with the ``rte_<library>_version.map`` file for
-a given library to allow multiple versions of a symbol to exist in a shared
-library so that older binaries need not be immediately recompiled.
-
-The macros exported are:
-
-* ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
-  versioned symbol ``b@DPDK_n`` to the internal function ``b_e``.
-
-* ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
-  the linker to bind references to symbol ``b`` to the internal symbol
-  ``b_e``.
-
-* ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
-  fully qualified function ``p``, so that if a symbol becomes versioned, it
-  can still be mapped back to the public symbol name.
-
-Examples of ABI Macro use
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Updating a public API
-_____________________
-
-Assume we have a function as follows
-
-.. code-block:: c
-
- /*
-  * Create an acl context object for apps to
-  * manipulate
-  */
- struct rte_acl_ctx *
- rte_acl_create(const struct rte_acl_param *param)
- {
-        ...
- }
-
-
-Assume that struct rte_acl_ctx is a private structure, and that a developer
-wishes to enhance the acl api so that a debugging flag can be enabled on a
-per-context basis.  This requires an addition to the structure (which, being
-private, is safe), but it also requires modifying the code as follows
-
-.. code-block:: c
-
- /*
-  * Create an acl context object for apps to
-  * manipulate
-  */
- struct rte_acl_ctx *
- rte_acl_create(const struct rte_acl_param *param, int debug)
- {
-        ...
- }
-
-
-Note also that, being a public function, the header file prototype must also be
-changed, as must all the call sites, to reflect the new ABI footprint.  We will
-maintain previous ABI versions that are accessible only to previously compiled
-binaries
-
-The addition of a parameter to the function is ABI breaking as the function is
-public, and existing application may use it in its current form.  However, the
-compatibility macros in DPDK allow a developer to use symbol versioning so that
-multiple functions can be mapped to the same public symbol based on when an
-application was linked to it.  To see how this is done, we start with the
-requisite libraries version map file.  Initially the version map file for the
-acl library looks like this
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_create;
-        rte_acl_dump;
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-This file needs to be modified as follows
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_create;
-        rte_acl_dump;
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-   DPDK_2.1 {
-        global:
-        rte_acl_create;
-
-   } DPDK_2.0;
-
-The addition of the new block tells the linker that a new version node is
-available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
-symbols from the DPDK_2.0 node.  This list is directly translated into a list of
-exported symbols when DPDK is compiled as a shared library
-
-Next, we need to specify in the code which function map to the rte_acl_create
-symbol at which versions.  First, at the site of the initial symbol definition,
-we need to update the function so that it is uniquely named, and not in conflict
-with the public symbol name
-
-.. code-block:: c
-
-  struct rte_acl_ctx *
- -rte_acl_create(const struct rte_acl_param *param)
- +rte_acl_create_v20(const struct rte_acl_param *param)
- {
-        size_t sz;
-        struct rte_acl_ctx *ctx;
-        ...
-
-Note that the base name of the symbol was kept intact, as this is conducive to
-the macros used for versioning symbols.  That is our next step, mapping this new
-symbol name to the initial symbol name at version node 2.0.  Immediately after
-the function, we add this line of code
-
-.. code-block:: c
-
-   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
-
-Remembering to also add the rte_function_versioning.h header to the requisite c file where
-these changes are being made.  The above macro instructs the linker to create a
-new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
-builds, but now points to the above newly named function.  We have now mapped
-the original rte_acl_create symbol to the original function (but with a new
-name)
-
-Next, we need to create the 2.1 version of the symbol.  We create a new function
-name, with a different suffix, and  implement it appropriately
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   rte_acl_create_v21(const struct rte_acl_param *param, int debug);
-   {
-        struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
-
-        ctx->debug = debug;
-
-        return ctx;
-   }
-
-This code serves as our new API call.  Its the same as our old call, but adds
-the new parameter in place.  Next we need to map this function to the symbol
-``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
-in the header file, adding the macro there to inform all including applications,
-that on re-link, the default rte_acl_create symbol should point to this
-function.  Note that we could do this by simply naming the function above
-rte_acl_create, and the linker would chose the most recent version tag to apply
-in the version script, but we can also do this in the header file
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   -rte_acl_create(const struct rte_acl_param *param);
-   +rte_acl_create(const struct rte_acl_param *param, int debug);
-   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
-
-The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
-header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
-version node to it.  This method is more explicit and flexible than just
-re-implementing the exact symbol name, and allows for other features (such as
-linking to the old symbol version by default, when the new ABI is to be opt-in
-for a period.
-
-One last thing we need to do.  Note that we've taken what was a public symbol,
-and duplicated it into two uniquely and differently named symbols.  We've then
-mapped each of those back to the public symbol ``rte_acl_create`` with different
-version tags.  This only applies to dynamic linking, as static linking has no
-notion of versioning.  That leaves this code in a position of no longer having a
-symbol simply named ``rte_acl_create`` and a static build will fail on that
-missing symbol.
-
-To correct this, we can simply map a function of our choosing back to the public
-symbol in the static build with the ``MAP_STATIC_SYMBOL`` macro.  Generally the
-assumption is that the most recent version of the symbol is the one you want to
-map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
-defined, we add this
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   rte_acl_create_v21(const struct rte_acl_param *param, int debug)
-   {
-        ...
-   }
-   MAP_STATIC_SYMBOL(struct rte_acl_ctx *rte_acl_create(const struct rte_acl_param *param, int debug), rte_acl_create_v21);
-
-That tells the compiler that, when building a static library, any calls to the
-symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
-
-That's it, on the next shared library rebuild, there will be two versions of
-rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
-and a new DPDK_2.1 version, used by future built applications.
-
-
-Deprecating part of a public API
-________________________________
-
-Lets assume that you've done the above update, and after a few releases have
-passed you decide you would like to retire the old version of the function.
-After having gone through the ABI deprecation announcement process, removal is
-easy.  Start by removing the symbol from the requisite version map file:
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_dump;
- -      rte_acl_create
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-   DPDK_2.1 {
-        global:
-        rte_acl_create;
-   } DPDK_2.0;
-
-
-Next remove the corresponding versioned export.
-
-.. code-block:: c
-
- -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
-
-
-Note that the internal function definition could also be removed, but its used
-in our example by the newer version _v21, so we leave it in place.  This is a
-coding style choice.
-
-Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
-indicate to applications doing dynamic linking that this is a later, and
-possibly incompatible library version:
-
-.. code-block:: c
-
-   -LIBABIVER := 1
-   +LIBABIVER := 2
-
-Deprecating an entire ABI version
-_________________________________
-
-While removing a symbol from and ABI may be useful, it is often more practical
-to remove an entire version node at once.  If a version node completely
-specifies an API, then removing part of it, typically makes it incomplete.  In
-those cases it is better to remove the entire node
-
-To do this, start by modifying the version map file, such that all symbols from
-the node to be removed are merged into the next node in the map
-
-In the case of our map above, it would transform to look as follows
-
-.. code-block:: none
-
-   DPDK_2.1 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_dump;
-        rte_acl_create
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
- };
-
-Then any uses of BIND_DEFAULT_SYMBOL that pointed to the old node should be
-updated to point to the new version node in any header files for all affected
-symbols.
-
-.. code-block:: c
-
- -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
- +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
-
-Lastly, any VERSION_SYMBOL macros that point to the old version node should be
-removed, taking care to keep, where need old code in place to support newer
-versions of the symbol.
-
-
-Running the ABI Validator
--------------------------
-
-The ``devtools`` directory in the DPDK source tree contains a utility program,
-``validate-abi.sh``, for validating the DPDK ABI based on the Linux `ABI
-Compliance Checker
-<http://ispras.linuxbase.org/index.php/ABI_compliance_checker>`_.
-
-This has a dependency on the ``abi-compliance-checker`` and ``and abi-dumper``
-utilities which can be installed via a package manager. For example::
-
-   sudo yum install abi-compliance-checker
-   sudo yum install abi-dumper
-
-The syntax of the ``validate-abi.sh`` utility is::
-
-   ./devtools/validate-abi.sh <REV1> <REV2>
-
-Where ``REV1`` and ``REV2`` are valid gitrevisions(7)
-https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
-on the local repo.
-
-For example::
-
-   # Check between the previous and latest commit:
-   ./devtools/validate-abi.sh HEAD~1 HEAD
-
-   # Check on a specific compilation target:
-   ./devtools/validate-abi.sh -t x86_64-native-linux-gcc HEAD~1 HEAD
-
-   # Check between two tags:
-   ./devtools/validate-abi.sh v2.0.0 v2.1.0
-
-   # Check between git master and local topic-branch "vhost-hacking":
-   ./devtools/validate-abi.sh master vhost-hacking
-
-After the validation script completes (it can take a while since it need to
-compile both tags) it will create compatibility reports in the
-``./abi-check/compat_report`` directory. Listed incompatibilities can be found
-as follows::
-
-  grep -lr Incompatible abi-check/compat_reports/
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 4249aab..cf37d80 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,7 +4,7 @@
 ABI and API Deprecation
 =======================
 
-See the :doc:`guidelines document for details of the ABI policy </contributing/versioning>`.
+See the :doc:`guidelines document for details of the ABI policy </contributing/abi_versioning>`.
 API and ABI deprecation notices are to be posted here.
 
 
-- 
2.7.4


^ permalink raw reply	[relevance 18%]

* [dpdk-dev] [PATCH v10 3/3] doc: updates to versioning guide for abi versions
  2019-11-11 10:37 10% ` [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
  2019-11-11 10:37 18%   ` [dpdk-dev] [PATCH v10 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
  2019-11-11 10:37 23%   ` [dpdk-dev] [PATCH v10 2/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-11 10:37 35%   ` Ray Kinsella
  2 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 10:37 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Updates to the ABI versioning guide, to account for the changes to the DPDK
ABI/API policy. Fixes for references to abi versioning and policy guides.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/contributing/abi_policy.rst     |  15 +-
 doc/guides/contributing/abi_versioning.rst | 250 +++++++++++++++++++----------
 doc/guides/contributing/patches.rst        |   6 +-
 doc/guides/rel_notes/deprecation.rst       |   6 +-
 4 files changed, 183 insertions(+), 94 deletions(-)

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index 81b617c..05ca959 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -19,11 +19,11 @@ General Guidelines
 #. Major ABI versions are usually but not always declared aligned with a
    :ref:`LTS release <stable_lts_releases>`.
 #. The ABI version is managed at a project level in DPDK, and is reflected in
-   all non-experimental library's soname. 
+   all non-experimental :ref:`library's soname <what_is_soname>`.
 #. The ABI should be preserved and not changed lightly. ABI changes must follow
    the outlined :ref:`deprecation process <abi_changes>`.
 #. The addition of symbols is generally not problematic. The modification of
-   symbols is managed with ABI Versioning.
+   symbols is managed with :ref:`ABI Versioning <abi_versioning>`.
 #. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
    once approved these will form part of the next ABI version.
 #. Libraries or APIs marked as :ref:`experimental <experimental_apis>` may
@@ -68,13 +68,14 @@ An ABI version is an instance of a library's ABI at a specific release. Certain
 releases are considered to be milestone releases, the yearly LTS release for
 example. The ABI of a milestone release may be declared as a 'major ABI
 version', where this ABI version is then supported for some number of subsequent
-releases and is annotated in the library's soname.
+releases and is annotated in the library's :ref:`soname<what_is_soname>`.
 
 ABI version support in subsequent releases facilitates application upgrades, by
 enabling applications built against the milestone release to upgrade to
 subsequent releases of a library without a rebuild.
 
-More details on major ABI version can be found in the ABI Versioning guide.
+More details on major ABI version can be found in the :ref:`ABI versioning
+<major_abi_versions>` guide.
 
 The DPDK ABI policy
 -------------------
@@ -147,7 +148,7 @@ The requirements for changing the ABI are:
      CPU vendors, end-users, etc.
 
 #. Backward compatibility with the major ABI version must be maintained through
-   ABI Versioning, with :ref:`forward-only <forward-only>` compatibility
+   :ref:`abi_versioning`, with :ref:`forward-only <forward-only>` compatibility
    offered for any ABI changes that are indicated to be part of the next ABI
    version.
 
@@ -224,7 +225,7 @@ declarations of major ABI versions.
 
 * DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
   this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
-  preserved through ABI Versioning.
+  preserved through :ref:`abi_versioning`.
 
   - The new function may be marked with the ``__rte_experimental`` tag for a
     number of releases, as described in the section :ref:`experimental_apis`.
@@ -322,5 +323,5 @@ Libraries
 Libraries marked as ``experimental`` are entirely not considered part of an ABI
 version, and may change without warning at any time. Experimental libraries
 always have a major version of ``0`` to indicate they exist outside of
-ABI Versioning, with the minor version incremented with each ABI change
+:ref:`abi_versioning` , with the minor version incremented with each ABI change
 to library.
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
index 1c5612c..a3d5479 100644
--- a/doc/guides/contributing/abi_versioning.rst
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -1,44 +1,134 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2018 The DPDK contributors
 
-.. library_versioning:
+.. _abi_versioning:
 
-Library versioning
+ABI Versioning
+==============
+
+This document details the mechanics of ABI version management in DPDK.
+
+.. _what_is_soname:
+
+What is a library's soname?
+---------------------------
+
+System libraries usually adopt the familiar major and minor version naming
+convention, where major versions (e.g. ``librte_eal 20.x, 21.x``) are presumed
+to be ABI incompatible with each other and minor versions (e.g. ``librte_eal
+20.1, 20.2``) are presumed to be ABI compatible. A library's `soname
+<https://en.wikipedia.org/wiki/Soname>`_. is typically used to provide backward
+compatibility information about a given library, describing the lowest common
+denominator ABI supported by the library. The soname or logical name for the
+library, is typically comprised of the library's name and major version e.g.
+``librte_eal.so.20``.
+
+During an application's build process, a library's soname is noted as a runtime
+dependency of the application. This information is then used by the `dynamic
+linker <https://en.wikipedia.org/wiki/Dynamic_linker>`_ when resolving the
+applications dependencies at runtime, to load a library supporting the correct
+ABI version. The library loaded at runtime therefore, may be a minor revision
+supporting the same major ABI version (e.g. ``librte_eal.20.2``), as the library
+used to link the application (e.g ``librte_eal.20.0``).
+
+.. _major_abi_versions:
+
+Major ABI versions
 ------------------
 
-Downstreams might want to provide different DPDK releases at the same time to
-support multiple consumers of DPDK linked against older and newer sonames.
+An ABI version change to a given library, especially in core libraries such as
+``librte_mbuf``, may cause an implicit ripple effect on the ABI of it's
+consuming libraries, causing ABI breakages. There may however be no explicit
+reason to bump a dependent library's ABI version, as there may have been no
+obvious change to the dependent library's API, even though the library's ABI
+compatibility will have been broken.
+
+This interdependence of DPDK libraries, means that ABI versioning of libraries
+is more manageable at a project level, with all project libraries sharing a
+**single ABI version**. In addition, the need to maintain a stable ABI for some
+number of releases as described in the section :doc:`abi_policy`, means
+that ABI version increments need to carefully planned and managed at a project
+level.
+
+Major ABI versions are therefore declared typically aligned with an LTS release
+and is then supported some number of subsequent releases, shared across all
+libraries. This means that a single project level ABI version, reflected in all
+individual library's soname, library filenames and associated version maps
+persists over multiple releases.
+
+.. code-block:: none
+
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_20 {
+        global:
+ ...
 
-Also due to the interdependencies that DPDK libraries can have applications
-might end up with an executable space in which multiple versions of a library
-are mapped by ld.so.
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_20 {
+        global:
+ ...
 
-Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
-depending on LibA.
+When an ABI change is made between major ABI versions to a given library, a new
+section is added to that library's version map describing the impending new ABI
+version, as described in the section :ref:`example_abi_macro_usage`. The
+library's soname and filename however do not change, e.g. ``libacl.so.20``, as
+ABI compatibility with the last major ABI version continues to be preserved for
+that library.
 
-.. note::
+.. code-block:: none
 
-    Application
-    \-> LibA.old
-    \-> LibB.new -> LibA.new
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_20 {
+        global:
+ ...
 
-That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
-If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
-library - versions defined in the libraries ``LIBABIVER``.
-An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
-``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
+ DPDK_21 {
+        global:
+
+ } DPDK_20;
+ ...
 
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_20 {
+        global:
+ ...
+
+However when a new ABI version is declared, for example DPDK ``21``, old
+depreciated functions may be safely removed at this point and the entire old
+major ABI version removed, see the section :ref:`deprecating_entire_abi` on
+how this may be done.
+
+.. code-block:: none
+
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_21 {
+        global:
+ ...
+
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_21 {
+        global:
+ ...
+
+At the same time, the major ABI version is changed atomically across all
+libraries by incrementing the major version in individual library's soname, e.g.
+``libacl.so.21``. This is done by bumping the LIBABIVER number in the libraries
+Makefile to indicate to dynamic linking applications that this is a later, and
+possibly incompatible library version:
+
+.. code-block:: c
+
+   -LIBABIVER := 20
+   +LIBABIVER := 21
 
-ABI versioning
---------------
 
 Versioning Macros
-~~~~~~~~~~~~~~~~~
+-----------------
 
 When a symbol is exported from a library to provide an API, it also provides a
 calling convention (ABI) that is embodied in its name, return type and
 arguments. Occasionally that function may need to change to accommodate new
-functionality or behavior. When that occurs, it is desirable to allow for
+functionality or behavior. When that occurs, it is may be required to allow for
 backward compatibility for a time with older binaries that are dynamically
 linked to the DPDK.
 
@@ -61,8 +151,10 @@ The macros exported are:
   fully qualified function ``p``, so that if a symbol becomes versioned, it
   can still be mapped back to the public symbol name.
 
+.. _example_abi_macro_usage:
+
 Examples of ABI Macro use
-^^^^^^^^^^^^^^^^^^^^^^^^^
+~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Updating a public API
 _____________________
@@ -106,16 +198,16 @@ maintain previous ABI versions that are accessible only to previously compiled
 binaries
 
 The addition of a parameter to the function is ABI breaking as the function is
-public, and existing application may use it in its current form.  However, the
+public, and existing application may use it in its current form. However, the
 compatibility macros in DPDK allow a developer to use symbol versioning so that
 multiple functions can be mapped to the same public symbol based on when an
-application was linked to it.  To see how this is done, we start with the
-requisite libraries version map file.  Initially the version map file for the
-acl library looks like this
+application was linked to it. To see how this is done, we start with the
+requisite libraries version map file. Initially the version map file for the acl
+library looks like this
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -141,7 +233,7 @@ This file needs to be modified as follows
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -163,16 +255,16 @@ This file needs to be modified as follows
         local: *;
    };
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
         rte_acl_create;
 
-   } DPDK_2.0;
+   } DPDK_20;
 
 The addition of the new block tells the linker that a new version node is
-available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
-symbols from the DPDK_2.0 node.  This list is directly translated into a list of
-exported symbols when DPDK is compiled as a shared library
+available (DPDK_21), which contains the symbol rte_acl_create, and inherits
+the symbols from the DPDK_20 node. This list is directly translated into a
+list of exported symbols when DPDK is compiled as a shared library
 
 Next, we need to specify in the code which function map to the rte_acl_create
 symbol at which versions.  First, at the site of the initial symbol definition,
@@ -191,22 +283,22 @@ with the public symbol name
 
 Note that the base name of the symbol was kept intact, as this is conducive to
 the macros used for versioning symbols.  That is our next step, mapping this new
-symbol name to the initial symbol name at version node 2.0.  Immediately after
+symbol name to the initial symbol name at version node 20.  Immediately after
 the function, we add this line of code
 
 .. code-block:: c
 
-   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+   VERSION_SYMBOL(rte_acl_create, _v20, 20);
 
-Remembering to also add the rte_function_versioning.h header to the requisite c file where
-these changes are being made.  The above macro instructs the linker to create a
-new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
-builds, but now points to the above newly named function.  We have now mapped
-the original rte_acl_create symbol to the original function (but with a new
-name)
+Remembering to also add the rte_function_versioning.h header to the requisite c
+file where these changes are being made. The above macro instructs the linker to
+create a new symbol ``rte_acl_create@DPDK_20``, which matches the symbol created
+in older builds, but now points to the above newly named function. We have now
+mapped the original rte_acl_create symbol to the original function (but with a
+new name).
 
-Next, we need to create the 2.1 version of the symbol.  We create a new function
-name, with a different suffix, and  implement it appropriately
+Next, we need to create the 21 version of the symbol. We create a new function
+name, with a different suffix, and implement it appropriately
 
 .. code-block:: c
 
@@ -220,12 +312,12 @@ name, with a different suffix, and  implement it appropriately
         return ctx;
    }
 
-This code serves as our new API call.  Its the same as our old call, but adds
-the new parameter in place.  Next we need to map this function to the symbol
-``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
-in the header file, adding the macro there to inform all including applications,
-that on re-link, the default rte_acl_create symbol should point to this
-function.  Note that we could do this by simply naming the function above
+This code serves as our new API call. Its the same as our old call, but adds the
+new parameter in place. Next we need to map this function to the symbol
+``rte_acl_create@DPDK_21``. To do this, we modify the public prototype of the
+call in the header file, adding the macro there to inform all including
+applications, that on re-link, the default rte_acl_create symbol should point to
+this function. Note that we could do this by simply naming the function above
 rte_acl_create, and the linker would chose the most recent version tag to apply
 in the version script, but we can also do this in the header file
 
@@ -233,11 +325,11 @@ in the version script, but we can also do this in the header file
 
    struct rte_acl_ctx *
    -rte_acl_create(const struct rte_acl_param *param);
-   +rte_acl_create(const struct rte_acl_param *param, int debug);
-   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+   +rte_acl_create_v21(const struct rte_acl_param *param, int debug);
+   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 21);
 
 The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
-header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
+header, to link to the rte_acl_create_v21 function and apply the DPDK_21
 version node to it.  This method is more explicit and flexible than just
 re-implementing the exact symbol name, and allows for other features (such as
 linking to the old symbol version by default, when the new ABI is to be opt-in
@@ -257,6 +349,7 @@ assumption is that the most recent version of the symbol is the one you want to
 map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
 defined, we add this
 
+
 .. code-block:: c
 
    struct rte_acl_ctx *
@@ -270,21 +363,22 @@ That tells the compiler that, when building a static library, any calls to the
 symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
 
 That's it, on the next shared library rebuild, there will be two versions of
-rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
-and a new DPDK_2.1 version, used by future built applications.
+rte_acl_create, an old DPDK_20 version, used by previously built applications,
+and a new DPDK_21 version, used by future built applications.
 
 
 Deprecating part of a public API
 ________________________________
 
-Lets assume that you've done the above update, and after a few releases have
-passed you decide you would like to retire the old version of the function.
-After having gone through the ABI deprecation announcement process, removal is
-easy.  Start by removing the symbol from the requisite version map file:
+Lets assume that you've done the above update, and in preparation for the next
+major ABI version you decide you would like to retire the old version of the
+function. After having gone through the ABI deprecation announcement process,
+removal is easy. Start by removing the symbol from the requisite version map
+file:
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -306,48 +400,42 @@ easy.  Start by removing the symbol from the requisite version map file:
         local: *;
    };
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
         rte_acl_create;
-   } DPDK_2.0;
+   } DPDK_20;
 
 
 Next remove the corresponding versioned export.
 
 .. code-block:: c
 
- -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+ -VERSION_SYMBOL(rte_acl_create, _v20, 20);
 
 
 Note that the internal function definition could also be removed, but its used
-in our example by the newer version _v21, so we leave it in place.  This is a
-coding style choice.
-
-Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
-indicate to applications doing dynamic linking that this is a later, and
-possibly incompatible library version:
-
-.. code-block:: c
+in our example by the newer version v21, so we leave it in place and declare it
+as static. This is a coding style choice.
 
-   -LIBABIVER := 1
-   +LIBABIVER := 2
+.. _deprecating_entire_abi:
 
 Deprecating an entire ABI version
 _________________________________
 
-While removing a symbol from and ABI may be useful, it is often more practical
-to remove an entire version node at once.  If a version node completely
-specifies an API, then removing part of it, typically makes it incomplete.  In
-those cases it is better to remove the entire node
+While removing a symbol from an ABI may be useful, it is more practical to
+remove an entire version node at once, as is typically done at the declaration
+of a major ABI version. If a version node completely specifies an API, then
+removing part of it, typically makes it incomplete. In those cases it is better
+to remove the entire node.
 
 To do this, start by modifying the version map file, such that all symbols from
-the node to be removed are merged into the next node in the map
+the node to be removed are merged into the next node in the map.
 
 In the case of our map above, it would transform to look as follows
 
 .. code-block:: none
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
 
         rte_acl_add_rules;
@@ -375,8 +463,8 @@ symbols.
 
 .. code-block:: c
 
- -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
- +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+ -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 20);
+ +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 21);
 
 Lastly, any VERSION_SYMBOL macros that point to the old version node should be
 removed, taking care to keep, where need old code in place to support newer
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index c9ec529..2140303 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -156,9 +156,9 @@ Make your planned changes in the cloned ``dpdk`` repo. Here are some guidelines
 
   * For other PMDs and more info, refer to the ``MAINTAINERS`` file.
 
-* New external functions should be added to the local ``version.map`` file.
-  See the :doc:`Guidelines for ABI policy and versioning </contributing/abi_versioning>`.
-  New external functions should also be added in alphabetical order.
+* New external functions should be added to the local ``version.map`` file. See
+  the :doc:`ABI policy <abi_policy>` and :ref:`ABI versioning <abi_versioning>`
+  guides. New external functions should also be added in alphabetical order.
 
 * Important changes will require an addition to the release notes in ``doc/guides/rel_notes/``.
   See the :ref:`Release Notes section of the Documentation Guidelines <doc_guidelines>` for details.
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index cf37d80..d454915 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,9 +4,9 @@
 ABI and API Deprecation
 =======================
 
-See the :doc:`guidelines document for details of the ABI policy </contributing/abi_versioning>`.
-API and ABI deprecation notices are to be posted here.
-
+See the guidelines document for details of the :doc:`ABI policy
+<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
+here.
 
 Deprecation Notices
 -------------------
-- 
2.7.4


^ permalink raw reply	[relevance 35%]

* [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions
  2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
                   ` (3 preceding siblings ...)
  2019-11-08 12:46 13% ` [dpdk-dev] [PATCH v9 4/4] doc: add maintainer for abi policy Ray Kinsella
@ 2019-11-11 10:37 10% ` Ray Kinsella
  2019-11-11 10:37 18%   ` [dpdk-dev] [PATCH v10 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
                     ` (2 more replies)
  2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
  5 siblings, 3 replies; 200+ results
From: Ray Kinsella @ 2019-11-11 10:37 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

TL;DR abbreviation:
A major ABI version that all DPDK releases during an agreed period support. ABI
versioning is managed at a project-level, in place of library-level management.
ABI changes to add new features are permitted, as long as ABI compatibility with
the major ABI version is maintained.

Detail:
This patch introduces major ABI versions, initally released aligned with the LTS
release and maintained for one year through subsequent releases. The intention
is that the one year abi support period, will then be reviewed after the initial
year with the intention of lengthening the period for the next ABI version and
declaring new major ABI versions less frequently.

ABI changes that preserve ABI compatibility with the major ABI version are
permitted in subsequent releases. ABI changes, follow similar approval rules as
before with the additional gate of now requiring technical board approval. The
merging and release of ABI breaking changes would now be pushed to the
declaration of the next major ABI version.

This change encourages developers to maintain ABI compatibility with the major
ABI version, by promoting a permissive culture around those changes that
preserve ABI compatibility. This approach begins to align DPDK with those
projects that declare major ABI versions (e.g. version 2.x, 3.x) and support
those versions for some period, typically two years or more.

To provide an example of how this might work in practice:

 * DPDK v20 is declared as the supported ABI version for one year, aligned with
   the DPDK v19.11 (LTS) release. All library sonames are updated to reflect the
   new ABI version, e.g. librte_eal.so.20, librte_acl.so.20...
 * DPDK v20.02 .. v20.08 releases are ABI compatible with the DPDK v20 ABI. ABI
   changes are permitted from DPDK v20.02 onwards, with the condition that ABI
   compatibility with DPDK v20 is preserved.
 * DPDK v21 is declared as the new supported ABI version for two years, aligned
   with the DPDK v20.11 (LTS) release. The DPDK v20 ABI is now depreciated,
   library sonames are updated to v21 and ABI compatibility breaking changes may
   be introduced.

v9
 * Fixed the upwording on experimental libraries in summary.

v9
 * Loosened up word around when new major ABI's are declared.
   (as suggested by Thomas Monjalon and agreed at the Techboard)

v8
 * Fixed intermediate build warnings, figure annotations and typo's.
   (as suggested by John McNamara).

v7
 * PNGs are now SVG. Some additional clarifications. Fixed typos and grammatical
   errors. (as suggested by Thomas Monjalon and David Marchand)

v6
 * Added figure to abi_policy.rst, comparing and contrasting the DPDK abi and
   api. (as suggested by Aaron Conole)

v5
 * Added figure to abi_policy.rst, mapping abi versions and abi compatibility to
   DPDK releases. (as suggested by Neil Horman)

v4
 * Removed changes to stable.rst, fixed typos and clarified the ABI policy
   "warning".

v3
 * Added myself as the maintainer of the ABI policy.
 * Updated the policy and versioning guides to use the year of the LTS+1 (e.g.
   v20), as the abi major version number.

v2
 * Restructured the patch into 3 patches:
   1. Splits the original versioning document into an ABI policy document
     and ABI versioning document.
   2. Add changes to the policy document introducing major ABI versions.
   3. Fixes up the versioning document in light of major ABI versioning. 
 * Reduces the initial ABI stability from two years to one year, with a review
   after the first year.
 * Adds detail around ABI version handling for experimental libraries.
 * Adds detail around chain of responsility for removing deprecated symbols.

Ray Kinsella (3):
  doc: separate versioning.rst into version and policy
  doc: changes to abi policy introducing major abi versions
  doc: updates to versioning guide for abi versions

 MAINTAINERS                                        |    4 +
 doc/guides/contributing/abi_policy.rst             |  327 ++++++
 doc/guides/contributing/abi_versioning.rst         |  515 ++++++++++
 .../contributing/img/abi_stability_policy.svg      | 1059 ++++++++++++++++++++
 doc/guides/contributing/img/what_is_an_abi.svg     |  382 +++++++
 doc/guides/contributing/index.rst                  |    3 +-
 doc/guides/contributing/patches.rst                |    6 +-
 doc/guides/contributing/stable.rst                 |   12 +-
 doc/guides/contributing/versioning.rst             |  591 -----------
 doc/guides/rel_notes/deprecation.rst               |    6 +-
 10 files changed, 2299 insertions(+), 606 deletions(-)
 create mode 100644 doc/guides/contributing/abi_policy.rst
 create mode 100644 doc/guides/contributing/abi_versioning.rst
 create mode 100644 doc/guides/contributing/img/abi_stability_policy.svg
 create mode 100644 doc/guides/contributing/img/what_is_an_abi.svg
 delete mode 100644 doc/guides/contributing/versioning.rst

-- 
2.7.4


^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-10 23:40  0%                       ` Ananyev, Konstantin
@ 2019-11-11  8:01  0%                         ` Matan Azrad
  2019-11-12 18:31  0%                           ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2019-11-11  8:01 UTC (permalink / raw)
  To: Ananyev, Konstantin, Yigit, Ferruh, Dekel Peled, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev



From: Ananyev, Konstantin
> >
> > From: Ferruh Yigit
> > > On 11/8/2019 11:56 AM, Matan Azrad wrote:
> > > >
> > > >
> > > > From: Ferruh Yigit
> > > >> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> > > >>>
> > > >>>
> > > >>> From: Ferruh Yigit
> > > >>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> > > >>>>> Hi
> > > >>>>>
> > > >>>>> From: Ferruh Yigit
> > > >>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > >>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > >>>>>>>
> > > >>>>>> 	RTE_ETHER_MAX_LEN;
> > > >>>>>>>  	}
> > > >>>>>>>
> > > >>>>>>> +	/*
> > > >>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
> > > >> packet
> > > >>>>>>> +	 * size is supported by the configured device.
> > > >>>>>>> +	 */
> > > >>>>>>> +	if (dev_conf->rxmode.offloads &
> > > >> DEV_RX_OFFLOAD_TCP_LRO) {
> > > >>>>>>> +		ret = check_lro_pkt_size(
> > > >>>>>>> +				port_id, dev_conf-
> > > >>>>>>> rxmode.max_lro_pkt_size,
> > > >>>>>>> +				dev_info.max_lro_pkt_size);
> > > >>>>>>> +		if (ret != 0)
> > > >>>>>>> +			goto rollback;
> > > >>>>>>> +	}
> > > >>>>>>> +
> > > >>>>>>
> > > >>>>>> This check forces applications that enable LRO to provide
> > > >>>> 'max_lro_pkt_size'
> > > >>>>>> config value.
> > > >>>>>
> > > >>>>> Yes.(we can break an API, we noticed it)
> > > >>>>
> > > >>>> I am not talking about API/ABI breakage, that part is OK.
> > > >>>> With this check, if the application requested LRO offload but
> > > >>>> not provided 'max_lro_pkt_size' value, device configuration will fail.
> > > >>>>
> > > >>> Yes
> > > >>>> Can there be a case application is good with whatever the PMD
> > > >>>> can support as max?
> > > >>> Yes can be - you know, we can do everything we want but it is
> > > >>> better to be
> > > >> consistent:
> > > >>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > > >>> offload, max
> > > >> lro pkt len should be mandatory for LRO offload.
> > > >>>
> > > >>> So your question is actually why both, non-lro packets and LRO
> > > >>> packets max
> > > >> size are mandatory...
> > > >>>
> > > >>>
> > > >>> I think it should be important values for net applications
> management.
> > > >>> Also good for mbuf size managements.
> > > >>>
> > > >>>>>
> > > >>>>>> - Why it is mandatory now, how it was working before if it is
> > > >>>>>> mandatory value?
> > > >>>>>
> > > >>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> > > >>>>> frame
> > > >>>> offload.
> > > >>>>> So now, when the user configures a LRO offload he must to set
> > > >>>>> max lro pkt
> > > >>>> len.
> > > >>>>> We don't want to confuse the user here with the max rx pkt len
> > > >>>> configurations and behaviors, they should be with same logic.
> > > >>>>>
> > > >>>>> This parameter defines well the LRO behavior.
> > > >>>>> Before this, each PMD took its own interpretation to what
> > > >>>>> should be the
> > > >>>> maximum size for LRO aggregated packets.
> > > >>>>> Now, the user must say what is his intension, and the ethdev
> > > >>>>> can limit it
> > > >>>> according to the device capability.
> > > >>>>> By this way, also, the PMD can organize\optimize its data-path
> more.
> > > >>>>> Also, the application can create different mempools for LRO
> > > >>>>> queues to
> > > >>>> allow bigger packet receiving for LRO traffic.
> > > >>>>>
> > > >>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so
> > > >>>>>> it is
> > > '0'?
> > > >>>>> Yes, you can see the feature description Dekel added.
> > > >>>>> This patch also updates all the PMDs support an LRO for non-0
> value.
> > > >>>>
> > > >>>> Of course I can see the updates Matan, my point is "What
> > > >>>> happens if PMD doesn't provide 'max_lro_pkt_size'",
> > > >>>> 1) There is no check for it right, so it is acceptable?
> > > >>>
> > > >>> There is check.
> > > >>> If the capability is 0, any non-zero configuration will fail.
> > > >>>
> > > >>>> 2) Are we making this filed mandatory to provide for PMDs, it
> > > >>>> is easy to make new fields mandatory for PMDs but is this
> > > >>>> really
> > > necessary?
> > > >>>
> > > >>> Yes, for consistence.
> > > >>>
> > > >>>>>
> > > >>>>> as same as max rx pkt len, no?
> > > >>>>>
> > > >>>>>> - What do you think setting 'max_lro_pkt_size' config value
> > > >>>>>> to what PMD provided if application doesn't provide it?
> > > >>>>> Same answers as above.
> > > >>>>>
> > > >>>>
> > > >>>> If application doesn't care the value, as it has been till now,
> > > >>>> and not provided explicit 'max_lro_pkt_size', why not ethdev
> > > >>>> level use the value provided by PMD instead of failing?
> > > >>>
> > > >>> Again, same question we can ask on max rx pkt len.
> > > >>>
> > > >>> Looks like the packet size is very important value which should
> > > >>> be set by
> > > >> the application.
> > > >>>
> > > >>> Previous applications have no option to configure it, so they
> > > >>> haven't
> > > >> configure it, (probably cover it somehow) I think it is our miss
> > > >> to supply this info.
> > > >>>
> > > >>> Let's do it in same way as we do max rx pkt len (as this patch main
> idea).
> > > >>> Later, we can change both to other meaning.
> > > >>>
> > > >>
> > > >> I think it is not a good reason to introduce a new mandatory
> > > >> config option for application because of 'max_rx_pkt_len' does it.
> > > >
> > > > It is mandatory only if LRO offload is configured.
> > > >
> > > >> Will it work, if:
> > > >> - If application doesn't provide this value, use the PMD max
> > > >
> > > > May cause a problem if the mbuf size is not enough for the PMD
> maximum.
> > >
> > > OK, this is what I was missing, for this case I was thinking
> > > max_rx_pkt_len will be used but you already explained that
> > > application may want to use different mempools for LRO queues.
> > >
> > So , are you agree with the idea?
> >
> > > For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
> > > account and program the device accordingly (of course in LRO enabled
> > > case) ?
> > > This part seems missing and should be highlighted to other PMD
> maintainers.
> >
> >
> > Yes, you are right.
> > PMDs must limit the LRO aggregated packet according to the new field,
> > And it probably very hard for the patch introducer to understand how to do
> it for each PMD.
> >
> > I think each new configuration requires other maintainers\developers
> > to adjust their own PMD code to the new configuration and it should be
> done in limited time.
> >
> > My suggestion here:
> > 1. To reserve the info field and the configuration field for rc2.(if
> > it is critical not to break ABI for rc3) 2. To merge the ethdev patch in the
> start of rc3.
> > 3. Request each relevant PMD to adjust its PMD to the new configuration
> for the end of rc3.
> > 	Note: this should be small change and only for ~5 PMDs:
> > 		a. Introduce the info field according to the device ability.
> > 		b. For each LRO queue:
> > 			Use the LRO max size configuration instead of the
> current max rx pkt len configuration(looks like small condition).
> 
> That's definitely looks like a significant behavior change for existing apps and
> PMDs, and I wonder what for?

There was a miss in configuration:

It doesn't make sense to limit non-lro queues with the same packets length of lro queues:
	Naturally, LRO packets are bigger significantly(because of the HW aggregation), hence,
	the user may use bigger mbufs for the LRO packets, so potentially, it is better to separate mempool, one for the LRO queues with big mbufs and the second for the non-LRO queues with smaller mbufs (to optimize the memory usage).
	Since the user may want tail-room in the LRO mbuf  it may limit the LRO packet size to smaller number than the mbuf (- HEADROOM) and for this reason as same as the usage of the regular field  (max_rx_pkt_len) a new field should be set for LRO queues.

> Why we can't keep max_rx_pkt_len semantics as it is right now, and just add
> an optional ability to limit max size of LRO aggregations?

What is the semantic of max_rx_pkt_len regards LRO packets? It is not clear from the documentation.
 
So this patch defines it well:
Non-LRO queues should be limited to max_rx_pkt_len.
LRO queues should be limited to max_lro_pkt_len.

The consistence in the ways of the configuration for RX packet length should be the same.
max_rx_pkt_len is mandatory for JUMBO offload => max_lro_pkt_len is mandatory for LRO offload.


Current applications uses LRO just need to configure the field same as current max_rx_pkt_len if they want to stay with the same behavior - really not a big change.
If the application want to improve their memory usage as I said above, the new fields allow it as well. 

> > What do you think?
> >
> >
> >


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 1/3] ethdev: support API to set max LRO packet size
  2019-11-10 23:07  0%         ` Ananyev, Konstantin
@ 2019-11-11  7:40  0%           ` Dekel Peled
  0 siblings, 0 replies; 200+ results
From: Dekel Peled @ 2019-11-11  7:40 UTC (permalink / raw)
  To: Ananyev, Konstantin, Mcnamara, John, Kovacevic, Marko, nhorman,
	ajit.khaparde, somnath.kotur, Burakov, Anatoly, xuanziyang2,
	cloud.wangxiaoyun, zhouguoyang, Lu, Wenzhuo, Matan Azrad,
	Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh, maxime.coquelin,
	Bie, Tiwei, Wang, Zhihong, yongwang, Thomas Monjalon, Yigit,
	Ferruh, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev

Thnaks, PSB.

> -----Original Message-----
> From: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Sent: Monday, November 11, 2019 1:08 AM
> To: Dekel Peled <dekelp@mellanox.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Kovacevic, Marko
> <marko.kovacevic@intel.com>; nhorman@tuxdriver.com;
> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Burakov,
> Anatoly <anatoly.burakov@intel.com>; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Matan Azrad <matan@mellanox.com>; Shahaf
> Shuler <shahafs@mellanox.com>; Slava Ovsiienko
> <viacheslavo@mellanox.com>; rmody@marvell.com;
> shshaikh@marvell.com; maxime.coquelin@redhat.com; Bie, Tiwei
> <tiwei.bie@intel.com>; Wang, Zhihong <zhihong.wang@intel.com>;
> yongwang@vmware.com; Thomas Monjalon <thomas@monjalon.net>; Yigit,
> Ferruh <ferruh.yigit@intel.com>; arybchenko@solarflare.com; Wu, Jingjing
> <jingjing.wu@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [PATCH v5 1/3] ethdev: support API to set max LRO packet size
> 
> 
> 
> > This patch implements [1], to support API for configuration and
> > validation of max size for LRO aggregated packet.
> > API change notice [2] is removed, and release notes for 19.11 are
> > updated accordingly.
> >
> > Various PMDs using LRO offload are updated, the new data members are
> > initialized to ensure they don't fail validation.
> >
> > [1]
> >
> https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fpatch
> >
> es.dpdk.org%2Fpatch%2F58217%2F&amp;data=02%7C01%7Cdekelp%40mell
> anox.co
> >
> m%7Cc12f78c6bd3d48bc223008d76632cd0f%7Ca652971c7d2e4d9ba6a4d1492
> 56f461
> >
> b%7C0%7C0%7C637090240692948792&amp;sdata=pU6LJBYDmlzPFzHc%2FQlF
> UVXpGuv
> > ulTcl%2F29GsXdvBF8%3D&amp;reserved=0
> > [2]
> >
> https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fpatch
> >
> es.dpdk.org%2Fpatch%2F57492%2F&amp;data=02%7C01%7Cdekelp%40mell
> anox.co
> >
> m%7Cc12f78c6bd3d48bc223008d76632cd0f%7Ca652971c7d2e4d9ba6a4d1492
> 56f461
> >
> b%7C0%7C0%7C637090240692958790&amp;sdata=VegV5HcYhkabDgcOF29u
> %2FFLq25I
> > %2BEDZTaEn20A2t2Wo%3D&amp;reserved=0
> 
> Actually if the requirement is just to allow user to limit max lro size, then why
> not to add just new function for that:
> 
> int rte_eth_dev_set_max_lro(uint16_t port_id, uint32_t lro); ?
> 
> And make it optional for the drivers to support it.
> That way PMD/devices that allow LRO max size to be configurable, can
> support it others can fail.

Current implementation is consistent with the existing max_rx_pkt_len use, in case LRO is used.
When using jumbo frames the packet len must be specified.
Using LRO the max session size should be specified.

> 
> Konstantin
> 
> >
> > Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> > Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > Acked-by: Thomas Monjalon <thomas@monjalon.net>
> > Acked-by: Matan Azrad <matan@mellanox.com>
> > ---
> >  doc/guides/nics/features.rst           |  2 ++
> >  doc/guides/rel_notes/deprecation.rst   |  4 ----
> >  doc/guides/rel_notes/release_19_11.rst |  8 +++++++
> >  drivers/net/bnxt/bnxt_ethdev.c         |  1 +
> >  drivers/net/hinic/hinic_pmd_ethdev.c   |  1 +
> >  drivers/net/ixgbe/ixgbe_ethdev.c       |  1 +
> >  drivers/net/mlx5/mlx5.h                |  3 +++
> >  drivers/net/mlx5/mlx5_ethdev.c         |  1 +
> >  drivers/net/mlx5/mlx5_rxq.c            |  1 -
> >  drivers/net/qede/qede_ethdev.c         |  1 +
> >  drivers/net/virtio/virtio_ethdev.c     |  1 +
> >  drivers/net/vmxnet3/vmxnet3_ethdev.c   |  1 +
> >  lib/librte_ethdev/rte_ethdev.c         | 44
> ++++++++++++++++++++++++++++++++++
> >  lib/librte_ethdev/rte_ethdev.h         |  4 ++++
> >  14 files changed, 68 insertions(+), 5 deletions(-)
> >
> > diff --git a/doc/guides/nics/features.rst
> > b/doc/guides/nics/features.rst index 7a31cf7..2138ce3 100644
> > --- a/doc/guides/nics/features.rst
> > +++ b/doc/guides/nics/features.rst
> > @@ -193,10 +193,12 @@ LRO
> >  Supports Large Receive Offload.
> >
> >  * **[uses]       rte_eth_rxconf,rte_eth_rxmode**:
> ``offloads:DEV_RX_OFFLOAD_TCP_LRO``.
> > +  ``dev_conf.rxmode.max_lro_pkt_size``.
> >  * **[implements] datapath**: ``LRO functionality``.
> >  * **[implements] rte_eth_dev_data**: ``lro``.
> >  * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``,
> ``mbuf.tso_segsz``.
> >  * **[provides]   rte_eth_dev_info**:
> ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
> > +* **[provides]   rte_eth_dev_info**: ``max_lro_pkt_size``.
> >
> >
> >  .. _nic_features_tso:
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > index c10dc30..fdec33d 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -87,10 +87,6 @@ Deprecation Notices
> >    This scheme will allow PMDs to avoid lookup to internal ptype table on Rx
> and
> >    thereby improve Rx performance if application wishes do so.
> >
> > -* ethdev: New 32-bit fields may be added for maximum LRO session
> > size, in
> > -  struct ``rte_eth_dev_info`` for the port capability and in struct
> > -  ``rte_eth_rxmode`` for the port configuration.
> > -
> >  * cryptodev: support for using IV with all sizes is added, J0 still can
> >    be used but only when IV length in following structs
> ``rte_crypto_auth_xform``,
> >    ``rte_crypto_aead_xform`` is set to zero. When IV length is greater
> > or equal diff --git a/doc/guides/rel_notes/release_19_11.rst
> > b/doc/guides/rel_notes/release_19_11.rst
> > index 87b7bd0..a3fc023 100644
> > --- a/doc/guides/rel_notes/release_19_11.rst
> > +++ b/doc/guides/rel_notes/release_19_11.rst
> > @@ -418,6 +418,14 @@ ABI Changes
> >    align the Ethernet header on receive and all known encapsulations
> >    preserve the alignment of the header.
> >
> > +* ethdev: Added 32-bit fields for maximum LRO aggregated packet size,
> > +in
> > +  struct ``rte_eth_dev_info`` for the port capability and in struct
> > +  ``rte_eth_rxmode`` for the port configuration.
> > +  Application should use the new field in struct ``rte_eth_rxmode``
> > +to configure
> > +  the requested size.
> 
> That part I am not happy with: * application should use*.
> Many apps I suppose are ok with default LRO size selected by PMD/HW.
> Why to force changes in all of them?

Again this is to keep consistent with max_rx_pkt_len use.

> 
> > +  PMD should use the new field in struct ``rte_eth_dev_info`` to
> > + report the  supported port capability.
> > +
> >
> >  Shared Library Versions
> >  -----------------------
> > diff --git a/drivers/net/bnxt/bnxt_ethdev.c
> > b/drivers/net/bnxt/bnxt_ethdev.c index b9b055e..741b897 100644
> > --- a/drivers/net/bnxt/bnxt_ethdev.c
> > +++ b/drivers/net/bnxt/bnxt_ethdev.c
> > @@ -519,6 +519,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev
> *eth_dev,
> >  	/* Fast path specifics */
> >  	dev_info->min_rx_bufsize = 1;
> >  	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
> > +	dev_info->max_lro_pkt_size = BNXT_MAX_PKT_LEN;
> >
> >  	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
> >  	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED) diff --git
> > a/drivers/net/hinic/hinic_pmd_ethdev.c
> > b/drivers/net/hinic/hinic_pmd_ethdev.c
> > index 9f37a40..b33b2cf 100644
> > --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> > +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> > @@ -727,6 +727,7 @@ static void hinic_get_speed_capa(struct
> rte_eth_dev *dev, uint32_t *speed_capa)
> >  	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
> >  	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
> >  	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
> > +	info->max_lro_pkt_size = HINIC_MAX_JUMBO_FRAME_SIZE;
> >  	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
> >  	info->min_mtu = HINIC_MIN_MTU_SIZE;
> >  	info->max_mtu = HINIC_MAX_MTU_SIZE;
> > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> > b/drivers/net/ixgbe/ixgbe_ethdev.c
> > index 30c0379..5719552 100644
> > --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> > +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> > @@ -3814,6 +3814,7 @@ static int
> ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
> >  	}
> >  	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL
> register */
> >  	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS
> register
> > */
> > +	dev_info->max_lro_pkt_size = RTE_IPV4_MAX_PKT_LEN;
> >  	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
> >  	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
> >  	dev_info->max_vfs = pci_dev->max_vfs; diff --git
> > a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index
> > fab58c9..4783b5c 100644
> > --- a/drivers/net/mlx5/mlx5.h
> > +++ b/drivers/net/mlx5/mlx5.h
> > @@ -206,6 +206,9 @@ struct mlx5_hca_attr {  #define
> > MLX5_LRO_SUPPORTED(dev) \
> >  	(((struct mlx5_priv
> > *)((dev)->data->dev_private))->config.lro.supported)
> >
> > +/* Maximal size of aggregated LRO packet. */ #define
> > +MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
> > +
> >  /* LRO configurations structure. */
> >  struct mlx5_lro_config {
> >  	uint32_t supported:1; /* Whether LRO is supported. */ diff --git
> > a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> > index 2b7c867..3adc824 100644
> > --- a/drivers/net/mlx5/mlx5_ethdev.c
> > +++ b/drivers/net/mlx5/mlx5_ethdev.c
> > @@ -606,6 +606,7 @@ struct ethtool_link_settings {
> >  	/* FIXME: we should ask the device for these values. */
> >  	info->min_rx_bufsize = 32;
> >  	info->max_rx_pktlen = 65536;
> > +	info->max_lro_pkt_size = MLX5_MAX_LRO_SIZE;
> >  	/*
> >  	 * Since we need one CQ per QP, the limit is the minimum number
> >  	 * between the two values.
> > diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> > index 24d0eaa..9423e7b 100644
> > --- a/drivers/net/mlx5/mlx5_rxq.c
> > +++ b/drivers/net/mlx5/mlx5_rxq.c
> > @@ -1701,7 +1701,6 @@ struct mlx5_rxq_obj *
> >  	return 0;
> >  }
> >
> > -#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)  #define
> > MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct
> rte_ether_hdr) + \
> >  					sizeof(struct rte_vlan_hdr) * 2 + \
> >  					sizeof(struct rte_ipv6_hdr)))
> > diff --git a/drivers/net/qede/qede_ethdev.c
> > b/drivers/net/qede/qede_ethdev.c index 575982f..ccbb8a4 100644
> > --- a/drivers/net/qede/qede_ethdev.c
> > +++ b/drivers/net/qede/qede_ethdev.c
> > @@ -1277,6 +1277,7 @@ static int qede_dev_configure(struct rte_eth_dev
> > *eth_dev)
> >
> >  	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
> >  	dev_info->max_rx_pktlen =
> (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
> > +	dev_info->max_lro_pkt_size = (uint32_t)0x7FFF;
> >  	dev_info->rx_desc_lim = qede_rx_desc_lim;
> >  	dev_info->tx_desc_lim = qede_tx_desc_lim;
> >
> > diff --git a/drivers/net/virtio/virtio_ethdev.c
> > b/drivers/net/virtio/virtio_ethdev.c
> > index 044eb10..22ce5a2 100644
> > --- a/drivers/net/virtio/virtio_ethdev.c
> > +++ b/drivers/net/virtio/virtio_ethdev.c
> > @@ -2435,6 +2435,7 @@ static void virtio_dev_free_mbufs(struct
> rte_eth_dev *dev)
> >  		RTE_MIN(hw->max_queue_pairs,
> VIRTIO_MAX_TX_QUEUES);
> >  	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
> >  	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
> > +	dev_info->max_lro_pkt_size = VIRTIO_MAX_RX_PKTLEN;
> >  	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
> >
> >  	host_features = VTPCI_OPS(hw)->get_features(hw); diff --git
> > a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> > b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> > index d1faeaa..d18e8bc 100644
> > --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> > +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> > @@ -1161,6 +1161,7 @@ static int eth_vmxnet3_pci_remove(struct
> rte_pci_device *pci_dev)
> >  	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
> >  	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
> >  	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS
> register
> > */
> > +	dev_info->max_lro_pkt_size = 16384;
> >  	dev_info->speed_capa = ETH_LINK_SPEED_10G;
> >  	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
> >
> > diff --git a/lib/librte_ethdev/rte_ethdev.c
> > b/lib/librte_ethdev/rte_ethdev.c index 652c369..c642ba5 100644
> > --- a/lib/librte_ethdev/rte_ethdev.c
> > +++ b/lib/librte_ethdev/rte_ethdev.c
> > @@ -1136,6 +1136,26 @@ struct rte_eth_dev *
> >  	return name;
> >  }
> >
> > +static inline int
> > +check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
> > +		   uint32_t dev_info_size)
> > +{
> > +	int ret = 0;
> > +
> > +	if (config_size > dev_info_size) {
> > +		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d
> max_lro_pkt_size %u "
> > +			       "> max allowed value %u\n", port_id, config_size,
> > +			       dev_info_size);
> > +		ret = -EINVAL;
> > +	} else if (config_size < RTE_ETHER_MIN_LEN) {
> > +		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d
> max_lro_pkt_size %u "
> > +			       "< min allowed value %u\n", port_id, config_size,
> > +			       (unsigned int)RTE_ETHER_MIN_LEN);
> > +		ret = -EINVAL;
> > +	}
> > +	return ret;
> > +}
> > +
> >  int
> >  rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t
> nb_tx_q,
> >  		      const struct rte_eth_conf *dev_conf) @@ -1266,6
> +1286,18 @@
> > struct rte_eth_dev *
> >
> 	RTE_ETHER_MAX_LEN;
> >  	}
> >
> > +	/*
> > +	 * If LRO is enabled, check that the maximum aggregated packet
> > +	 * size is supported by the configured device.
> > +	 */
> > +	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
> > +		ret = check_lro_pkt_size(
> > +				port_id, dev_conf-
> >rxmode.max_lro_pkt_size,
> > +				dev_info.max_lro_pkt_size);
> > +		if (ret != 0)
> > +			goto rollback;
> > +	}
> > +
> >  	/* Any requested offloading must be within its device capabilities */
> >  	if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) !=
> >  	     dev_conf->rxmode.offloads) {
> > @@ -1770,6 +1802,18 @@ struct rte_eth_dev *
> >  		return -EINVAL;
> >  	}
> >
> > +	/*
> > +	 * If LRO is enabled, check that the maximum aggregated packet
> > +	 * size is supported by the configured device.
> > +	 */
> > +	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
> > +		int ret = check_lro_pkt_size(port_id,
> > +				dev->data-
> >dev_conf.rxmode.max_lro_pkt_size,
> > +				dev_info.max_lro_pkt_size);
> > +		if (ret != 0)
> > +			return ret;
> > +	}
> > +
> >  	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id,
> nb_rx_desc,
> >  					      socket_id, &local_conf, mp);
> >  	if (!ret) {
> > diff --git a/lib/librte_ethdev/rte_ethdev.h
> > b/lib/librte_ethdev/rte_ethdev.h index 44d77b3..1b76df5 100644
> > --- a/lib/librte_ethdev/rte_ethdev.h
> > +++ b/lib/librte_ethdev/rte_ethdev.h
> > @@ -395,6 +395,8 @@ struct rte_eth_rxmode {
> >  	/** The multi-queue packet distribution mode to be used, e.g. RSS.
> */
> >  	enum rte_eth_rx_mq_mode mq_mode;
> >  	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME
> enabled. */
> > +	/** Maximum allowed size of LRO aggregated packet. */
> > +	uint32_t max_lro_pkt_size;
> >  	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
> >  	/**
> >  	 * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
> > @@ -1218,6 +1220,8 @@ struct rte_eth_dev_info {
> >  	const uint32_t *dev_flags; /**< Device flags */
> >  	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
> >  	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX
> pkt.
> > */
> > +	/** Maximum configurable size of LRO aggregated packet. */
> > +	uint32_t max_lro_pkt_size;
> >  	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
> >  	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
> >  	uint32_t max_mac_addrs; /**< Maximum number of MAC
> addresses. */
> > --
> > 1.8.3.1


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2] ethdev: reserve space in main structs for extension
  2019-11-07 22:15  4% [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension Thomas Monjalon
  2019-11-08  3:41  0% ` Stephen Hemminger
  2019-11-08  9:57  0% ` Ferruh Yigit
@ 2019-11-11  7:26  4% ` Thomas Monjalon
  2019-11-11 10:54  0%   ` Ferruh Yigit
  2 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-11  7:26 UTC (permalink / raw)
  To: Ferruh Yigit, Andrew Rybchenko; +Cc: dev

In order to allow smooth addition of features without breaking
ABI compatibility, some space is reserved in several core structs
of ethdev API.

The struct rte_eth_dev and rte_eth_dev_data are supposed
to be used internally only, but there is a chance that
increasing their size would break ABI for some applications.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
v2: padding more struct (config and get_info)

Note: previous acks are not kept in order to request an explicit
review of these new changes.
---
 lib/librte_ethdev/rte_ethdev.h      | 15 +++++++++++++++
 lib/librte_ethdev/rte_ethdev_core.h |  6 ++++++
 2 files changed, 21 insertions(+)

diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 44d77b332e..4ba01905c5 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -402,6 +402,9 @@ struct rte_eth_rxmode {
 	 * structure are allowed to be set.
 	 */
 	uint64_t offloads;
+
+	uint64_t reserved_64s[2]; /**< Reserved for future fields */
+	void *reserved_ptrs[2];   /**< Reserved for future fields */
 };
 
 /**
@@ -802,6 +805,9 @@ struct rte_eth_txmode {
 		/**< If set, reject sending out untagged pkts */
 		hw_vlan_insert_pvid : 1;
 		/**< If set, enable port based VLAN insertion */
+
+	uint64_t reserved_64s[2]; /**< Reserved for future fields */
+	void *reserved_ptrs[2];   /**< Reserved for future fields */
 };
 
 /**
@@ -818,6 +824,9 @@ struct rte_eth_rxconf {
 	 * fields on rte_eth_dev_info structure are allowed to be set.
 	 */
 	uint64_t offloads;
+
+	uint64_t reserved_64s[2]; /**< Reserved for future fields */
+	void *reserved_ptrs[2];   /**< Reserved for future fields */
 };
 
 /**
@@ -836,6 +845,9 @@ struct rte_eth_txconf {
 	 * fields on rte_eth_dev_info structure are allowed to be set.
 	 */
 	uint64_t offloads;
+
+	uint64_t reserved_64s[2]; /**< Reserved for future fields */
+	void *reserved_ptrs[2];   /**< Reserved for future fields */
 };
 
 /**
@@ -1260,6 +1272,9 @@ struct rte_eth_dev_info {
 	 * embedded managed interconnect/switch.
 	 */
 	struct rte_eth_switch_info switch_info;
+
+	uint64_t reserved_64s[2]; /**< Reserved for future fields */
+	void *reserved_ptrs[2];   /**< Reserved for future fields */
 };
 
 /**
diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h
index f215af7c94..4d52be6121 100644
--- a/lib/librte_ethdev/rte_ethdev_core.h
+++ b/lib/librte_ethdev/rte_ethdev_core.h
@@ -785,6 +785,9 @@ struct rte_eth_dev {
 	struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
 	enum rte_eth_dev_state state; /**< Flag indicating the port state */
 	void *security_ctx; /**< Context for security ops */
+
+	uint64_t reserved_64s[4]; /**< Reserved for future fields */
+	void *reserved_ptrs[4];   /**< Reserved for future fields */
 } __rte_cache_aligned;
 
 struct rte_eth_dev_sriov;
@@ -851,6 +854,9 @@ struct rte_eth_dev_data {
 			/**< Switch-specific identifier.
 			 *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.
 			 */
+
+	uint64_t reserved_64s[4]; /**< Reserved for future fields */
+	void *reserved_ptrs[4];   /**< Reserved for future fields */
 } __rte_cache_aligned;
 
 /**
-- 
2.23.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-10 22:51  0%                               ` Ananyev, Konstantin
@ 2019-11-11  6:53  0%                                 ` Matan Azrad
  0 siblings, 0 replies; 200+ results
From: Matan Azrad @ 2019-11-11  6:53 UTC (permalink / raw)
  To: Ananyev, Konstantin, Dekel Peled, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev


Hi

From: Ananyev, Konstantin
> Hi Matan,
> 
> > > > > > > > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > > > > > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > > > > > > >>>>>
> > > > > > > > > >>>> 	RTE_ETHER_MAX_LEN;
> > > > > > > > > >>>>>  	}
> > > > > > > > > >>>>>
> > > > > > > > > >>>>> +	/*
> > > > > > > > > >>>>> +	 * If LRO is enabled, check that the maximum
> > > > > aggregated
> > > > > > > > > packet
> > > > > > > > > >>>>> +	 * size is supported by the configured device.
> > > > > > > > > >>>>> +	 */
> > > > > > > > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > > > > > > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > > > > > > > >>>>> +		ret = check_lro_pkt_size(
> > > > > > > > > >>>>> +				port_id, dev_conf-
> > > > > > > > > >>>>> rxmode.max_lro_pkt_size,
> > > > > > > > > >>>>> +				dev_info.max_lro_pkt_size);
> > > > > > > > > >>>>> +		if (ret != 0)
> > > > > > > > > >>>>> +			goto rollback;
> > > > > > > > > >>>>> +	}
> > > > > > > > > >>>>> +
> > > > > > > > > >>>>
> > > > > > > > > >>>> This check forces applications that enable LRO to
> > > > > > > > > >>>> provide
> > > > > > > > > >> 'max_lro_pkt_size'
> > > > > > > > > >>>> config value.
> > > > > > > > > >>>
> > > > > > > > > >>> Yes.(we can break an API, we noticed it)
> > > > > > > > > >>
> > > > > > > > > >> I am not talking about API/ABI breakage, that part is OK.
> > > > > > > > > >> With this check, if the application requested LRO
> > > > > > > > > >> offload but not provided 'max_lro_pkt_size' value,
> > > > > > > > > >> device configuration will
> > > > > fail.
> > > > > > > > > >>
> > > > > > > > > > Yes
> > > > > > > > > >> Can there be a case application is good with whatever
> > > > > > > > > >> the PMD can support as max?
> > > > > > > > > > Yes can be - you know, we can do everything we want
> > > > > > > > > > but it is better to be
> > > > > > > > > consistent:
> > > > > > > > > > Due to the fact of Max rx pkt len field is mandatory
> > > > > > > > > > for JUMBO offload, max
> > > > > > > > > lro pkt len should be mandatory for LRO offload.
> > > > > > > > > >
> > > > > > > > > > So your question is actually why both, non-lro packets
> > > > > > > > > > and LRO packets max
> > > > > > > > > size are mandatory...
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > I think it should be important values for net
> > > > > > > > > > applications
> > > > > management.
> > > > > > > > > > Also good for mbuf size managements.
> > > > > > > > > >
> > > > > > > > > >>>
> > > > > > > > > >>>> - Why it is mandatory now, how it was working
> > > > > > > > > >>>> before if it is mandatory value?
> > > > > > > > > >>>
> > > > > > > > > >>> It is the same as max_rx_pkt_len which is mandatory
> > > > > > > > > >>> for jumbo frame
> > > > > > > > > >> offload.
> > > > > > > > > >>> So now, when the user configures a LRO offload he
> > > > > > > > > >>> must to set max lro pkt
> > > > > > > > > >> len.
> > > > > > > > > >>> We don't want to confuse the user here with the max
> > > > > > > > > >>> rx pkt len
> > > > > > > > > >> configurations and behaviors, they should be with same
> logic.
> > > > > > > > > >>>
> > > > > > > > > >>> This parameter defines well the LRO behavior.
> > > > > > > > > >>> Before this, each PMD took its own interpretation to
> > > > > > > > > >>> what should be the
> > > > > > > > > >> maximum size for LRO aggregated packets.
> > > > > > > > > >>> Now, the user must say what is his intension, and
> > > > > > > > > >>> the ethdev can limit it
> > > > > > > > > >> according to the device capability.
> > > > > > > > > >>> By this way, also, the PMD can organize\optimize its
> > > > > > > > > >>> data-path
> > > > > more.
> > > > > > > > > >>> Also, the application can create different mempools
> > > > > > > > > >>> for LRO queues to
> > > > > > > > > >> allow bigger packet receiving for LRO traffic.
> > > > > > > > > >>>
> > > > > > > > > >>>> - What happens if PMD doesn't provide
> > > > > > > > > >>>> 'max_lro_pkt_size', so it is
> > > > > > > '0'?
> > > > > > > > > >>> Yes, you can see the feature description Dekel added.
> > > > > > > > > >>> This patch also updates all the PMDs support an LRO
> > > > > > > > > >>> for
> > > > > > > > > >>> non-0
> > > > > value.
> > > > > > > > > >>
> > > > > > > > > >> Of course I can see the updates Matan, my point is
> > > > > > > > > >> "What happens if PMD doesn't provide
> > > > > > > > > >> 'max_lro_pkt_size'",
> > > > > > > > > >> 1) There is no check for it right, so it is acceptable?
> > > > > > > > > >
> > > > > > > > > > There is check.
> > > > > > > > > > If the capability is 0, any non-zero configuration will fail.
> > > > > > > > > >
> > > > > > > > > >> 2) Are we making this filed mandatory to provide for
> > > > > > > > > >> PMDs, it is easy to make new fields mandatory for
> > > > > > > > > >> PMDs but is this really
> > > > > > > necessary?
> > > > > > > > > >
> > > > > > > > > > Yes, for consistence.
> > > > > > > > > >
> > > > > > > > > >>>
> > > > > > > > > >>> as same as max rx pkt len, no?
> > > > > > > > > >>>
> > > > > > > > > >>>> - What do you think setting 'max_lro_pkt_size'
> > > > > > > > > >>>> config value to what PMD provided if application
> > > > > > > > > >>>> doesn't provide
> > > it?
> > > > > > > > > >>> Same answers as above.
> > > > > > > > > >>>
> > > > > > > > > >>
> > > > > > > > > >> If application doesn't care the value, as it has been
> > > > > > > > > >> till now, and not provided explicit
> > > > > > > > > >> 'max_lro_pkt_size', why not ethdev level use the
> > > > > > > > > >> value provided by PMD instead
> > > of failing?
> > > > > > > > > >
> > > > > > > > > > Again, same question we can ask on max rx pkt len.
> > > > > > > > > >
> > > > > > > > > > Looks like the packet size is very important value
> > > > > > > > > > which should be set by
> > > > > > > > > the application.
> > > > > > > > > >
> > > > > > > > > > Previous applications have no option to configure it,
> > > > > > > > > > so they haven't
> > > > > > > > > configure it, (probably cover it somehow) I think it is
> > > > > > > > > our miss to supply this info.
> > > > > > > > > >
> > > > > > > > > > Let's do it in same way as we do max rx pkt len (as
> > > > > > > > > > this patch main
> > > > > idea).
> > > > > > > > > > Later, we can change both to other meaning.
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > > I think it is not a good reason to introduce a new
> > > > > > > > > mandatory config option for application because of
> 'max_rx_pkt_len' does it.
> > > > > > > >
> > > > > > > > It is mandatory only if LRO offload is configured.
> > > > > > >
> > > > > > > So max_rx_pkt_len will remain max size of one packet, while
> > > > > > > max_lro_len will be max accumulate size for each LRO session?
> > > > > > >
> > > > > >
> > > > > > Yes.
> > > > > >
> > > > > > > BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
> > > > > >
> > > > > > Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
> > > > > > Change to RTE_IPV4_MAX_PKT_LEN?
> > > > > >
> > > > > > > ixgbe_vf, as I remember, doesn’t support LRO at all.
> > > > > >
> > > > > > Please see my change in
> > > > > > drivers/net/ixgbe/ixgbe_vf_representor.c
> > > > > > Remove it?
> > > > >
> > > > > Yes, please for both.
> > > >
> > > > Will change in v5.
> > > >
> > > > >
> > > > > >
> > > > > > >
> > > > > > > >
> > > > > > > > > Will it work, if:
> > > > > > > > > - If application doesn't provide this value, use the PMD
> > > > > > > > > max
> > > > > > > >
> > > > > > > > May cause a problem if the mbuf size is not enough for the
> > > > > > > > PMD
> > > > > maximum.
> > > > > > >
> > > > > > > Another question, what will happen if PMD will ignore that
> > > > > > > value and will generate packets bigger then requested?
> > > > > >
> > > > > > PMD should use this value and not ignore it.
> > > > >
> > > > > Hmm, ok but this patch updates mxl driver only...
> > > > > I suppose you expect other PMD maintainers to do the job for
> > > > > their PMDs, right?
> > > > > If so, are they aware (and agree) for this new hard requirement
> > > > > and changes required?
> > > > > Again what PMD should do if it can't support exact value?
> > > > > Let say user asked max_lro_size=20KB but PMD can do only 16KB or
> > > 24KB?
> > > > > Should it fail, or round to smallest, or ...?
> > > > >
> > > > > Actually I wonder, should it really be a hard requirement or
> > > > > more like a guidance to PMD?
> > > > > Why app needs and *exact* value for LRO size?
> > > >
> > > > The exact value should be configured to HW as LRO session limit.
> > >
> > > But if the HW can't support this exact value, see the example above?
> > > In fact, shouldn't we allow PMD to forbid user to configure max LRO size?
> > > Let say if in dev_info max_lro_size==0, then PMD doesn't support LRO
> > > size configuration at all.
> > > That way PMDs who do support LRO, but don't want to (can't to)
> > > support configurable LRO size will stay untouched.
> >
> > Each HW should support packet size limitation no matter if it is LRO packet
> or not:
> > How does the PMD limit the packet size for max rx packet len conf?
> > How does the PMD limit the packet size for the mbuf size?
> 
> Not sure I understand your statement and questions above...
> For sure PMD has to support max_rx_pktlen., but how does it relate to
> max_lro?

You said that HW may not support LRO max size configuration.
I answered that as same as the HW can limit packets to the configuration of max_rx_pkt_len, so it can limit LRO packets size here too.
For simplifications:
Rx Queues which are not configured to do LRO offload should limit their packets to the max_rx_pkt_len field.
Rx Queues which are configured to do LRO offload should limit their packets to the max_lro_pkt_len new field.

In addition, both should limit the packets size to the mbuf size of the Rx mempool configured to the Rx queue( if scatter offload is not enabled).





^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-09 18:20  3%                     ` Matan Azrad
@ 2019-11-10 23:40  0%                       ` Ananyev, Konstantin
  2019-11-11  8:01  0%                         ` Matan Azrad
  2019-11-11 11:15  0%                       ` Ferruh Yigit
  1 sibling, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-10 23:40 UTC (permalink / raw)
  To: Matan Azrad, Yigit, Ferruh, Dekel Peled, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev



> 
> From: Ferruh Yigit
> > On 11/8/2019 11:56 AM, Matan Azrad wrote:
> > >
> > >
> > > From: Ferruh Yigit
> > >> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> > >>>
> > >>>
> > >>> From: Ferruh Yigit
> > >>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> > >>>>> Hi
> > >>>>>
> > >>>>> From: Ferruh Yigit
> > >>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > >>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > >>>>>>>
> > >>>>>> 	RTE_ETHER_MAX_LEN;
> > >>>>>>>  	}
> > >>>>>>>
> > >>>>>>> +	/*
> > >>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
> > >> packet
> > >>>>>>> +	 * size is supported by the configured device.
> > >>>>>>> +	 */
> > >>>>>>> +	if (dev_conf->rxmode.offloads &
> > >> DEV_RX_OFFLOAD_TCP_LRO) {
> > >>>>>>> +		ret = check_lro_pkt_size(
> > >>>>>>> +				port_id, dev_conf-
> > >>>>>>> rxmode.max_lro_pkt_size,
> > >>>>>>> +				dev_info.max_lro_pkt_size);
> > >>>>>>> +		if (ret != 0)
> > >>>>>>> +			goto rollback;
> > >>>>>>> +	}
> > >>>>>>> +
> > >>>>>>
> > >>>>>> This check forces applications that enable LRO to provide
> > >>>> 'max_lro_pkt_size'
> > >>>>>> config value.
> > >>>>>
> > >>>>> Yes.(we can break an API, we noticed it)
> > >>>>
> > >>>> I am not talking about API/ABI breakage, that part is OK.
> > >>>> With this check, if the application requested LRO offload but not
> > >>>> provided 'max_lro_pkt_size' value, device configuration will fail.
> > >>>>
> > >>> Yes
> > >>>> Can there be a case application is good with whatever the PMD can
> > >>>> support as max?
> > >>> Yes can be - you know, we can do everything we want but it is better
> > >>> to be
> > >> consistent:
> > >>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > >>> offload, max
> > >> lro pkt len should be mandatory for LRO offload.
> > >>>
> > >>> So your question is actually why both, non-lro packets and LRO
> > >>> packets max
> > >> size are mandatory...
> > >>>
> > >>>
> > >>> I think it should be important values for net applications management.
> > >>> Also good for mbuf size managements.
> > >>>
> > >>>>>
> > >>>>>> - Why it is mandatory now, how it was working before if it is
> > >>>>>> mandatory value?
> > >>>>>
> > >>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> > >>>>> frame
> > >>>> offload.
> > >>>>> So now, when the user configures a LRO offload he must to set max
> > >>>>> lro pkt
> > >>>> len.
> > >>>>> We don't want to confuse the user here with the max rx pkt len
> > >>>> configurations and behaviors, they should be with same logic.
> > >>>>>
> > >>>>> This parameter defines well the LRO behavior.
> > >>>>> Before this, each PMD took its own interpretation to what should
> > >>>>> be the
> > >>>> maximum size for LRO aggregated packets.
> > >>>>> Now, the user must say what is his intension, and the ethdev can
> > >>>>> limit it
> > >>>> according to the device capability.
> > >>>>> By this way, also, the PMD can organize\optimize its data-path more.
> > >>>>> Also, the application can create different mempools for LRO queues
> > >>>>> to
> > >>>> allow bigger packet receiving for LRO traffic.
> > >>>>>
> > >>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
> > '0'?
> > >>>>> Yes, you can see the feature description Dekel added.
> > >>>>> This patch also updates all the PMDs support an LRO for non-0 value.
> > >>>>
> > >>>> Of course I can see the updates Matan, my point is "What happens if
> > >>>> PMD doesn't provide 'max_lro_pkt_size'",
> > >>>> 1) There is no check for it right, so it is acceptable?
> > >>>
> > >>> There is check.
> > >>> If the capability is 0, any non-zero configuration will fail.
> > >>>
> > >>>> 2) Are we making this filed mandatory to provide for PMDs, it is
> > >>>> easy to make new fields mandatory for PMDs but is this really
> > necessary?
> > >>>
> > >>> Yes, for consistence.
> > >>>
> > >>>>>
> > >>>>> as same as max rx pkt len, no?
> > >>>>>
> > >>>>>> - What do you think setting 'max_lro_pkt_size' config value to
> > >>>>>> what PMD provided if application doesn't provide it?
> > >>>>> Same answers as above.
> > >>>>>
> > >>>>
> > >>>> If application doesn't care the value, as it has been till now, and
> > >>>> not provided explicit 'max_lro_pkt_size', why not ethdev level use
> > >>>> the value provided by PMD instead of failing?
> > >>>
> > >>> Again, same question we can ask on max rx pkt len.
> > >>>
> > >>> Looks like the packet size is very important value which should be
> > >>> set by
> > >> the application.
> > >>>
> > >>> Previous applications have no option to configure it, so they
> > >>> haven't
> > >> configure it, (probably cover it somehow) I think it is our miss to
> > >> supply this info.
> > >>>
> > >>> Let's do it in same way as we do max rx pkt len (as this patch main idea).
> > >>> Later, we can change both to other meaning.
> > >>>
> > >>
> > >> I think it is not a good reason to introduce a new mandatory config
> > >> option for application because of 'max_rx_pkt_len' does it.
> > >
> > > It is mandatory only if LRO offload is configured.
> > >
> > >> Will it work, if:
> > >> - If application doesn't provide this value, use the PMD max
> > >
> > > May cause a problem if the mbuf size is not enough for the PMD maximum.
> >
> > OK, this is what I was missing, for this case I was thinking max_rx_pkt_len will
> > be used but you already explained that application may want to use different
> > mempools for LRO queues.
> >
> So , are you agree with the idea?
> 
> > For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
> > account and program the device accordingly (of course in LRO enabled case)
> > ?
> > This part seems missing and should be highlighted to other PMD maintainers.
> 
> 
> Yes, you are right.
> PMDs must limit the LRO aggregated packet according to the new field,
> And it probably very hard for the patch introducer to understand how to do it for each PMD.
> 
> I think each new configuration requires other maintainers\developers to adjust their own PMD code to the new configuration and it should
> be done in limited time.
> 
> My suggestion here:
> 1. To reserve the info field and the configuration field for rc2.(if it is critical not to break ABI for rc3)
> 2. To merge the ethdev patch in the start of rc3.
> 3. Request each relevant PMD to adjust its PMD to the new configuration for the end of rc3.
> 	Note: this should be small change and only for ~5 PMDs:
> 		a. Introduce the info field according to the device ability.
> 		b. For each LRO queue:
> 			Use the LRO max size configuration instead of the current max rx pkt len configuration(looks like small condition).

That's definitely looks like a significant behavior change for existing apps and PMDs,
and I wonder what for?
Why we can't keep max_rx_pkt_len semantics as it is right now,
and just add an optional ability to limit max size of LRO aggregations?
 
> 
> What do you think?
> 
> 
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 16:42  4%       ` [dpdk-dev] [PATCH v5 1/3] ethdev: " Dekel Peled
@ 2019-11-10 23:07  0%         ` Ananyev, Konstantin
  2019-11-11  7:40  0%           ` Dekel Peled
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-10 23:07 UTC (permalink / raw)
  To: Dekel Peled, Mcnamara, John, Kovacevic, Marko, nhorman,
	ajit.khaparde, somnath.kotur, Burakov, Anatoly, xuanziyang2,
	cloud.wangxiaoyun, zhouguoyang, Lu, Wenzhuo, matan, shahafs,
	viacheslavo, rmody, shshaikh, maxime.coquelin, Bie, Tiwei, Wang,
	Zhihong, yongwang, thomas, Yigit, Ferruh, arybchenko, Wu,
	Jingjing, Iremonger, Bernard
  Cc: dev



> This patch implements [1], to support API for configuration and
> validation of max size for LRO aggregated packet.
> API change notice [2] is removed, and release notes for 19.11
> are updated accordingly.
> 
> Various PMDs using LRO offload are updated, the new data members are
> initialized to ensure they don't fail validation.
> 
> [1] http://patches.dpdk.org/patch/58217/
> [2] http://patches.dpdk.org/patch/57492/

Actually if the requirement is just to allow user to limit max lro size,
then why not to add just new function for that:

int rte_eth_dev_set_max_lro(uint16_t port_id, uint32_t lro);
?

And make it optional for the drivers to support it.
That way PMD/devices that allow LRO max size to be configurable,
can support it others can fail.
 
Konstantin

> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> Acked-by: Thomas Monjalon <thomas@monjalon.net>
> Acked-by: Matan Azrad <matan@mellanox.com>
> ---
>  doc/guides/nics/features.rst           |  2 ++
>  doc/guides/rel_notes/deprecation.rst   |  4 ----
>  doc/guides/rel_notes/release_19_11.rst |  8 +++++++
>  drivers/net/bnxt/bnxt_ethdev.c         |  1 +
>  drivers/net/hinic/hinic_pmd_ethdev.c   |  1 +
>  drivers/net/ixgbe/ixgbe_ethdev.c       |  1 +
>  drivers/net/mlx5/mlx5.h                |  3 +++
>  drivers/net/mlx5/mlx5_ethdev.c         |  1 +
>  drivers/net/mlx5/mlx5_rxq.c            |  1 -
>  drivers/net/qede/qede_ethdev.c         |  1 +
>  drivers/net/virtio/virtio_ethdev.c     |  1 +
>  drivers/net/vmxnet3/vmxnet3_ethdev.c   |  1 +
>  lib/librte_ethdev/rte_ethdev.c         | 44 ++++++++++++++++++++++++++++++++++
>  lib/librte_ethdev/rte_ethdev.h         |  4 ++++
>  14 files changed, 68 insertions(+), 5 deletions(-)
> 
> diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
> index 7a31cf7..2138ce3 100644
> --- a/doc/guides/nics/features.rst
> +++ b/doc/guides/nics/features.rst
> @@ -193,10 +193,12 @@ LRO
>  Supports Large Receive Offload.
> 
>  * **[uses]       rte_eth_rxconf,rte_eth_rxmode**: ``offloads:DEV_RX_OFFLOAD_TCP_LRO``.
> +  ``dev_conf.rxmode.max_lro_pkt_size``.
>  * **[implements] datapath**: ``LRO functionality``.
>  * **[implements] rte_eth_dev_data**: ``lro``.
>  * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
>  * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
> +* **[provides]   rte_eth_dev_info**: ``max_lro_pkt_size``.
> 
> 
>  .. _nic_features_tso:
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index c10dc30..fdec33d 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -87,10 +87,6 @@ Deprecation Notices
>    This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
>    thereby improve Rx performance if application wishes do so.
> 
> -* ethdev: New 32-bit fields may be added for maximum LRO session size, in
> -  struct ``rte_eth_dev_info`` for the port capability and in struct
> -  ``rte_eth_rxmode`` for the port configuration.
> -
>  * cryptodev: support for using IV with all sizes is added, J0 still can
>    be used but only when IV length in following structs ``rte_crypto_auth_xform``,
>    ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
> diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
> index 87b7bd0..a3fc023 100644
> --- a/doc/guides/rel_notes/release_19_11.rst
> +++ b/doc/guides/rel_notes/release_19_11.rst
> @@ -418,6 +418,14 @@ ABI Changes
>    align the Ethernet header on receive and all known encapsulations
>    preserve the alignment of the header.
> 
> +* ethdev: Added 32-bit fields for maximum LRO aggregated packet size, in
> +  struct ``rte_eth_dev_info`` for the port capability and in struct
> +  ``rte_eth_rxmode`` for the port configuration.
> +  Application should use the new field in struct ``rte_eth_rxmode`` to configure
> +  the requested size.

That part I am not happy with: * application should use*.
Many apps I suppose are ok with default LRO size selected by PMD/HW.
Why to force changes in all of them?

> +  PMD should use the new field in struct ``rte_eth_dev_info`` to report the
> +  supported port capability.
> +
> 
>  Shared Library Versions
>  -----------------------
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index b9b055e..741b897 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -519,6 +519,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
>  	/* Fast path specifics */
>  	dev_info->min_rx_bufsize = 1;
>  	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
> +	dev_info->max_lro_pkt_size = BNXT_MAX_PKT_LEN;
> 
>  	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
>  	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED)
> diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
> index 9f37a40..b33b2cf 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -727,6 +727,7 @@ static void hinic_get_speed_capa(struct rte_eth_dev *dev, uint32_t *speed_capa)
>  	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
>  	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
>  	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
> +	info->max_lro_pkt_size = HINIC_MAX_JUMBO_FRAME_SIZE;
>  	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
>  	info->min_mtu = HINIC_MIN_MTU_SIZE;
>  	info->max_mtu = HINIC_MAX_MTU_SIZE;
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 30c0379..5719552 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -3814,6 +3814,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
>  	}
>  	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL register */
>  	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
> +	dev_info->max_lro_pkt_size = RTE_IPV4_MAX_PKT_LEN;
>  	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
>  	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
>  	dev_info->max_vfs = pci_dev->max_vfs;
> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
> index fab58c9..4783b5c 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -206,6 +206,9 @@ struct mlx5_hca_attr {
>  #define MLX5_LRO_SUPPORTED(dev) \
>  	(((struct mlx5_priv *)((dev)->data->dev_private))->config.lro.supported)
> 
> +/* Maximal size of aggregated LRO packet. */
> +#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
> +
>  /* LRO configurations structure. */
>  struct mlx5_lro_config {
>  	uint32_t supported:1; /* Whether LRO is supported. */
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index 2b7c867..3adc824 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -606,6 +606,7 @@ struct ethtool_link_settings {
>  	/* FIXME: we should ask the device for these values. */
>  	info->min_rx_bufsize = 32;
>  	info->max_rx_pktlen = 65536;
> +	info->max_lro_pkt_size = MLX5_MAX_LRO_SIZE;
>  	/*
>  	 * Since we need one CQ per QP, the limit is the minimum number
>  	 * between the two values.
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index 24d0eaa..9423e7b 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -1701,7 +1701,6 @@ struct mlx5_rxq_obj *
>  	return 0;
>  }
> 
> -#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
>  #define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
>  					sizeof(struct rte_vlan_hdr) * 2 + \
>  					sizeof(struct rte_ipv6_hdr)))
> diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
> index 575982f..ccbb8a4 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -1277,6 +1277,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
> 
>  	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
>  	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
> +	dev_info->max_lro_pkt_size = (uint32_t)0x7FFF;
>  	dev_info->rx_desc_lim = qede_rx_desc_lim;
>  	dev_info->tx_desc_lim = qede_tx_desc_lim;
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 044eb10..22ce5a2 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -2435,6 +2435,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
>  		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
>  	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
>  	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
> +	dev_info->max_lro_pkt_size = VIRTIO_MAX_RX_PKTLEN;
>  	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
> 
>  	host_features = VTPCI_OPS(hw)->get_features(hw);
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> index d1faeaa..d18e8bc 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> @@ -1161,6 +1161,7 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)
>  	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
>  	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
>  	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */
> +	dev_info->max_lro_pkt_size = 16384;
>  	dev_info->speed_capa = ETH_LINK_SPEED_10G;
>  	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
> 
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index 652c369..c642ba5 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -1136,6 +1136,26 @@ struct rte_eth_dev *
>  	return name;
>  }
> 
> +static inline int
> +check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
> +		   uint32_t dev_info_size)
> +{
> +	int ret = 0;
> +
> +	if (config_size > dev_info_size) {
> +		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
> +			       "> max allowed value %u\n", port_id, config_size,
> +			       dev_info_size);
> +		ret = -EINVAL;
> +	} else if (config_size < RTE_ETHER_MIN_LEN) {
> +		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
> +			       "< min allowed value %u\n", port_id, config_size,
> +			       (unsigned int)RTE_ETHER_MIN_LEN);
> +		ret = -EINVAL;
> +	}
> +	return ret;
> +}
> +
>  int
>  rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
>  		      const struct rte_eth_conf *dev_conf)
> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>  							RTE_ETHER_MAX_LEN;
>  	}
> 
> +	/*
> +	 * If LRO is enabled, check that the maximum aggregated packet
> +	 * size is supported by the configured device.
> +	 */
> +	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
> +		ret = check_lro_pkt_size(
> +				port_id, dev_conf->rxmode.max_lro_pkt_size,
> +				dev_info.max_lro_pkt_size);
> +		if (ret != 0)
> +			goto rollback;
> +	}
> +
>  	/* Any requested offloading must be within its device capabilities */
>  	if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) !=
>  	     dev_conf->rxmode.offloads) {
> @@ -1770,6 +1802,18 @@ struct rte_eth_dev *
>  		return -EINVAL;
>  	}
> 
> +	/*
> +	 * If LRO is enabled, check that the maximum aggregated packet
> +	 * size is supported by the configured device.
> +	 */
> +	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
> +		int ret = check_lro_pkt_size(port_id,
> +				dev->data->dev_conf.rxmode.max_lro_pkt_size,
> +				dev_info.max_lro_pkt_size);
> +		if (ret != 0)
> +			return ret;
> +	}
> +
>  	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
>  					      socket_id, &local_conf, mp);
>  	if (!ret) {
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index 44d77b3..1b76df5 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -395,6 +395,8 @@ struct rte_eth_rxmode {
>  	/** The multi-queue packet distribution mode to be used, e.g. RSS. */
>  	enum rte_eth_rx_mq_mode mq_mode;
>  	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME enabled. */
> +	/** Maximum allowed size of LRO aggregated packet. */
> +	uint32_t max_lro_pkt_size;
>  	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
>  	/**
>  	 * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
> @@ -1218,6 +1220,8 @@ struct rte_eth_dev_info {
>  	const uint32_t *dev_flags; /**< Device flags */
>  	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
>  	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
> +	/** Maximum configurable size of LRO aggregated packet. */
> +	uint32_t max_lro_pkt_size;
>  	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
>  	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
>  	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
> --
> 1.8.3.1


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-09 18:26  0%                             ` Matan Azrad
@ 2019-11-10 22:51  0%                               ` Ananyev, Konstantin
  2019-11-11  6:53  0%                                 ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-10 22:51 UTC (permalink / raw)
  To: Matan Azrad, Dekel Peled, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev

Hi Matan,

> > > > > > > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > > > > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > > > > > >>>>>
> > > > > > > > >>>> 	RTE_ETHER_MAX_LEN;
> > > > > > > > >>>>>  	}
> > > > > > > > >>>>>
> > > > > > > > >>>>> +	/*
> > > > > > > > >>>>> +	 * If LRO is enabled, check that the maximum
> > > > aggregated
> > > > > > > > packet
> > > > > > > > >>>>> +	 * size is supported by the configured device.
> > > > > > > > >>>>> +	 */
> > > > > > > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > > > > > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > > > > > > >>>>> +		ret = check_lro_pkt_size(
> > > > > > > > >>>>> +				port_id, dev_conf-
> > > > > > > > >>>>> rxmode.max_lro_pkt_size,
> > > > > > > > >>>>> +				dev_info.max_lro_pkt_size);
> > > > > > > > >>>>> +		if (ret != 0)
> > > > > > > > >>>>> +			goto rollback;
> > > > > > > > >>>>> +	}
> > > > > > > > >>>>> +
> > > > > > > > >>>>
> > > > > > > > >>>> This check forces applications that enable LRO to
> > > > > > > > >>>> provide
> > > > > > > > >> 'max_lro_pkt_size'
> > > > > > > > >>>> config value.
> > > > > > > > >>>
> > > > > > > > >>> Yes.(we can break an API, we noticed it)
> > > > > > > > >>
> > > > > > > > >> I am not talking about API/ABI breakage, that part is OK.
> > > > > > > > >> With this check, if the application requested LRO offload
> > > > > > > > >> but not provided 'max_lro_pkt_size' value, device
> > > > > > > > >> configuration will
> > > > fail.
> > > > > > > > >>
> > > > > > > > > Yes
> > > > > > > > >> Can there be a case application is good with whatever the
> > > > > > > > >> PMD can support as max?
> > > > > > > > > Yes can be - you know, we can do everything we want but it
> > > > > > > > > is better to be
> > > > > > > > consistent:
> > > > > > > > > Due to the fact of Max rx pkt len field is mandatory for
> > > > > > > > > JUMBO offload, max
> > > > > > > > lro pkt len should be mandatory for LRO offload.
> > > > > > > > >
> > > > > > > > > So your question is actually why both, non-lro packets and
> > > > > > > > > LRO packets max
> > > > > > > > size are mandatory...
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > I think it should be important values for net applications
> > > > management.
> > > > > > > > > Also good for mbuf size managements.
> > > > > > > > >
> > > > > > > > >>>
> > > > > > > > >>>> - Why it is mandatory now, how it was working before if
> > > > > > > > >>>> it is mandatory value?
> > > > > > > > >>>
> > > > > > > > >>> It is the same as max_rx_pkt_len which is mandatory for
> > > > > > > > >>> jumbo frame
> > > > > > > > >> offload.
> > > > > > > > >>> So now, when the user configures a LRO offload he must
> > > > > > > > >>> to set max lro pkt
> > > > > > > > >> len.
> > > > > > > > >>> We don't want to confuse the user here with the max rx
> > > > > > > > >>> pkt len
> > > > > > > > >> configurations and behaviors, they should be with same logic.
> > > > > > > > >>>
> > > > > > > > >>> This parameter defines well the LRO behavior.
> > > > > > > > >>> Before this, each PMD took its own interpretation to
> > > > > > > > >>> what should be the
> > > > > > > > >> maximum size for LRO aggregated packets.
> > > > > > > > >>> Now, the user must say what is his intension, and the
> > > > > > > > >>> ethdev can limit it
> > > > > > > > >> according to the device capability.
> > > > > > > > >>> By this way, also, the PMD can organize\optimize its
> > > > > > > > >>> data-path
> > > > more.
> > > > > > > > >>> Also, the application can create different mempools for
> > > > > > > > >>> LRO queues to
> > > > > > > > >> allow bigger packet receiving for LRO traffic.
> > > > > > > > >>>
> > > > > > > > >>>> - What happens if PMD doesn't provide
> > > > > > > > >>>> 'max_lro_pkt_size', so it is
> > > > > > '0'?
> > > > > > > > >>> Yes, you can see the feature description Dekel added.
> > > > > > > > >>> This patch also updates all the PMDs support an LRO for
> > > > > > > > >>> non-0
> > > > value.
> > > > > > > > >>
> > > > > > > > >> Of course I can see the updates Matan, my point is "What
> > > > > > > > >> happens if PMD doesn't provide 'max_lro_pkt_size'",
> > > > > > > > >> 1) There is no check for it right, so it is acceptable?
> > > > > > > > >
> > > > > > > > > There is check.
> > > > > > > > > If the capability is 0, any non-zero configuration will fail.
> > > > > > > > >
> > > > > > > > >> 2) Are we making this filed mandatory to provide for
> > > > > > > > >> PMDs, it is easy to make new fields mandatory for PMDs
> > > > > > > > >> but is this really
> > > > > > necessary?
> > > > > > > > >
> > > > > > > > > Yes, for consistence.
> > > > > > > > >
> > > > > > > > >>>
> > > > > > > > >>> as same as max rx pkt len, no?
> > > > > > > > >>>
> > > > > > > > >>>> - What do you think setting 'max_lro_pkt_size' config
> > > > > > > > >>>> value to what PMD provided if application doesn't provide
> > it?
> > > > > > > > >>> Same answers as above.
> > > > > > > > >>>
> > > > > > > > >>
> > > > > > > > >> If application doesn't care the value, as it has been
> > > > > > > > >> till now, and not provided explicit 'max_lro_pkt_size',
> > > > > > > > >> why not ethdev level use the value provided by PMD instead
> > of failing?
> > > > > > > > >
> > > > > > > > > Again, same question we can ask on max rx pkt len.
> > > > > > > > >
> > > > > > > > > Looks like the packet size is very important value which
> > > > > > > > > should be set by
> > > > > > > > the application.
> > > > > > > > >
> > > > > > > > > Previous applications have no option to configure it, so
> > > > > > > > > they haven't
> > > > > > > > configure it, (probably cover it somehow) I think it is our
> > > > > > > > miss to supply this info.
> > > > > > > > >
> > > > > > > > > Let's do it in same way as we do max rx pkt len (as this
> > > > > > > > > patch main
> > > > idea).
> > > > > > > > > Later, we can change both to other meaning.
> > > > > > > > >
> > > > > > > >
> > > > > > > > I think it is not a good reason to introduce a new mandatory
> > > > > > > > config option for application because of 'max_rx_pkt_len' does it.
> > > > > > >
> > > > > > > It is mandatory only if LRO offload is configured.
> > > > > >
> > > > > > So max_rx_pkt_len will remain max size of one packet, while
> > > > > > max_lro_len will be max accumulate size for each LRO session?
> > > > > >
> > > > >
> > > > > Yes.
> > > > >
> > > > > > BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
> > > > >
> > > > > Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
> > > > > Change to RTE_IPV4_MAX_PKT_LEN?
> > > > >
> > > > > > ixgbe_vf, as I remember, doesn’t support LRO at all.
> > > > >
> > > > > Please see my change in drivers/net/ixgbe/ixgbe_vf_representor.c
> > > > > Remove it?
> > > >
> > > > Yes, please for both.
> > >
> > > Will change in v5.
> > >
> > > >
> > > > >
> > > > > >
> > > > > > >
> > > > > > > > Will it work, if:
> > > > > > > > - If application doesn't provide this value, use the PMD max
> > > > > > >
> > > > > > > May cause a problem if the mbuf size is not enough for the PMD
> > > > maximum.
> > > > > >
> > > > > > Another question, what will happen if PMD will ignore that value
> > > > > > and will generate packets bigger then requested?
> > > > >
> > > > > PMD should use this value and not ignore it.
> > > >
> > > > Hmm, ok but this patch updates mxl driver only...
> > > > I suppose you expect other PMD maintainers to do the job for their
> > > > PMDs, right?
> > > > If so, are they aware (and agree) for this new hard requirement and
> > > > changes required?
> > > > Again what PMD should do if it can't support exact value?
> > > > Let say user asked max_lro_size=20KB but PMD can do only 16KB or
> > 24KB?
> > > > Should it fail, or round to smallest, or ...?
> > > >
> > > > Actually I wonder, should it really be a hard requirement or more
> > > > like a guidance to PMD?
> > > > Why app needs and *exact* value for LRO size?
> > >
> > > The exact value should be configured to HW as LRO session limit.
> >
> > But if the HW can't support this exact value, see the example above?
> > In fact, shouldn't we allow PMD to forbid user to configure max LRO size?
> > Let say if in dev_info max_lro_size==0, then PMD doesn't support LRO size
> > configuration at all.
> > That way PMDs who do support LRO, but don't want to (can't to) support
> > configurable LRO size will stay untouched.
> 
> Each HW should support packet size limitation no matter if it is LRO packet or not:
> How does the PMD limit the packet size for max rx packet len conf?
> How does the PMD limit the packet size for the mbuf size?

Not sure I understand your statement and questions above...
For sure PMD has to support max_rx_pktlen., but how does it relate to max_lro?
Konstantin




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6] ethdev: add max LRO packet size
  2019-11-08 23:07  4% ` [dpdk-dev] [PATCH v6] ethdev: add " Thomas Monjalon
@ 2019-11-10 22:47  0%   ` Ananyev, Konstantin
    1 sibling, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2019-11-10 22:47 UTC (permalink / raw)
  To: Thomas Monjalon, Mcnamara, John, Kovacevic, Marko, Neil Horman,
	Ajit Khaparde, Somnath Kotur, Ziyang Xuan, Xiaoyun Wang,
	Guoyang Zhou, Lu, Wenzhuo, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Rasesh Mody, Shahed Shaikh,
	Maxime Coquelin, Bie, Tiwei, Wang, Zhihong, Yong Wang, Yigit,
	Ferruh, Andrew Rybchenko
  Cc: dev, Dekel Peled


> 
> From: Dekel Peled <dekelp@mellanox.com>
> 
> The maximum supported aggregated packet size for LRO
> is advertised in rte_eth_dev_info.
> For some devices, max_lro_pktlen may be different of
> the basic max_rx_pktlen property.
> 
> Various PMDs supporting LRO are updated.
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
> 
> v6: This is half of v5 1/3. Only the agreed part is here.
> Hope it represents the consensus, so we make a step forward.
> The field max_lro_pkt_size is renamed to max_lro_pktlen
> in order to look like max_rx_pktlen.
> 
> ---
>  doc/guides/nics/features.rst           | 1 +
>  doc/guides/rel_notes/deprecation.rst   | 4 ----
>  doc/guides/rel_notes/release_19_11.rst | 3 +++
>  drivers/net/bnxt/bnxt_ethdev.c         | 1 +
>  drivers/net/hinic/hinic_pmd_ethdev.c   | 1 +
>  drivers/net/ixgbe/ixgbe_ethdev.c       | 1 +
>  drivers/net/mlx5/mlx5.h                | 3 +++
>  drivers/net/mlx5/mlx5_ethdev.c         | 1 +
>  drivers/net/mlx5/mlx5_rxq.c            | 1 -
>  drivers/net/qede/qede_ethdev.c         | 1 +
>  drivers/net/virtio/virtio_ethdev.c     | 1 +
>  drivers/net/vmxnet3/vmxnet3_ethdev.c   | 1 +
>  lib/librte_ethdev/rte_ethdev.h         | 1 +
>  13 files changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
> index d96696801a..1b2e120a9d 100644
> --- a/doc/guides/nics/features.rst
> +++ b/doc/guides/nics/features.rst
> @@ -197,6 +197,7 @@ Supports Large Receive Offload.
>  * **[implements] rte_eth_dev_data**: ``lro``.
>  * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
>  * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
> +* **[provides]   rte_eth_dev_info**: ``max_lro_pktlen``.
> 
> 
>  .. _nic_features_tso:
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index b0b992dcb5..d4fcf9975b 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -88,10 +88,6 @@ Deprecation Notices
>    This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
>    thereby improve Rx performance if application wishes do so.
> 
> -* ethdev: New 32-bit fields may be added for maximum LRO session size, in
> -  struct ``rte_eth_dev_info`` for the port capability and in struct
> -  ``rte_eth_rxmode`` for the port configuration.
> -
>  * cryptodev: support for using IV with all sizes is added, J0 still can
>    be used but only when IV length in following structs ``rte_crypto_auth_xform``,
>    ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
> diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
> index 795c7601c0..473af44374 100644
> --- a/doc/guides/rel_notes/release_19_11.rst
> +++ b/doc/guides/rel_notes/release_19_11.rst
> @@ -403,6 +403,9 @@ ABI Changes
>    align the Ethernet header on receive and all known encapsulations
>    preserve the alignment of the header.
> 
> +* ethdev: Added 32-bit field for maximum LRO aggregated packet size,
> +  as port capability in the struct ``rte_eth_dev_info``.
> +
>  * security: The field ``replay_win_sz`` has been moved from ipsec library
>    based ``rte_ipsec_sa_prm`` structure to security library based structure
>    ``rte_security_ipsec_xform``, which specify the Anti replay window size
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index 58a4f98c9f..95c60a3757 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -535,6 +535,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
>  	/* Fast path specifics */
>  	dev_info->min_rx_bufsize = 1;
>  	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
> +	dev_info->max_lro_pktlen = BNXT_MAX_PKT_LEN;
> 
>  	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
>  	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED)
> diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
> index 9f37a404be..cbd2d032f9 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -727,6 +727,7 @@ hinic_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
>  	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
>  	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
> +	info->max_lro_pktlen = HINIC_MAX_JUMBO_FRAME_SIZE;
>  	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
>  	info->min_mtu = HINIC_MIN_MTU_SIZE;
>  	info->max_mtu = HINIC_MAX_MTU_SIZE;
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index dbce7a80e9..a01b8bbf10 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -3804,6 +3804,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	}
>  	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL register */
>  	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
> +	dev_info->max_lro_pktlen = RTE_IPV4_MAX_PKT_LEN;
>  	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
>  	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
>  	dev_info->max_vfs = pci_dev->max_vfs;

Actually after looking at ixgbe code once again -
as we set LRO capability conditionally, we probably better to set max_lro_pktlen
conditionally too. Something like:

--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3820,6 +3820,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        dev_info->tx_queue_offload_capa = ixgbe_get_tx_queue_offloads(dev);
        dev_info->tx_offload_capa = ixgbe_get_tx_port_offloads(dev);

+       if (dev_info->rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO)
+               dev_info->max_lro_pktlen = RTE_IPV4_MAX_PKT_LEN;
+
        dev_info->default_rxconf = (struct rte_eth_rxconf) {
                .rx_thresh = {
                        .pthresh = IXGBE_DEFAULT_RX_PTHRESH,

Sorry for missed that previously.
Apart from that: LGTM.

> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
> index b6a51b2b4d..935adbbbf3 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -198,6 +198,9 @@ TAILQ_HEAD(mlx5_flows, rte_flow);
>  #define MLX5_LRO_SUPPORTED(dev) \
>  	(((struct mlx5_priv *)((dev)->data->dev_private))->config.lro.supported)
> 
> +/* Maximal size of aggregated LRO packet. */
> +#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
> +
>  /* LRO configurations structure. */
>  struct mlx5_lro_config {
>  	uint32_t supported:1; /* Whether LRO is supported. */
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index 2278b24c01..91de186365 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -552,6 +552,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	/* FIXME: we should ask the device for these values. */
>  	info->min_rx_bufsize = 32;
>  	info->max_rx_pktlen = 65536;
> +	info->max_lro_pktlen = MLX5_MAX_LRO_SIZE;
>  	/*
>  	 * Since we need one CQ per QP, the limit is the minimum number
>  	 * between the two values.
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index f0ab8438d3..aca2e67e0c 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -1524,7 +1524,6 @@ mlx5_mprq_alloc_mp(struct rte_eth_dev *dev)
>  	return 0;
>  }
> 
> -#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
>  #define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
>  					sizeof(struct rte_vlan_hdr) * 2 + \
>  					sizeof(struct rte_ipv6_hdr)))
> diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
> index 53fdfde9a8..fd05856836 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -1273,6 +1273,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
> 
>  	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
>  	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
> +	dev_info->max_lro_pktlen = (uint32_t)0x7FFF;
>  	dev_info->rx_desc_lim = qede_rx_desc_lim;
>  	dev_info->tx_desc_lim = qede_tx_desc_lim;
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 646de9945c..d97f3c6645 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -2435,6 +2435,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
>  	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
>  	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
> +	dev_info->max_lro_pktlen = VIRTIO_MAX_RX_PKTLEN;
>  	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
> 
>  	host_features = VTPCI_OPS(hw)->get_features(hw);
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> index d1faeaa81b..6c99a2a8e0 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> @@ -1161,6 +1161,7 @@ vmxnet3_dev_info_get(struct rte_eth_dev *dev,
>  	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
>  	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
>  	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */
> +	dev_info->max_lro_pktlen = 16384;
>  	dev_info->speed_capa = ETH_LINK_SPEED_10G;
>  	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
> 
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index c36c1b631f..b47eea60d9 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -1183,6 +1183,7 @@ struct rte_eth_dev_info {
>  	const uint32_t *dev_flags; /**< Device flags */
>  	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
>  	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
> +	uint32_t max_lro_pktlen; /**< Maximum size of LRO aggregated packet. */
>  	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
>  	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
>  	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
> --
> 2.23.0


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 16:28  0%                           ` Ananyev, Konstantin
@ 2019-11-09 18:26  0%                             ` Matan Azrad
  2019-11-10 22:51  0%                               ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2019-11-09 18:26 UTC (permalink / raw)
  To: Ananyev, Konstantin, Dekel Peled, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev

Hi Konstantin

From: Ananyev, Konstantin
> Sent: Friday, November 8, 2019 6:29 PM
> To: Dekel Peled <dekelp@mellanox.com>; Matan Azrad
> <matan@mellanox.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Mcnamara,
> John <john.mcnamara@intel.com>; Kovacevic, Marko
> <marko.kovacevic@intel.com>; nhorman@tuxdriver.com;
> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Burakov,
> Anatoly <anatoly.burakov@intel.com>; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Shahaf Shuler <shahafs@mellanox.com>; Slava
> Ovsiienko <viacheslavo@mellanox.com>; rmody@marvell.com;
> shshaikh@marvell.com; maxime.coquelin@redhat.com; Bie, Tiwei
> <tiwei.bie@intel.com>; Wang, Zhihong <zhihong.wang@intel.com>;
> yongwang@vmware.com; Thomas Monjalon <thomas@monjalon.net>;
> arybchenko@solarflare.com; Wu, Jingjing <jingjing.wu@intel.com>;
> Iremonger, Bernard <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO
> packet size
> 
> 
> > >
> > >
> > > > > > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > > > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > > > > >>>>>
> > > > > > > >>>> 	RTE_ETHER_MAX_LEN;
> > > > > > > >>>>>  	}
> > > > > > > >>>>>
> > > > > > > >>>>> +	/*
> > > > > > > >>>>> +	 * If LRO is enabled, check that the maximum
> > > aggregated
> > > > > > > packet
> > > > > > > >>>>> +	 * size is supported by the configured device.
> > > > > > > >>>>> +	 */
> > > > > > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > > > > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > > > > > >>>>> +		ret = check_lro_pkt_size(
> > > > > > > >>>>> +				port_id, dev_conf-
> > > > > > > >>>>> rxmode.max_lro_pkt_size,
> > > > > > > >>>>> +				dev_info.max_lro_pkt_size);
> > > > > > > >>>>> +		if (ret != 0)
> > > > > > > >>>>> +			goto rollback;
> > > > > > > >>>>> +	}
> > > > > > > >>>>> +
> > > > > > > >>>>
> > > > > > > >>>> This check forces applications that enable LRO to
> > > > > > > >>>> provide
> > > > > > > >> 'max_lro_pkt_size'
> > > > > > > >>>> config value.
> > > > > > > >>>
> > > > > > > >>> Yes.(we can break an API, we noticed it)
> > > > > > > >>
> > > > > > > >> I am not talking about API/ABI breakage, that part is OK.
> > > > > > > >> With this check, if the application requested LRO offload
> > > > > > > >> but not provided 'max_lro_pkt_size' value, device
> > > > > > > >> configuration will
> > > fail.
> > > > > > > >>
> > > > > > > > Yes
> > > > > > > >> Can there be a case application is good with whatever the
> > > > > > > >> PMD can support as max?
> > > > > > > > Yes can be - you know, we can do everything we want but it
> > > > > > > > is better to be
> > > > > > > consistent:
> > > > > > > > Due to the fact of Max rx pkt len field is mandatory for
> > > > > > > > JUMBO offload, max
> > > > > > > lro pkt len should be mandatory for LRO offload.
> > > > > > > >
> > > > > > > > So your question is actually why both, non-lro packets and
> > > > > > > > LRO packets max
> > > > > > > size are mandatory...
> > > > > > > >
> > > > > > > >
> > > > > > > > I think it should be important values for net applications
> > > management.
> > > > > > > > Also good for mbuf size managements.
> > > > > > > >
> > > > > > > >>>
> > > > > > > >>>> - Why it is mandatory now, how it was working before if
> > > > > > > >>>> it is mandatory value?
> > > > > > > >>>
> > > > > > > >>> It is the same as max_rx_pkt_len which is mandatory for
> > > > > > > >>> jumbo frame
> > > > > > > >> offload.
> > > > > > > >>> So now, when the user configures a LRO offload he must
> > > > > > > >>> to set max lro pkt
> > > > > > > >> len.
> > > > > > > >>> We don't want to confuse the user here with the max rx
> > > > > > > >>> pkt len
> > > > > > > >> configurations and behaviors, they should be with same logic.
> > > > > > > >>>
> > > > > > > >>> This parameter defines well the LRO behavior.
> > > > > > > >>> Before this, each PMD took its own interpretation to
> > > > > > > >>> what should be the
> > > > > > > >> maximum size for LRO aggregated packets.
> > > > > > > >>> Now, the user must say what is his intension, and the
> > > > > > > >>> ethdev can limit it
> > > > > > > >> according to the device capability.
> > > > > > > >>> By this way, also, the PMD can organize\optimize its
> > > > > > > >>> data-path
> > > more.
> > > > > > > >>> Also, the application can create different mempools for
> > > > > > > >>> LRO queues to
> > > > > > > >> allow bigger packet receiving for LRO traffic.
> > > > > > > >>>
> > > > > > > >>>> - What happens if PMD doesn't provide
> > > > > > > >>>> 'max_lro_pkt_size', so it is
> > > > > '0'?
> > > > > > > >>> Yes, you can see the feature description Dekel added.
> > > > > > > >>> This patch also updates all the PMDs support an LRO for
> > > > > > > >>> non-0
> > > value.
> > > > > > > >>
> > > > > > > >> Of course I can see the updates Matan, my point is "What
> > > > > > > >> happens if PMD doesn't provide 'max_lro_pkt_size'",
> > > > > > > >> 1) There is no check for it right, so it is acceptable?
> > > > > > > >
> > > > > > > > There is check.
> > > > > > > > If the capability is 0, any non-zero configuration will fail.
> > > > > > > >
> > > > > > > >> 2) Are we making this filed mandatory to provide for
> > > > > > > >> PMDs, it is easy to make new fields mandatory for PMDs
> > > > > > > >> but is this really
> > > > > necessary?
> > > > > > > >
> > > > > > > > Yes, for consistence.
> > > > > > > >
> > > > > > > >>>
> > > > > > > >>> as same as max rx pkt len, no?
> > > > > > > >>>
> > > > > > > >>>> - What do you think setting 'max_lro_pkt_size' config
> > > > > > > >>>> value to what PMD provided if application doesn't provide
> it?
> > > > > > > >>> Same answers as above.
> > > > > > > >>>
> > > > > > > >>
> > > > > > > >> If application doesn't care the value, as it has been
> > > > > > > >> till now, and not provided explicit 'max_lro_pkt_size',
> > > > > > > >> why not ethdev level use the value provided by PMD instead
> of failing?
> > > > > > > >
> > > > > > > > Again, same question we can ask on max rx pkt len.
> > > > > > > >
> > > > > > > > Looks like the packet size is very important value which
> > > > > > > > should be set by
> > > > > > > the application.
> > > > > > > >
> > > > > > > > Previous applications have no option to configure it, so
> > > > > > > > they haven't
> > > > > > > configure it, (probably cover it somehow) I think it is our
> > > > > > > miss to supply this info.
> > > > > > > >
> > > > > > > > Let's do it in same way as we do max rx pkt len (as this
> > > > > > > > patch main
> > > idea).
> > > > > > > > Later, we can change both to other meaning.
> > > > > > > >
> > > > > > >
> > > > > > > I think it is not a good reason to introduce a new mandatory
> > > > > > > config option for application because of 'max_rx_pkt_len' does it.
> > > > > >
> > > > > > It is mandatory only if LRO offload is configured.
> > > > >
> > > > > So max_rx_pkt_len will remain max size of one packet, while
> > > > > max_lro_len will be max accumulate size for each LRO session?
> > > > >
> > > >
> > > > Yes.
> > > >
> > > > > BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
> > > >
> > > > Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
> > > > Change to RTE_IPV4_MAX_PKT_LEN?
> > > >
> > > > > ixgbe_vf, as I remember, doesn’t support LRO at all.
> > > >
> > > > Please see my change in drivers/net/ixgbe/ixgbe_vf_representor.c
> > > > Remove it?
> > >
> > > Yes, please for both.
> >
> > Will change in v5.
> >
> > >
> > > >
> > > > >
> > > > > >
> > > > > > > Will it work, if:
> > > > > > > - If application doesn't provide this value, use the PMD max
> > > > > >
> > > > > > May cause a problem if the mbuf size is not enough for the PMD
> > > maximum.
> > > > >
> > > > > Another question, what will happen if PMD will ignore that value
> > > > > and will generate packets bigger then requested?
> > > >
> > > > PMD should use this value and not ignore it.
> > >
> > > Hmm, ok but this patch updates mxl driver only...
> > > I suppose you expect other PMD maintainers to do the job for their
> > > PMDs, right?
> > > If so, are they aware (and agree) for this new hard requirement and
> > > changes required?
> > > Again what PMD should do if it can't support exact value?
> > > Let say user asked max_lro_size=20KB but PMD can do only 16KB or
> 24KB?
> > > Should it fail, or round to smallest, or ...?
> > >
> > > Actually I wonder, should it really be a hard requirement or more
> > > like a guidance to PMD?
> > > Why app needs and *exact* value for LRO size?
> >
> > The exact value should be configured to HW as LRO session limit.
> 
> But if the HW can't support this exact value, see the example above?
> In fact, shouldn't we allow PMD to forbid user to configure max LRO size?
> Let say if in dev_info max_lro_size==0, then PMD doesn't support LRO size
> configuration at all.
> That way PMDs who do support LRO, but don't want to (can't to) support
> configurable LRO size will stay untouched.

Each HW should support packet size limitation no matter if it is LRO packet or not:
How does the PMD limit the packet size for max rx packet len conf?
How does the PMD limit the packet size for the mbuf size?
 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 12:51  0%                   ` Ferruh Yigit
  2019-11-08 16:11  0%                     ` Dekel Peled
@ 2019-11-09 18:20  3%                     ` Matan Azrad
  2019-11-10 23:40  0%                       ` Ananyev, Konstantin
  2019-11-11 11:15  0%                       ` Ferruh Yigit
  1 sibling, 2 replies; 200+ results
From: Matan Azrad @ 2019-11-09 18:20 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

Hi

From: Ferruh Yigit
> On 11/8/2019 11:56 AM, Matan Azrad wrote:
> >
> >
> > From: Ferruh Yigit
> >> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> >>>
> >>>
> >>> From: Ferruh Yigit
> >>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> >>>>> Hi
> >>>>>
> >>>>> From: Ferruh Yigit
> >>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> >>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> >>>>>>>
> >>>>>> 	RTE_ETHER_MAX_LEN;
> >>>>>>>  	}
> >>>>>>>
> >>>>>>> +	/*
> >>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
> >> packet
> >>>>>>> +	 * size is supported by the configured device.
> >>>>>>> +	 */
> >>>>>>> +	if (dev_conf->rxmode.offloads &
> >> DEV_RX_OFFLOAD_TCP_LRO) {
> >>>>>>> +		ret = check_lro_pkt_size(
> >>>>>>> +				port_id, dev_conf-
> >>>>>>> rxmode.max_lro_pkt_size,
> >>>>>>> +				dev_info.max_lro_pkt_size);
> >>>>>>> +		if (ret != 0)
> >>>>>>> +			goto rollback;
> >>>>>>> +	}
> >>>>>>> +
> >>>>>>
> >>>>>> This check forces applications that enable LRO to provide
> >>>> 'max_lro_pkt_size'
> >>>>>> config value.
> >>>>>
> >>>>> Yes.(we can break an API, we noticed it)
> >>>>
> >>>> I am not talking about API/ABI breakage, that part is OK.
> >>>> With this check, if the application requested LRO offload but not
> >>>> provided 'max_lro_pkt_size' value, device configuration will fail.
> >>>>
> >>> Yes
> >>>> Can there be a case application is good with whatever the PMD can
> >>>> support as max?
> >>> Yes can be - you know, we can do everything we want but it is better
> >>> to be
> >> consistent:
> >>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> >>> offload, max
> >> lro pkt len should be mandatory for LRO offload.
> >>>
> >>> So your question is actually why both, non-lro packets and LRO
> >>> packets max
> >> size are mandatory...
> >>>
> >>>
> >>> I think it should be important values for net applications management.
> >>> Also good for mbuf size managements.
> >>>
> >>>>>
> >>>>>> - Why it is mandatory now, how it was working before if it is
> >>>>>> mandatory value?
> >>>>>
> >>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> >>>>> frame
> >>>> offload.
> >>>>> So now, when the user configures a LRO offload he must to set max
> >>>>> lro pkt
> >>>> len.
> >>>>> We don't want to confuse the user here with the max rx pkt len
> >>>> configurations and behaviors, they should be with same logic.
> >>>>>
> >>>>> This parameter defines well the LRO behavior.
> >>>>> Before this, each PMD took its own interpretation to what should
> >>>>> be the
> >>>> maximum size for LRO aggregated packets.
> >>>>> Now, the user must say what is his intension, and the ethdev can
> >>>>> limit it
> >>>> according to the device capability.
> >>>>> By this way, also, the PMD can organize\optimize its data-path more.
> >>>>> Also, the application can create different mempools for LRO queues
> >>>>> to
> >>>> allow bigger packet receiving for LRO traffic.
> >>>>>
> >>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
> '0'?
> >>>>> Yes, you can see the feature description Dekel added.
> >>>>> This patch also updates all the PMDs support an LRO for non-0 value.
> >>>>
> >>>> Of course I can see the updates Matan, my point is "What happens if
> >>>> PMD doesn't provide 'max_lro_pkt_size'",
> >>>> 1) There is no check for it right, so it is acceptable?
> >>>
> >>> There is check.
> >>> If the capability is 0, any non-zero configuration will fail.
> >>>
> >>>> 2) Are we making this filed mandatory to provide for PMDs, it is
> >>>> easy to make new fields mandatory for PMDs but is this really
> necessary?
> >>>
> >>> Yes, for consistence.
> >>>
> >>>>>
> >>>>> as same as max rx pkt len, no?
> >>>>>
> >>>>>> - What do you think setting 'max_lro_pkt_size' config value to
> >>>>>> what PMD provided if application doesn't provide it?
> >>>>> Same answers as above.
> >>>>>
> >>>>
> >>>> If application doesn't care the value, as it has been till now, and
> >>>> not provided explicit 'max_lro_pkt_size', why not ethdev level use
> >>>> the value provided by PMD instead of failing?
> >>>
> >>> Again, same question we can ask on max rx pkt len.
> >>>
> >>> Looks like the packet size is very important value which should be
> >>> set by
> >> the application.
> >>>
> >>> Previous applications have no option to configure it, so they
> >>> haven't
> >> configure it, (probably cover it somehow) I think it is our miss to
> >> supply this info.
> >>>
> >>> Let's do it in same way as we do max rx pkt len (as this patch main idea).
> >>> Later, we can change both to other meaning.
> >>>
> >>
> >> I think it is not a good reason to introduce a new mandatory config
> >> option for application because of 'max_rx_pkt_len' does it.
> >
> > It is mandatory only if LRO offload is configured.
> >
> >> Will it work, if:
> >> - If application doesn't provide this value, use the PMD max
> >
> > May cause a problem if the mbuf size is not enough for the PMD maximum.
> 
> OK, this is what I was missing, for this case I was thinking max_rx_pkt_len will
> be used but you already explained that application may want to use different
> mempools for LRO queues.
> 
So , are you agree with the idea?

> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
> account and program the device accordingly (of course in LRO enabled case)
> ?
> This part seems missing and should be highlighted to other PMD maintainers.


Yes, you are right.
PMDs must limit the LRO aggregated packet according to the new field,
And it probably very hard for the patch introducer to understand how to do it for each PMD. 

I think each new configuration requires other maintainers\developers to adjust their own PMD code to the new configuration and it should be done in limited time.

My suggestion here:
1. To reserve the info field and the configuration field for rc2.(if it is critical not to break ABI for rc3)
2. To merge the ethdev patch in the start of rc3.
3. Request each relevant PMD to adjust its PMD to the new configuration for the end of rc3.
	Note: this should be small change and only for ~5 PMDs:
		a. Introduce the info field according to the device ability.
		b. For each LRO queue:
			Use the LRO max size configuration instead of the current max rx pkt len configuration(looks like small condition). 

What do you think?





^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v6] ethdev: add max LRO packet size
  @ 2019-11-08 23:07  4% ` Thomas Monjalon
  2019-11-10 22:47  0%   ` Ananyev, Konstantin
    0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2019-11-08 23:07 UTC (permalink / raw)
  To: John McNamara, Marko Kovacevic, Neil Horman, Ajit Khaparde,
	Somnath Kotur, Ziyang Xuan, Xiaoyun Wang, Guoyang Zhou,
	Wenzhuo Lu, Konstantin Ananyev, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Rasesh Mody, Shahed Shaikh,
	Maxime Coquelin, Tiwei Bie, Zhihong Wang, Yong Wang,
	Ferruh Yigit, Andrew Rybchenko
  Cc: dev, Dekel Peled

From: Dekel Peled <dekelp@mellanox.com>

The maximum supported aggregated packet size for LRO
is advertised in rte_eth_dev_info.
For some devices, max_lro_pktlen may be different of
the basic max_rx_pktlen property.

Various PMDs supporting LRO are updated.

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---

v6: This is half of v5 1/3. Only the agreed part is here.
Hope it represents the consensus, so we make a step forward.
The field max_lro_pkt_size is renamed to max_lro_pktlen
in order to look like max_rx_pktlen.

---
 doc/guides/nics/features.rst           | 1 +
 doc/guides/rel_notes/deprecation.rst   | 4 ----
 doc/guides/rel_notes/release_19_11.rst | 3 +++
 drivers/net/bnxt/bnxt_ethdev.c         | 1 +
 drivers/net/hinic/hinic_pmd_ethdev.c   | 1 +
 drivers/net/ixgbe/ixgbe_ethdev.c       | 1 +
 drivers/net/mlx5/mlx5.h                | 3 +++
 drivers/net/mlx5/mlx5_ethdev.c         | 1 +
 drivers/net/mlx5/mlx5_rxq.c            | 1 -
 drivers/net/qede/qede_ethdev.c         | 1 +
 drivers/net/virtio/virtio_ethdev.c     | 1 +
 drivers/net/vmxnet3/vmxnet3_ethdev.c   | 1 +
 lib/librte_ethdev/rte_ethdev.h         | 1 +
 13 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index d96696801a..1b2e120a9d 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -197,6 +197,7 @@ Supports Large Receive Offload.
 * **[implements] rte_eth_dev_data**: ``lro``.
 * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
 * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
+* **[provides]   rte_eth_dev_info**: ``max_lro_pktlen``.
 
 
 .. _nic_features_tso:
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index b0b992dcb5..d4fcf9975b 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -88,10 +88,6 @@ Deprecation Notices
   This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
   thereby improve Rx performance if application wishes do so.
 
-* ethdev: New 32-bit fields may be added for maximum LRO session size, in
-  struct ``rte_eth_dev_info`` for the port capability and in struct
-  ``rte_eth_rxmode`` for the port configuration.
-
 * cryptodev: support for using IV with all sizes is added, J0 still can
   be used but only when IV length in following structs ``rte_crypto_auth_xform``,
   ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index 795c7601c0..473af44374 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -403,6 +403,9 @@ ABI Changes
   align the Ethernet header on receive and all known encapsulations
   preserve the alignment of the header.
 
+* ethdev: Added 32-bit field for maximum LRO aggregated packet size,
+  as port capability in the struct ``rte_eth_dev_info``.
+
 * security: The field ``replay_win_sz`` has been moved from ipsec library
   based ``rte_ipsec_sa_prm`` structure to security library based structure
   ``rte_security_ipsec_xform``, which specify the Anti replay window size
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 58a4f98c9f..95c60a3757 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -535,6 +535,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	/* Fast path specifics */
 	dev_info->min_rx_bufsize = 1;
 	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
+	dev_info->max_lro_pktlen = BNXT_MAX_PKT_LEN;
 
 	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
 	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED)
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 9f37a404be..cbd2d032f9 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -727,6 +727,7 @@ hinic_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
 	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
 	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
+	info->max_lro_pktlen = HINIC_MAX_JUMBO_FRAME_SIZE;
 	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
 	info->min_mtu = HINIC_MIN_MTU_SIZE;
 	info->max_mtu = HINIC_MAX_MTU_SIZE;
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index dbce7a80e9..a01b8bbf10 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3804,6 +3804,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	}
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL register */
 	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pktlen = RTE_IPV4_MAX_PKT_LEN;
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
 	dev_info->max_vfs = pci_dev->max_vfs;
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index b6a51b2b4d..935adbbbf3 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -198,6 +198,9 @@ TAILQ_HEAD(mlx5_flows, rte_flow);
 #define MLX5_LRO_SUPPORTED(dev) \
 	(((struct mlx5_priv *)((dev)->data->dev_private))->config.lro.supported)
 
+/* Maximal size of aggregated LRO packet. */
+#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
+
 /* LRO configurations structure. */
 struct mlx5_lro_config {
 	uint32_t supported:1; /* Whether LRO is supported. */
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 2278b24c01..91de186365 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -552,6 +552,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 	/* FIXME: we should ask the device for these values. */
 	info->min_rx_bufsize = 32;
 	info->max_rx_pktlen = 65536;
+	info->max_lro_pktlen = MLX5_MAX_LRO_SIZE;
 	/*
 	 * Since we need one CQ per QP, the limit is the minimum number
 	 * between the two values.
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index f0ab8438d3..aca2e67e0c 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -1524,7 +1524,6 @@ mlx5_mprq_alloc_mp(struct rte_eth_dev *dev)
 	return 0;
 }
 
-#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
 #define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
 					sizeof(struct rte_vlan_hdr) * 2 + \
 					sizeof(struct rte_ipv6_hdr)))
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 53fdfde9a8..fd05856836 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1273,6 +1273,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
 
 	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
 	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
+	dev_info->max_lro_pktlen = (uint32_t)0x7FFF;
 	dev_info->rx_desc_lim = qede_rx_desc_lim;
 	dev_info->tx_desc_lim = qede_tx_desc_lim;
 
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 646de9945c..d97f3c6645 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -2435,6 +2435,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
 	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
 	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
+	dev_info->max_lro_pktlen = VIRTIO_MAX_RX_PKTLEN;
 	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
 
 	host_features = VTPCI_OPS(hw)->get_features(hw);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index d1faeaa81b..6c99a2a8e0 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1161,6 +1161,7 @@ vmxnet3_dev_info_get(struct rte_eth_dev *dev,
 	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
 	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
 	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pktlen = 16384;
 	dev_info->speed_capa = ETH_LINK_SPEED_10G;
 	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
 
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index c36c1b631f..b47eea60d9 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1183,6 +1183,7 @@ struct rte_eth_dev_info {
 	const uint32_t *dev_flags; /**< Device flags */
 	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
 	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
+	uint32_t max_lro_pktlen; /**< Maximum size of LRO aggregated packet. */
 	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
 	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
 	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
-- 
2.23.0


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (8 preceding siblings ...)
  2019-11-08 16:25  3%     ` [dpdk-dev] [PATCH v7 08/10] drivers/octeontx: add missing public symbol Anatoly Burakov
@ 2019-11-08 16:25  2%     ` Anatoly Burakov
  2019-11-19 17:46  3%       ` Thomas Monjalon
  2019-11-19 21:50  7%       ` David Marchand
  2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 10/10] buildtools: add ABI versioning check script Anatoly Burakov
  10 siblings, 2 replies; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Pawel Modrak, Nicolas Chautru, Hemant Agrawal, Sachin Saxena,
	Rosen Xu, Stephen Hemminger, Anoob Joseph, Tomasz Duszynski,
	Liron Himi, Jerin Jacob, Nithin Dabilpuram, Vamsi Attunuru,
	Lee Daly, Fiona Trahe, Ashish Gupta, Sunila Sahu, Declan Doherty,
	Pablo de Lara, Gagandeep Singh, Ravi Kumar, Akhil Goyal,
	Michael Shamis, Nagadheeraj Rottela, Srikanth Jampala,
	Ankur Dwivedi, Fan Zhang, Jay Zhou, Nipun Gupta,
	Mattias Rönnblom, Pavan Nikhilesh, Liang Ma, Peter Mccarthy,
	Harry van Haaren, Artem V. Andreev, Andrew Rybchenko,
	Olivier Matz, Gage Eads, John W. Linville, Xiaolong Ye, Qi Zhang,
	Shepard Siegel, Ed Czeck, John Miller, Igor Russkikh,
	Pavel Belous, Allain Legacy, Matt Peters, Rasesh Mody,
	Shahed Shaikh, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Rahul Lakkireddy, Wenzhuo Lu, Marcin Wojtas, Michal Krawczyk,
	Guy Tzalik, Evgeny Schemeilin, Igor Chauskin, John Daley,
	Hyong Youb Kim, Gaetan Rivet, Xiao Wang, Ziyang Xuan,
	Xiaoyun Wang, Guoyang Zhou, Wei Hu (Xavier), Min Hu (Connor),
	Yisen Zhuang, Beilei Xing, Jingjing Wu, Qiming Yang,
	Konstantin Ananyev, Ferruh Yigit, Shijith Thotton,
	Srisivasubramanian Srinivasan, Jakub Grajciar, Matan Azrad,
	Shahaf Shuler, Viacheslav Ovsiienko, Zyta Szpak,
	K. Y. Srinivasan, Haiyang Zhang, Rastislav Cernay, Jan Remes,
	Alejandro Lucero, Tetsuya Mukawa, Kiran Kumar K,
	Bruce Richardson, Jasvinder Singh, Cristian Dumitrescu,
	Keith Wiles, Maciej Czekaj, Maxime Coquelin, Tiwei Bie,
	Zhihong Wang, Yong Wang, Tianfei zhang, Xiaoyun Li, Satha Rao,
	Shreyansh Jain, David Hunt, Byron Marohn, Yipeng Wang,
	Thomas Monjalon, Jiayu Hu, Sameh Gobriel, Reshma Pattan,
	Vladimir Medvedkin, Robert Sanford, Erik Gabriel Carrillo,
	john.mcnamara, ray.kinsella, david.marchand

From: Pawel Modrak <pawelx.modrak@intel.com>

Merge all vesions in linker version script files to DPDK_20.0.

This commit was generated by running the following command:

:~/DPDK$ buildtools/update-abi.sh 20.0

Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 .../rte_pmd_bbdev_fpga_lte_fec_version.map    |   8 +-
 .../null/rte_pmd_bbdev_null_version.map       |   2 +-
 .../rte_pmd_bbdev_turbo_sw_version.map        |   2 +-
 drivers/bus/dpaa/rte_bus_dpaa_version.map     | 113 +++---
 drivers/bus/fslmc/rte_bus_fslmc_version.map   | 154 ++++-----
 drivers/bus/ifpga/rte_bus_ifpga_version.map   |  14 +-
 drivers/bus/pci/rte_bus_pci_version.map       |   2 +-
 drivers/bus/vdev/rte_bus_vdev_version.map     |  12 +-
 drivers/bus/vmbus/rte_bus_vmbus_version.map   |  12 +-
 drivers/common/cpt/rte_common_cpt_version.map |   9 +-
 .../common/dpaax/rte_common_dpaax_version.map |  14 +-
 .../common/mvep/rte_common_mvep_version.map   |   6 +-
 .../octeontx/rte_common_octeontx_version.map  |   6 +-
 .../rte_common_octeontx2_version.map          |  16 +-
 .../compress/isal/rte_pmd_isal_version.map    |   2 +-
 .../rte_pmd_octeontx_compress_version.map     |   2 +-
 drivers/compress/qat/rte_pmd_qat_version.map  |   2 +-
 .../compress/zlib/rte_pmd_zlib_version.map    |   2 +-
 .../aesni_gcm/rte_pmd_aesni_gcm_version.map   |   2 +-
 .../aesni_mb/rte_pmd_aesni_mb_version.map     |   2 +-
 .../crypto/armv8/rte_pmd_armv8_version.map    |   2 +-
 .../caam_jr/rte_pmd_caam_jr_version.map       |   3 +-
 drivers/crypto/ccp/rte_pmd_ccp_version.map    |   3 +-
 .../dpaa2_sec/rte_pmd_dpaa2_sec_version.map   |  10 +-
 .../dpaa_sec/rte_pmd_dpaa_sec_version.map     |  10 +-
 .../crypto/kasumi/rte_pmd_kasumi_version.map  |   2 +-
 .../crypto/mvsam/rte_pmd_mvsam_version.map    |   2 +-
 .../crypto/nitrox/rte_pmd_nitrox_version.map  |   2 +-
 .../null/rte_pmd_null_crypto_version.map      |   2 +-
 .../rte_pmd_octeontx_crypto_version.map       |   3 +-
 .../rte_pmd_octeontx2_crypto_version.map      |   3 +-
 .../openssl/rte_pmd_openssl_version.map       |   2 +-
 .../rte_pmd_crypto_scheduler_version.map      |  19 +-
 .../crypto/snow3g/rte_pmd_snow3g_version.map  |   2 +-
 .../virtio/rte_pmd_virtio_crypto_version.map  |   2 +-
 drivers/crypto/zuc/rte_pmd_zuc_version.map    |   2 +-
 .../event/dpaa/rte_pmd_dpaa_event_version.map |   3 +-
 .../dpaa2/rte_pmd_dpaa2_event_version.map     |   2 +-
 .../event/dsw/rte_pmd_dsw_event_version.map   |   2 +-
 .../rte_pmd_octeontx_event_version.map        |   2 +-
 .../rte_pmd_octeontx2_event_version.map       |   3 +-
 .../event/opdl/rte_pmd_opdl_event_version.map |   2 +-
 .../rte_pmd_skeleton_event_version.map        |   3 +-
 drivers/event/sw/rte_pmd_sw_event_version.map |   2 +-
 .../bucket/rte_mempool_bucket_version.map     |   3 +-
 .../mempool/dpaa/rte_mempool_dpaa_version.map |   2 +-
 .../dpaa2/rte_mempool_dpaa2_version.map       |  12 +-
 .../octeontx/rte_mempool_octeontx_version.map |   2 +-
 .../rte_mempool_octeontx2_version.map         |   4 +-
 .../mempool/ring/rte_mempool_ring_version.map |   3 +-
 .../stack/rte_mempool_stack_version.map       |   3 +-
 .../af_packet/rte_pmd_af_packet_version.map   |   3 +-
 drivers/net/af_xdp/rte_pmd_af_xdp_version.map |   2 +-
 drivers/net/ark/rte_pmd_ark_version.map       |   5 +-
 .../net/atlantic/rte_pmd_atlantic_version.map |   4 +-
 drivers/net/avp/rte_pmd_avp_version.map       |   2 +-
 drivers/net/axgbe/rte_pmd_axgbe_version.map   |   2 +-
 drivers/net/bnx2x/rte_pmd_bnx2x_version.map   |   3 +-
 drivers/net/bnxt/rte_pmd_bnxt_version.map     |   4 +-
 drivers/net/bonding/rte_pmd_bond_version.map  |  47 +--
 drivers/net/cxgbe/rte_pmd_cxgbe_version.map   |   3 +-
 drivers/net/dpaa/rte_pmd_dpaa_version.map     |  11 +-
 drivers/net/dpaa2/rte_pmd_dpaa2_version.map   |  12 +-
 drivers/net/e1000/rte_pmd_e1000_version.map   |   3 +-
 drivers/net/ena/rte_pmd_ena_version.map       |   3 +-
 drivers/net/enetc/rte_pmd_enetc_version.map   |   3 +-
 drivers/net/enic/rte_pmd_enic_version.map     |   3 +-
 .../net/failsafe/rte_pmd_failsafe_version.map |   3 +-
 drivers/net/fm10k/rte_pmd_fm10k_version.map   |   3 +-
 drivers/net/hinic/rte_pmd_hinic_version.map   |   3 +-
 drivers/net/hns3/rte_pmd_hns3_version.map     |   4 +-
 drivers/net/i40e/rte_pmd_i40e_version.map     |  65 +---
 drivers/net/iavf/rte_pmd_iavf_version.map     |   3 +-
 drivers/net/ice/rte_pmd_ice_version.map       |   3 +-
 drivers/net/ifc/rte_pmd_ifc_version.map       |   3 +-
 drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map |   3 +-
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map   |  62 ++--
 drivers/net/kni/rte_pmd_kni_version.map       |   3 +-
 .../net/liquidio/rte_pmd_liquidio_version.map |   3 +-
 drivers/net/memif/rte_pmd_memif_version.map   |   5 +-
 drivers/net/mlx4/rte_pmd_mlx4_version.map     |   3 +-
 drivers/net/mlx5/rte_pmd_mlx5_version.map     |   2 +-
 drivers/net/mvneta/rte_pmd_mvneta_version.map |   2 +-
 drivers/net/mvpp2/rte_pmd_mvpp2_version.map   |   2 +-
 drivers/net/netvsc/rte_pmd_netvsc_version.map |   4 +-
 drivers/net/nfb/rte_pmd_nfb_version.map       |   3 +-
 drivers/net/nfp/rte_pmd_nfp_version.map       |   2 +-
 drivers/net/null/rte_pmd_null_version.map     |   3 +-
 .../net/octeontx/rte_pmd_octeontx_version.map |  10 +-
 .../octeontx2/rte_pmd_octeontx2_version.map   |   3 +-
 drivers/net/pcap/rte_pmd_pcap_version.map     |   3 +-
 drivers/net/pfe/rte_pmd_pfe_version.map       |   3 +-
 drivers/net/qede/rte_pmd_qede_version.map     |   3 +-
 drivers/net/ring/rte_pmd_ring_version.map     |  10 +-
 drivers/net/sfc/rte_pmd_sfc_version.map       |   3 +-
 .../net/softnic/rte_pmd_softnic_version.map   |   2 +-
 .../net/szedata2/rte_pmd_szedata2_version.map |   2 +-
 drivers/net/tap/rte_pmd_tap_version.map       |   3 +-
 .../net/thunderx/rte_pmd_thunderx_version.map |   3 +-
 .../rte_pmd_vdev_netvsc_version.map           |   3 +-
 drivers/net/vhost/rte_pmd_vhost_version.map   |  11 +-
 drivers/net/virtio/rte_pmd_virtio_version.map |   3 +-
 .../net/vmxnet3/rte_pmd_vmxnet3_version.map   |   3 +-
 .../rte_rawdev_dpaa2_cmdif_version.map        |   3 +-
 .../rte_rawdev_dpaa2_qdma_version.map         |   4 +-
 .../raw/ifpga/rte_rawdev_ifpga_version.map    |   3 +-
 drivers/raw/ioat/rte_rawdev_ioat_version.map  |   3 +-
 drivers/raw/ntb/rte_rawdev_ntb_version.map    |   5 +-
 .../rte_rawdev_octeontx2_dma_version.map      |   3 +-
 .../skeleton/rte_rawdev_skeleton_version.map  |   3 +-
 lib/librte_acl/rte_acl_version.map            |   2 +-
 .../rte_bitratestats_version.map              |   2 +-
 lib/librte_cfgfile/rte_cfgfile_version.map    |  34 +-
 lib/librte_cmdline/rte_cmdline_version.map    |  10 +-
 .../rte_cryptodev_version.map                 | 102 ++----
 .../rte_distributor_version.map               |   4 +-
 lib/librte_eal/rte_eal_version.map            | 324 ++++++------------
 lib/librte_efd/rte_efd_version.map            |   2 +-
 lib/librte_ethdev/rte_ethdev_version.map      | 160 +++------
 lib/librte_eventdev/rte_eventdev_version.map  | 130 +++----
 lib/librte_gro/rte_gro_version.map            |   2 +-
 lib/librte_gso/rte_gso_version.map            |   2 +-
 lib/librte_hash/rte_hash_version.map          |  43 +--
 lib/librte_ip_frag/rte_ip_frag_version.map    |  10 +-
 lib/librte_jobstats/rte_jobstats_version.map  |  10 +-
 lib/librte_kni/rte_kni_version.map            |   2 +-
 lib/librte_kvargs/rte_kvargs_version.map      |   4 +-
 .../rte_latencystats_version.map              |   2 +-
 lib/librte_lpm/rte_lpm_version.map            |  39 +--
 lib/librte_mbuf/rte_mbuf_version.map          |  49 +--
 lib/librte_member/rte_member_version.map      |   2 +-
 lib/librte_mempool/rte_mempool_version.map    |  44 +--
 lib/librte_meter/rte_meter_version.map        |  13 +-
 lib/librte_metrics/rte_metrics_version.map    |   2 +-
 lib/librte_net/rte_net_version.map            |  23 +-
 lib/librte_pci/rte_pci_version.map            |   2 +-
 lib/librte_pdump/rte_pdump_version.map        |   2 +-
 lib/librte_pipeline/rte_pipeline_version.map  |  36 +-
 lib/librte_port/rte_port_version.map          |  64 +---
 lib/librte_power/rte_power_version.map        |  24 +-
 lib/librte_rawdev/rte_rawdev_version.map      |   4 +-
 lib/librte_reorder/rte_reorder_version.map    |   8 +-
 lib/librte_ring/rte_ring_version.map          |  10 +-
 lib/librte_sched/rte_sched_version.map        |  14 +-
 lib/librte_security/rte_security_version.map  |   2 +-
 lib/librte_table/rte_table_version.map        |   2 +-
 lib/librte_timer/rte_timer_version.map        |  12 +-
 lib/librte_vhost/rte_vhost_version.map        |  52 +--
 148 files changed, 698 insertions(+), 1433 deletions(-)

diff --git a/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map b/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
index f64b0f9c27..6bcea2cc7f 100644
--- a/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
+++ b/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
@@ -1,10 +1,10 @@
-DPDK_19.08 {
-    local: *;
+DPDK_20.0 {
+	local: *;
 };
 
 EXPERIMENTAL {
-    global:
+	global:
 
-    fpga_lte_fec_configure;
+	fpga_lte_fec_configure;
 
 };
diff --git a/drivers/baseband/null/rte_pmd_bbdev_null_version.map b/drivers/baseband/null/rte_pmd_bbdev_null_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/baseband/null/rte_pmd_bbdev_null_version.map
+++ b/drivers/baseband/null/rte_pmd_bbdev_null_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map b/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
+++ b/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map
index cf428a54dc..e6ca4361e0 100644
--- a/drivers/bus/dpaa/rte_bus_dpaa_version.map
+++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	bman_acquire;
@@ -7,123 +7,90 @@ DPDK_17.11 {
 	bman_new_pool;
 	bman_query_free_buffers;
 	bman_release;
+	bman_thread_irq;
+	dpaa_logtype_eventdev;
 	dpaa_logtype_mempool;
 	dpaa_logtype_pmd;
 	dpaa_netcfg;
+	dpaa_svr_family;
 	fman_ccsr_map_fd;
 	fman_dealloc_bufs_mask_hi;
 	fman_dealloc_bufs_mask_lo;
 	fman_if_add_mac_addr;
 	fman_if_clear_mac_addr;
 	fman_if_disable_rx;
-	fman_if_enable_rx;
 	fman_if_discard_rx_errors;
-	fman_if_get_fc_threshold;
+	fman_if_enable_rx;
 	fman_if_get_fc_quanta;
+	fman_if_get_fc_threshold;
 	fman_if_get_fdoff;
+	fman_if_get_sg_enable;
 	fman_if_loopback_disable;
 	fman_if_loopback_enable;
 	fman_if_promiscuous_disable;
 	fman_if_promiscuous_enable;
 	fman_if_reset_mcast_filter_table;
 	fman_if_set_bp;
-	fman_if_set_fc_threshold;
 	fman_if_set_fc_quanta;
+	fman_if_set_fc_threshold;
 	fman_if_set_fdoff;
 	fman_if_set_ic_params;
 	fman_if_set_maxfrm;
 	fman_if_set_mcast_filter_table;
+	fman_if_set_sg;
 	fman_if_stats_get;
 	fman_if_stats_get_all;
 	fman_if_stats_reset;
 	fman_ip_rev;
+	fsl_qman_fq_portal_create;
 	netcfg_acquire;
 	netcfg_release;
-	qm_channel_caam;
-	qman_create_fq;
-	qman_dequeue;
-	qman_dqrr_consume;
-	qman_enqueue;
-	qman_enqueue_multi;
-	qman_fq_fqid;
-	qman_fq_state;
-	qman_init_fq;
-	qman_poll_dqrr;
-	qman_query_fq_np;
-	qman_set_vdq;
-	qman_reserve_fqid_range;
-	qman_volatile_dequeue;
-	rte_dpaa_driver_register;
-	rte_dpaa_driver_unregister;
-	rte_dpaa_mem_ptov;
-	rte_dpaa_portal_init;
-
-	local: *;
-};
-
-DPDK_18.02 {
-	global:
-
-	dpaa_logtype_eventdev;
-	dpaa_svr_family;
 	per_lcore_dpaa_io;
 	per_lcore_held_bufs;
+	qm_channel_caam;
 	qm_channel_pool1;
 	qman_alloc_cgrid_range;
 	qman_alloc_pool_range;
+	qman_clear_irq;
 	qman_create_cgr;
+	qman_create_fq;
 	qman_dca_index;
 	qman_delete_cgr;
+	qman_dequeue;
+	qman_dqrr_consume;
+	qman_enqueue;
+	qman_enqueue_multi;
 	qman_enqueue_multi_fq;
+	qman_fq_fqid;
+	qman_fq_portal_irqsource_add;
+	qman_fq_portal_irqsource_remove;
+	qman_fq_portal_thread_irq;
+	qman_fq_state;
+	qman_init_fq;
+	qman_irqsource_add;
+	qman_irqsource_remove;
 	qman_modify_cgr;
 	qman_oos_fq;
+	qman_poll_dqrr;
 	qman_portal_dequeue;
 	qman_portal_poll_rx;
 	qman_query_fq_frm_cnt;
+	qman_query_fq_np;
 	qman_release_cgrid_range;
+	qman_reserve_fqid_range;
 	qman_retire_fq;
+	qman_set_fq_lookup_table;
+	qman_set_vdq;
 	qman_static_dequeue_add;
-	rte_dpaa_portal_fq_close;
-	rte_dpaa_portal_fq_init;
-
-} DPDK_17.11;
-
-DPDK_18.08 {
-	global:
-
-	fman_if_get_sg_enable;
-	fman_if_set_sg;
-
-} DPDK_18.02;
-
-DPDK_18.11 {
-	global:
-
-	bman_thread_irq;
-	fman_if_get_sg_enable;
-	fman_if_set_sg;
-	qman_clear_irq;
-
-	qman_irqsource_add;
-	qman_irqsource_remove;
 	qman_thread_fd;
 	qman_thread_irq;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	qman_set_fq_lookup_table;
-
-} DPDK_18.11;
-
-DPDK_19.11 {
-	global:
-
-	fsl_qman_fq_portal_create;
-	qman_fq_portal_irqsource_add;
-	qman_fq_portal_irqsource_remove;
-	qman_fq_portal_thread_irq;
-
-} DPDK_19.05;
+	qman_volatile_dequeue;
+	rte_dpaa_driver_register;
+	rte_dpaa_driver_unregister;
+	rte_dpaa_mem_ptov;
+	rte_dpaa_portal_fq_close;
+	rte_dpaa_portal_fq_init;
+	rte_dpaa_portal_init;
+
+	local: *;
+};
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index 4da787236b..fe45575046 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -1,32 +1,67 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
+	dpaa2_affine_qbman_ethrx_swp;
 	dpaa2_affine_qbman_swp;
 	dpaa2_alloc_dpbp_dev;
 	dpaa2_alloc_dq_storage;
+	dpaa2_dpbp_supported;
+	dpaa2_dqrr_size;
+	dpaa2_eqcr_size;
 	dpaa2_free_dpbp_dev;
 	dpaa2_free_dq_storage;
+	dpaa2_free_eq_descriptors;
+	dpaa2_get_qbman_swp;
+	dpaa2_io_portal;
+	dpaa2_svr_family;
+	dpaa2_virt_mode;
 	dpbp_disable;
 	dpbp_enable;
 	dpbp_get_attributes;
 	dpbp_get_num_free_bufs;
 	dpbp_open;
 	dpbp_reset;
+	dpci_get_opr;
+	dpci_set_opr;
+	dpci_set_rx_queue;
+	dpcon_get_attributes;
+	dpcon_open;
+	dpdmai_close;
+	dpdmai_disable;
+	dpdmai_enable;
+	dpdmai_get_attributes;
+	dpdmai_get_rx_queue;
+	dpdmai_get_tx_queue;
+	dpdmai_open;
+	dpdmai_set_rx_queue;
+	dpio_add_static_dequeue_channel;
 	dpio_close;
 	dpio_disable;
 	dpio_enable;
 	dpio_get_attributes;
 	dpio_open;
+	dpio_remove_static_dequeue_channel;
 	dpio_reset;
 	dpio_set_stashing_destination;
+	mc_get_soc_version;
+	mc_get_version;
 	mc_send_command;
 	per_lcore__dpaa2_io;
+	per_lcore_dpaa2_held_bufs;
 	qbman_check_command_complete;
+	qbman_check_new_result;
 	qbman_eq_desc_clear;
+	qbman_eq_desc_set_dca;
 	qbman_eq_desc_set_fq;
 	qbman_eq_desc_set_no_orp;
+	qbman_eq_desc_set_orp;
 	qbman_eq_desc_set_qd;
 	qbman_eq_desc_set_response;
+	qbman_eq_desc_set_token;
+	qbman_fq_query_state;
+	qbman_fq_state_frame_count;
+	qbman_get_dqrr_from_idx;
+	qbman_get_dqrr_idx;
 	qbman_pull_desc_clear;
 	qbman_pull_desc_set_fq;
 	qbman_pull_desc_set_numframes;
@@ -35,112 +70,43 @@ DPDK_17.05 {
 	qbman_release_desc_set_bpid;
 	qbman_result_DQ_fd;
 	qbman_result_DQ_flags;
-	qbman_result_has_new_result;
-	qbman_swp_acquire;
-	qbman_swp_pull;
-	qbman_swp_release;
-	rte_fslmc_driver_register;
-	rte_fslmc_driver_unregister;
-	rte_fslmc_vfio_dmamap;
-	rte_mcp_ptr_list;
-
-	local: *;
-};
-
-DPDK_17.08 {
-	global:
-
-	dpaa2_io_portal;
-	dpaa2_get_qbman_swp;
-	dpci_set_rx_queue;
-	dpcon_open;
-	dpcon_get_attributes;
-	dpio_add_static_dequeue_channel;
-	dpio_remove_static_dequeue_channel;
-	mc_get_soc_version;
-	mc_get_version;
-	qbman_check_new_result;
-	qbman_eq_desc_set_dca;
-	qbman_get_dqrr_from_idx;
-	qbman_get_dqrr_idx;
 	qbman_result_DQ_fqd_ctx;
+	qbman_result_DQ_odpid;
+	qbman_result_DQ_seqnum;
 	qbman_result_SCN_state;
+	qbman_result_eqresp_fd;
+	qbman_result_eqresp_rc;
+	qbman_result_eqresp_rspid;
+	qbman_result_eqresp_set_rspid;
+	qbman_result_has_new_result;
+	qbman_swp_acquire;
 	qbman_swp_dqrr_consume;
+	qbman_swp_dqrr_idx_consume;
 	qbman_swp_dqrr_next;
 	qbman_swp_enqueue_multiple;
 	qbman_swp_enqueue_multiple_desc;
+	qbman_swp_enqueue_multiple_fd;
 	qbman_swp_interrupt_clear_status;
+	qbman_swp_prefetch_dqrr_next;
+	qbman_swp_pull;
 	qbman_swp_push_set;
+	qbman_swp_release;
 	rte_dpaa2_alloc_dpci_dev;
-	rte_fslmc_object_register;
-	rte_global_active_dqs_list;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	dpaa2_dpbp_supported;
 	rte_dpaa2_dev_type;
+	rte_dpaa2_free_dpci_dev;
 	rte_dpaa2_intr_disable;
 	rte_dpaa2_intr_enable;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	dpaa2_svr_family;
-	dpaa2_virt_mode;
-	per_lcore_dpaa2_held_bufs;
-	qbman_fq_query_state;
-	qbman_fq_state_frame_count;
-	qbman_swp_dqrr_idx_consume;
-	qbman_swp_prefetch_dqrr_next;
-	rte_fslmc_get_device_count;
-
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	dpaa2_affine_qbman_ethrx_swp;
-	dpdmai_close;
-	dpdmai_disable;
-	dpdmai_enable;
-	dpdmai_get_attributes;
-	dpdmai_get_rx_queue;
-	dpdmai_get_tx_queue;
-	dpdmai_open;
-	dpdmai_set_rx_queue;
-	rte_dpaa2_free_dpci_dev;
 	rte_dpaa2_memsegs;
-
-} DPDK_18.02;
-
-DPDK_18.11 {
-	global:
-	dpaa2_dqrr_size;
-	dpaa2_eqcr_size;
-	dpci_get_opr;
-	dpci_set_opr;
-
-} DPDK_18.05;
-
-DPDK_19.05 {
-	global:
-	dpaa2_free_eq_descriptors;
-
-	qbman_eq_desc_set_orp;
-	qbman_eq_desc_set_token;
-	qbman_result_DQ_odpid;
-	qbman_result_DQ_seqnum;
-	qbman_result_eqresp_fd;
-	qbman_result_eqresp_rc;
-	qbman_result_eqresp_rspid;
-	qbman_result_eqresp_set_rspid;
-	qbman_swp_enqueue_multiple_fd;
-} DPDK_18.11;
+	rte_fslmc_driver_register;
+	rte_fslmc_driver_unregister;
+	rte_fslmc_get_device_count;
+	rte_fslmc_object_register;
+	rte_fslmc_vfio_dmamap;
+	rte_global_active_dqs_list;
+	rte_mcp_ptr_list;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/drivers/bus/ifpga/rte_bus_ifpga_version.map b/drivers/bus/ifpga/rte_bus_ifpga_version.map
index 964c9a9c45..05b4a28c1b 100644
--- a/drivers/bus/ifpga/rte_bus_ifpga_version.map
+++ b/drivers/bus/ifpga/rte_bus_ifpga_version.map
@@ -1,17 +1,11 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	global:
 
-	rte_ifpga_get_integer32_arg;
-	rte_ifpga_get_string_arg;
 	rte_ifpga_driver_register;
 	rte_ifpga_driver_unregister;
+	rte_ifpga_find_afu_by_name;
+	rte_ifpga_get_integer32_arg;
+	rte_ifpga_get_string_arg;
 
 	local: *;
 };
-
-DPDK_19.05 {
-	global:
-
-	rte_ifpga_find_afu_by_name;
-
-} DPDK_18.05;
diff --git a/drivers/bus/pci/rte_bus_pci_version.map b/drivers/bus/pci/rte_bus_pci_version.map
index 27e9c4f101..012d817e14 100644
--- a/drivers/bus/pci/rte_bus_pci_version.map
+++ b/drivers/bus/pci/rte_bus_pci_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_pci_dump;
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
index 590cf9b437..5abb10ecb0 100644
--- a/drivers/bus/vdev/rte_bus_vdev_version.map
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -1,18 +1,12 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
+	rte_vdev_add_custom_scan;
 	rte_vdev_init;
 	rte_vdev_register;
+	rte_vdev_remove_custom_scan;
 	rte_vdev_uninit;
 	rte_vdev_unregister;
 
 	local: *;
 };
-
-DPDK_18.02 {
-	global:
-
-	rte_vdev_add_custom_scan;
-	rte_vdev_remove_custom_scan;
-
-} DPDK_17.11;
diff --git a/drivers/bus/vmbus/rte_bus_vmbus_version.map b/drivers/bus/vmbus/rte_bus_vmbus_version.map
index ae231ad329..cbaaebc06c 100644
--- a/drivers/bus/vmbus/rte_bus_vmbus_version.map
+++ b/drivers/bus/vmbus/rte_bus_vmbus_version.map
@@ -1,6 +1,4 @@
-/* SPDX-License-Identifier: BSD-3-Clause */
-
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	rte_vmbus_chan_close;
@@ -20,6 +18,7 @@ DPDK_18.08 {
 	rte_vmbus_probe;
 	rte_vmbus_register;
 	rte_vmbus_scan;
+	rte_vmbus_set_latency;
 	rte_vmbus_sub_channel_index;
 	rte_vmbus_subchan_open;
 	rte_vmbus_unmap_device;
@@ -27,10 +26,3 @@ DPDK_18.08 {
 
 	local: *;
 };
-
-DPDK_18.11 {
-	global:
-
-	rte_vmbus_set_latency;
-
-} DPDK_18.08;
diff --git a/drivers/common/cpt/rte_common_cpt_version.map b/drivers/common/cpt/rte_common_cpt_version.map
index 382ec4bd44..7f1929d58e 100644
--- a/drivers/common/cpt/rte_common_cpt_version.map
+++ b/drivers/common/cpt/rte_common_cpt_version.map
@@ -1,14 +1,9 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
+	cpt_pmd_ops_helper_asym_get_mlen;
 	cpt_pmd_ops_helper_get_mlen_direct_mode;
 	cpt_pmd_ops_helper_get_mlen_sg_mode;
-};
-
-DPDK_19.11 {
-	global:
-
-	cpt_pmd_ops_helper_asym_get_mlen;
 
 	local: *;
 };
diff --git a/drivers/common/dpaax/rte_common_dpaax_version.map b/drivers/common/dpaax/rte_common_dpaax_version.map
index a7699ae4dd..f72eba761d 100644
--- a/drivers/common/dpaax/rte_common_dpaax_version.map
+++ b/drivers/common/dpaax/rte_common_dpaax_version.map
@@ -1,29 +1,23 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
-	dpaax_iova_table_update;
 	dpaax_iova_table_depopulate;
 	dpaax_iova_table_dump;
 	dpaax_iova_table_p;
 	dpaax_iova_table_populate;
-
-	local: *;
-};
-
-DPDK_19.11 {
-	global:
+	dpaax_iova_table_update;
 	of_device_is_available;
 	of_device_is_compatible;
 	of_find_compatible_node;
 	of_find_node_by_phandle;
 	of_get_address;
 	of_get_mac_address;
+	of_get_next_child;
 	of_get_parent;
 	of_get_property;
 	of_init_path;
 	of_n_addr_cells;
 	of_translate_address;
-	of_get_next_child;
 
 	local: *;
-} DPDK_18.11;
+};
diff --git a/drivers/common/mvep/rte_common_mvep_version.map b/drivers/common/mvep/rte_common_mvep_version.map
index c71722d79f..030928439d 100644
--- a/drivers/common/mvep/rte_common_mvep_version.map
+++ b/drivers/common/mvep/rte_common_mvep_version.map
@@ -1,6 +1,8 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
-	rte_mvep_init;
 	rte_mvep_deinit;
+	rte_mvep_init;
+
+	local: *;
 };
diff --git a/drivers/common/octeontx/rte_common_octeontx_version.map b/drivers/common/octeontx/rte_common_octeontx_version.map
index a9b3cff9bc..c15fb89112 100644
--- a/drivers/common/octeontx/rte_common_octeontx_version.map
+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
@@ -1,8 +1,10 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	global:
 
 	octeontx_logtype_mbox;
+	octeontx_mbox_send;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
-	octeontx_mbox_send;
+
+	local: *;
 };
diff --git a/drivers/common/octeontx2/rte_common_octeontx2_version.map b/drivers/common/octeontx2/rte_common_octeontx2_version.map
index 4400120da0..adad21a2d6 100644
--- a/drivers/common/octeontx2/rte_common_octeontx2_version.map
+++ b/drivers/common/octeontx2/rte_common_octeontx2_version.map
@@ -1,39 +1,35 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
 	otx2_dev_active_vfs;
 	otx2_dev_fini;
 	otx2_dev_priv_init;
-
+	otx2_disable_irqs;
+	otx2_intra_dev_get_cfg;
 	otx2_logtype_base;
 	otx2_logtype_dpi;
 	otx2_logtype_mbox;
+	otx2_logtype_nix;
 	otx2_logtype_npa;
 	otx2_logtype_npc;
-	otx2_logtype_nix;
 	otx2_logtype_sso;
-	otx2_logtype_tm;
 	otx2_logtype_tim;
-
+	otx2_logtype_tm;
 	otx2_mbox_alloc_msg_rsp;
 	otx2_mbox_get_rsp;
 	otx2_mbox_get_rsp_tmo;
 	otx2_mbox_id2name;
 	otx2_mbox_msg_send;
 	otx2_mbox_wait_for_rsp;
-
-	otx2_intra_dev_get_cfg;
 	otx2_npa_lf_active;
 	otx2_npa_lf_obj_get;
 	otx2_npa_lf_obj_ref;
 	otx2_npa_pf_func_get;
 	otx2_npa_set_defaults;
+	otx2_register_irq;
 	otx2_sso_pf_func_get;
 	otx2_sso_pf_func_set;
-
-	otx2_disable_irqs;
 	otx2_unregister_irq;
-	otx2_register_irq;
 
 	local: *;
 };
diff --git a/drivers/compress/isal/rte_pmd_isal_version.map b/drivers/compress/isal/rte_pmd_isal_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/compress/isal/rte_pmd_isal_version.map
+++ b/drivers/compress/isal/rte_pmd_isal_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map b/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
+++ b/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/qat/rte_pmd_qat_version.map b/drivers/compress/qat/rte_pmd_qat_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/qat/rte_pmd_qat_version.map
+++ b/drivers/compress/qat/rte_pmd_qat_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/zlib/rte_pmd_zlib_version.map b/drivers/compress/zlib/rte_pmd_zlib_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/zlib/rte_pmd_zlib_version.map
+++ b/drivers/compress/zlib/rte_pmd_zlib_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map b/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
+++ b/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map b/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
+++ b/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/armv8/rte_pmd_armv8_version.map b/drivers/crypto/armv8/rte_pmd_armv8_version.map
index 1f84b68a83..f9f17e4f6e 100644
--- a/drivers/crypto/armv8/rte_pmd_armv8_version.map
+++ b/drivers/crypto/armv8/rte_pmd_armv8_version.map
@@ -1,3 +1,3 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map b/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
+++ b/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/ccp/rte_pmd_ccp_version.map b/drivers/crypto/ccp/rte_pmd_ccp_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/crypto/ccp/rte_pmd_ccp_version.map
+++ b/drivers/crypto/ccp/rte_pmd_ccp_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map b/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
index 0bfb986d0b..5952d645fd 100644
--- a/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
+++ b/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
@@ -1,12 +1,8 @@
-DPDK_17.05 {
-
-	local: *;
-};
-
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa2_sec_eventq_attach;
 	dpaa2_sec_eventq_detach;
 
-} DPDK_17.05;
+	local: *;
+};
diff --git a/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map b/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
index cc7f2162e0..8580fa13db 100644
--- a/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
+++ b/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
@@ -1,12 +1,8 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_19.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa_sec_eventq_attach;
 	dpaa_sec_eventq_detach;
 
-} DPDK_17.11;
+	local: *;
+};
diff --git a/drivers/crypto/kasumi/rte_pmd_kasumi_version.map b/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
index 8ffeca934e..f9f17e4f6e 100644
--- a/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
+++ b/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
@@ -1,3 +1,3 @@
-DPDK_16.07 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/mvsam/rte_pmd_mvsam_version.map b/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
+++ b/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/nitrox/rte_pmd_nitrox_version.map b/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
index 406964d1fc..f9f17e4f6e 100644
--- a/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
+++ b/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
@@ -1,3 +1,3 @@
-DPDK_19.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/null/rte_pmd_null_crypto_version.map b/drivers/crypto/null/rte_pmd_null_crypto_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/null/rte_pmd_null_crypto_version.map
+++ b/drivers/crypto/null/rte_pmd_null_crypto_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map b/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
+++ b/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map b/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
index b7b7c91683..f9f17e4f6e 100644
--- a/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
+++ b/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
@@ -1,4 +1,3 @@
-DPDK_19.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/openssl/rte_pmd_openssl_version.map b/drivers/crypto/openssl/rte_pmd_openssl_version.map
index cc5829e30b..f9f17e4f6e 100644
--- a/drivers/crypto/openssl/rte_pmd_openssl_version.map
+++ b/drivers/crypto/openssl/rte_pmd_openssl_version.map
@@ -1,3 +1,3 @@
-DPDK_16.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map b/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
index 5c43127cf2..077afedce7 100644
--- a/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
+++ b/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
@@ -1,21 +1,16 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
 	rte_cryptodev_scheduler_load_user_scheduler;
-	rte_cryptodev_scheduler_slave_attach;
-	rte_cryptodev_scheduler_slave_detach;
-	rte_cryptodev_scheduler_ordering_set;
-	rte_cryptodev_scheduler_ordering_get;
-
-};
-
-DPDK_17.05 {
-	global:
-
 	rte_cryptodev_scheduler_mode_get;
 	rte_cryptodev_scheduler_mode_set;
 	rte_cryptodev_scheduler_option_get;
 	rte_cryptodev_scheduler_option_set;
+	rte_cryptodev_scheduler_ordering_get;
+	rte_cryptodev_scheduler_ordering_set;
+	rte_cryptodev_scheduler_slave_attach;
+	rte_cryptodev_scheduler_slave_detach;
 	rte_cryptodev_scheduler_slaves_get;
 
-} DPDK_17.02;
+	local: *;
+};
diff --git a/drivers/crypto/snow3g/rte_pmd_snow3g_version.map b/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
+++ b/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map b/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
+++ b/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/zuc/rte_pmd_zuc_version.map b/drivers/crypto/zuc/rte_pmd_zuc_version.map
index cc5829e30b..f9f17e4f6e 100644
--- a/drivers/crypto/zuc/rte_pmd_zuc_version.map
+++ b/drivers/crypto/zuc/rte_pmd_zuc_version.map
@@ -1,3 +1,3 @@
-DPDK_16.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dpaa/rte_pmd_dpaa_event_version.map b/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
+++ b/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map b/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
index 1c0b7559dc..f9f17e4f6e 100644
--- a/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
+++ b/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dsw/rte_pmd_dsw_event_version.map b/drivers/event/dsw/rte_pmd_dsw_event_version.map
index 24bd5cdb35..f9f17e4f6e 100644
--- a/drivers/event/dsw/rte_pmd_dsw_event_version.map
+++ b/drivers/event/dsw/rte_pmd_dsw_event_version.map
@@ -1,3 +1,3 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/octeontx/rte_pmd_octeontx_event_version.map b/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
+++ b/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map b/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
index 41c65c8c9c..f9f17e4f6e 100644
--- a/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
+++ b/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	local: *;
 };
-
diff --git a/drivers/event/opdl/rte_pmd_opdl_event_version.map b/drivers/event/opdl/rte_pmd_opdl_event_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/event/opdl/rte_pmd_opdl_event_version.map
+++ b/drivers/event/opdl/rte_pmd_opdl_event_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
+++ b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/sw/rte_pmd_sw_event_version.map b/drivers/event/sw/rte_pmd_sw_event_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/event/sw/rte_pmd_sw_event_version.map
+++ b/drivers/event/sw/rte_pmd_sw_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/bucket/rte_mempool_bucket_version.map b/drivers/mempool/bucket/rte_mempool_bucket_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/mempool/bucket/rte_mempool_bucket_version.map
+++ b/drivers/mempool/bucket/rte_mempool_bucket_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
index 60bf50b2d1..9eebaf7ffd 100644
--- a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
+++ b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_dpaa_bpid_info;
diff --git a/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map b/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
index b45e7a9ac1..cd4bc88273 100644
--- a/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
+++ b/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
@@ -1,16 +1,10 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_dpaa2_bpid_info;
 	rte_dpaa2_mbuf_alloc_bulk;
-
-	local: *;
-};
-
-DPDK_18.05 {
-	global:
-
 	rte_dpaa2_mbuf_from_buf_addr;
 	rte_dpaa2_mbuf_pool_bpid;
 
-} DPDK_17.05;
+	local: *;
+};
diff --git a/drivers/mempool/octeontx/rte_mempool_octeontx_version.map b/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
+++ b/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map b/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
index d703368c31..d4f81aed8e 100644
--- a/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
+++ b/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
@@ -1,8 +1,8 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
-	otx2_npa_lf_init;
 	otx2_npa_lf_fini;
+	otx2_npa_lf_init;
 
 	local: *;
 };
diff --git a/drivers/mempool/ring/rte_mempool_ring_version.map b/drivers/mempool/ring/rte_mempool_ring_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/mempool/ring/rte_mempool_ring_version.map
+++ b/drivers/mempool/ring/rte_mempool_ring_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/stack/rte_mempool_stack_version.map b/drivers/mempool/stack/rte_mempool_stack_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/mempool/stack/rte_mempool_stack_version.map
+++ b/drivers/mempool/stack/rte_mempool_stack_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/af_packet/rte_pmd_af_packet_version.map b/drivers/net/af_packet/rte_pmd_af_packet_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/af_packet/rte_pmd_af_packet_version.map
+++ b/drivers/net/af_packet/rte_pmd_af_packet_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/af_xdp/rte_pmd_af_xdp_version.map b/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
index c6db030fe6..f9f17e4f6e 100644
--- a/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
+++ b/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
@@ -1,3 +1,3 @@
-DPDK_19.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ark/rte_pmd_ark_version.map b/drivers/net/ark/rte_pmd_ark_version.map
index 1062e0429f..f9f17e4f6e 100644
--- a/drivers/net/ark/rte_pmd_ark_version.map
+++ b/drivers/net/ark/rte_pmd_ark_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-	 local: *;
-
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/atlantic/rte_pmd_atlantic_version.map b/drivers/net/atlantic/rte_pmd_atlantic_version.map
index b16faa999f..9b04838d84 100644
--- a/drivers/net/atlantic/rte_pmd_atlantic_version.map
+++ b/drivers/net/atlantic/rte_pmd_atlantic_version.map
@@ -1,5 +1,4 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
 
@@ -13,4 +12,3 @@ EXPERIMENTAL {
 	rte_pmd_atl_macsec_select_txsa;
 	rte_pmd_atl_macsec_select_rxsa;
 };
-
diff --git a/drivers/net/avp/rte_pmd_avp_version.map b/drivers/net/avp/rte_pmd_avp_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/net/avp/rte_pmd_avp_version.map
+++ b/drivers/net/avp/rte_pmd_avp_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/axgbe/rte_pmd_axgbe_version.map b/drivers/net/axgbe/rte_pmd_axgbe_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/net/axgbe/rte_pmd_axgbe_version.map
+++ b/drivers/net/axgbe/rte_pmd_axgbe_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/bnx2x/rte_pmd_bnx2x_version.map b/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
index bd8138a034..f9f17e4f6e 100644
--- a/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
+++ b/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
@@ -1,4 +1,3 @@
-DPDK_2.1 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/bnxt/rte_pmd_bnxt_version.map b/drivers/net/bnxt/rte_pmd_bnxt_version.map
index 4750d40ad6..bb52562347 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt_version.map
+++ b/drivers/net/bnxt/rte_pmd_bnxt_version.map
@@ -1,4 +1,4 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	global:
 
 	rte_pmd_bnxt_get_vf_rx_status;
@@ -10,13 +10,13 @@ DPDK_17.08 {
 	rte_pmd_bnxt_set_tx_loopback;
 	rte_pmd_bnxt_set_vf_mac_addr;
 	rte_pmd_bnxt_set_vf_mac_anti_spoof;
+	rte_pmd_bnxt_set_vf_persist_stats;
 	rte_pmd_bnxt_set_vf_rate_limit;
 	rte_pmd_bnxt_set_vf_rxmode;
 	rte_pmd_bnxt_set_vf_vlan_anti_spoof;
 	rte_pmd_bnxt_set_vf_vlan_filter;
 	rte_pmd_bnxt_set_vf_vlan_insert;
 	rte_pmd_bnxt_set_vf_vlan_stripq;
-	rte_pmd_bnxt_set_vf_persist_stats;
 
 	local: *;
 };
diff --git a/drivers/net/bonding/rte_pmd_bond_version.map b/drivers/net/bonding/rte_pmd_bond_version.map
index 00d955c481..270c7d5d55 100644
--- a/drivers/net/bonding/rte_pmd_bond_version.map
+++ b/drivers/net/bonding/rte_pmd_bond_version.map
@@ -1,9 +1,21 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_eth_bond_8023ad_agg_selection_get;
+	rte_eth_bond_8023ad_agg_selection_set;
+	rte_eth_bond_8023ad_conf_get;
+	rte_eth_bond_8023ad_dedicated_queues_disable;
+	rte_eth_bond_8023ad_dedicated_queues_enable;
+	rte_eth_bond_8023ad_ext_collect;
+	rte_eth_bond_8023ad_ext_collect_get;
+	rte_eth_bond_8023ad_ext_distrib;
+	rte_eth_bond_8023ad_ext_distrib_get;
+	rte_eth_bond_8023ad_ext_slowtx;
+	rte_eth_bond_8023ad_setup;
 	rte_eth_bond_8023ad_slave_info;
 	rte_eth_bond_active_slaves_get;
 	rte_eth_bond_create;
+	rte_eth_bond_free;
 	rte_eth_bond_link_monitoring_set;
 	rte_eth_bond_mac_address_reset;
 	rte_eth_bond_mac_address_set;
@@ -19,36 +31,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_2.1 {
-	global:
-
-	rte_eth_bond_free;
-
-} DPDK_2.0;
-
-DPDK_16.04 {
-};
-
-DPDK_16.07 {
-	global:
-
-	rte_eth_bond_8023ad_ext_collect;
-	rte_eth_bond_8023ad_ext_collect_get;
-	rte_eth_bond_8023ad_ext_distrib;
-	rte_eth_bond_8023ad_ext_distrib_get;
-	rte_eth_bond_8023ad_ext_slowtx;
-
-} DPDK_16.04;
-
-DPDK_17.08 {
-	global:
-
-	rte_eth_bond_8023ad_dedicated_queues_enable;
-	rte_eth_bond_8023ad_dedicated_queues_disable;
-	rte_eth_bond_8023ad_agg_selection_get;
-	rte_eth_bond_8023ad_agg_selection_set;
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
-
-} DPDK_16.07;
diff --git a/drivers/net/cxgbe/rte_pmd_cxgbe_version.map b/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
index bd8138a034..f9f17e4f6e 100644
--- a/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
+++ b/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
@@ -1,4 +1,3 @@
-DPDK_2.1 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/dpaa/rte_pmd_dpaa_version.map b/drivers/net/dpaa/rte_pmd_dpaa_version.map
index 8cb4500b51..f403a1526d 100644
--- a/drivers/net/dpaa/rte_pmd_dpaa_version.map
+++ b/drivers/net/dpaa/rte_pmd_dpaa_version.map
@@ -1,12 +1,9 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	dpaa_eth_eventq_attach;
 	dpaa_eth_eventq_detach;
 	rte_pmd_dpaa_set_tx_loopback;
-} DPDK_17.11;
+
+	local: *;
+};
diff --git a/drivers/net/dpaa2/rte_pmd_dpaa2_version.map b/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
index d1b4cdb232..f2bb793319 100644
--- a/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
+++ b/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
@@ -1,15 +1,11 @@
-DPDK_17.05 {
-
-	local: *;
-};
-
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa2_eth_eventq_attach;
 	dpaa2_eth_eventq_detach;
 
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
@@ -17,4 +13,4 @@ EXPERIMENTAL {
 	rte_pmd_dpaa2_mux_flow_create;
 	rte_pmd_dpaa2_set_custom_hash;
 	rte_pmd_dpaa2_set_timestamp;
-} DPDK_17.11;
+};
diff --git a/drivers/net/e1000/rte_pmd_e1000_version.map b/drivers/net/e1000/rte_pmd_e1000_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/e1000/rte_pmd_e1000_version.map
+++ b/drivers/net/e1000/rte_pmd_e1000_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ena/rte_pmd_ena_version.map b/drivers/net/ena/rte_pmd_ena_version.map
index 349c6e1c22..f9f17e4f6e 100644
--- a/drivers/net/ena/rte_pmd_ena_version.map
+++ b/drivers/net/ena/rte_pmd_ena_version.map
@@ -1,4 +1,3 @@
-DPDK_16.04 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/enetc/rte_pmd_enetc_version.map b/drivers/net/enetc/rte_pmd_enetc_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/net/enetc/rte_pmd_enetc_version.map
+++ b/drivers/net/enetc/rte_pmd_enetc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/enic/rte_pmd_enic_version.map b/drivers/net/enic/rte_pmd_enic_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/enic/rte_pmd_enic_version.map
+++ b/drivers/net/enic/rte_pmd_enic_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/failsafe/rte_pmd_failsafe_version.map b/drivers/net/failsafe/rte_pmd_failsafe_version.map
index b6d2840be4..f9f17e4f6e 100644
--- a/drivers/net/failsafe/rte_pmd_failsafe_version.map
+++ b/drivers/net/failsafe/rte_pmd_failsafe_version.map
@@ -1,4 +1,3 @@
-DPDK_17.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/fm10k/rte_pmd_fm10k_version.map b/drivers/net/fm10k/rte_pmd_fm10k_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/fm10k/rte_pmd_fm10k_version.map
+++ b/drivers/net/fm10k/rte_pmd_fm10k_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/hinic/rte_pmd_hinic_version.map b/drivers/net/hinic/rte_pmd_hinic_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/net/hinic/rte_pmd_hinic_version.map
+++ b/drivers/net/hinic/rte_pmd_hinic_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/hns3/rte_pmd_hns3_version.map b/drivers/net/hns3/rte_pmd_hns3_version.map
index 35e5f2debb..f9f17e4f6e 100644
--- a/drivers/net/hns3/rte_pmd_hns3_version.map
+++ b/drivers/net/hns3/rte_pmd_hns3_version.map
@@ -1,3 +1,3 @@
-DPDK_19.11 {
-	 local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index cccd5768c2..a80e69b93e 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -1,23 +1,34 @@
-DPDK_2.0 {
-
-	local: *;
-};
-
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
+	rte_pmd_i40e_add_vf_mac_addr;
+	rte_pmd_i40e_flow_add_del_packet_template;
+	rte_pmd_i40e_flow_type_mapping_get;
+	rte_pmd_i40e_flow_type_mapping_reset;
+	rte_pmd_i40e_flow_type_mapping_update;
+	rte_pmd_i40e_get_ddp_info;
+	rte_pmd_i40e_get_ddp_list;
 	rte_pmd_i40e_get_vf_stats;
+	rte_pmd_i40e_inset_get;
+	rte_pmd_i40e_inset_set;
 	rte_pmd_i40e_ping_vfs;
+	rte_pmd_i40e_process_ddp_package;
 	rte_pmd_i40e_ptype_mapping_get;
 	rte_pmd_i40e_ptype_mapping_replace;
 	rte_pmd_i40e_ptype_mapping_reset;
 	rte_pmd_i40e_ptype_mapping_update;
+	rte_pmd_i40e_query_vfid_by_mac;
 	rte_pmd_i40e_reset_vf_stats;
+	rte_pmd_i40e_rss_queue_region_conf;
+	rte_pmd_i40e_set_tc_strict_prio;
 	rte_pmd_i40e_set_tx_loopback;
 	rte_pmd_i40e_set_vf_broadcast;
 	rte_pmd_i40e_set_vf_mac_addr;
 	rte_pmd_i40e_set_vf_mac_anti_spoof;
+	rte_pmd_i40e_set_vf_max_bw;
 	rte_pmd_i40e_set_vf_multicast_promisc;
+	rte_pmd_i40e_set_vf_tc_bw_alloc;
+	rte_pmd_i40e_set_vf_tc_max_bw;
 	rte_pmd_i40e_set_vf_unicast_promisc;
 	rte_pmd_i40e_set_vf_vlan_anti_spoof;
 	rte_pmd_i40e_set_vf_vlan_filter;
@@ -25,43 +36,5 @@ DPDK_17.02 {
 	rte_pmd_i40e_set_vf_vlan_stripq;
 	rte_pmd_i40e_set_vf_vlan_tag;
 
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_pmd_i40e_set_tc_strict_prio;
-	rte_pmd_i40e_set_vf_max_bw;
-	rte_pmd_i40e_set_vf_tc_bw_alloc;
-	rte_pmd_i40e_set_vf_tc_max_bw;
-	rte_pmd_i40e_process_ddp_package;
-	rte_pmd_i40e_get_ddp_list;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_pmd_i40e_get_ddp_info;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_pmd_i40e_add_vf_mac_addr;
-	rte_pmd_i40e_flow_add_del_packet_template;
-	rte_pmd_i40e_flow_type_mapping_update;
-	rte_pmd_i40e_flow_type_mapping_get;
-	rte_pmd_i40e_flow_type_mapping_reset;
-	rte_pmd_i40e_query_vfid_by_mac;
-	rte_pmd_i40e_rss_queue_region_conf;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_pmd_i40e_inset_get;
-	rte_pmd_i40e_inset_set;
-} DPDK_17.11;
\ No newline at end of file
+	local: *;
+};
diff --git a/drivers/net/iavf/rte_pmd_iavf_version.map b/drivers/net/iavf/rte_pmd_iavf_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/net/iavf/rte_pmd_iavf_version.map
+++ b/drivers/net/iavf/rte_pmd_iavf_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ice/rte_pmd_ice_version.map b/drivers/net/ice/rte_pmd_ice_version.map
index 7b23b609da..f9f17e4f6e 100644
--- a/drivers/net/ice/rte_pmd_ice_version.map
+++ b/drivers/net/ice/rte_pmd_ice_version.map
@@ -1,4 +1,3 @@
-DPDK_19.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ifc/rte_pmd_ifc_version.map b/drivers/net/ifc/rte_pmd_ifc_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/net/ifc/rte_pmd_ifc_version.map
+++ b/drivers/net/ifc/rte_pmd_ifc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map b/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
index fc8c95e919..f9f17e4f6e 100644
--- a/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
+++ b/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
@@ -1,4 +1,3 @@
-DPDK_19.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index c814f96d72..21534dbc3d 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -1,57 +1,39 @@
-DPDK_2.0 {
-
-	local: *;
-};
-
-DPDK_16.11 {
-	global:
-
-	rte_pmd_ixgbe_set_all_queues_drop_en;
-	rte_pmd_ixgbe_set_tx_loopback;
-	rte_pmd_ixgbe_set_vf_mac_addr;
-	rte_pmd_ixgbe_set_vf_mac_anti_spoof;
-	rte_pmd_ixgbe_set_vf_split_drop_en;
-	rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
-	rte_pmd_ixgbe_set_vf_vlan_insert;
-	rte_pmd_ixgbe_set_vf_vlan_stripq;
-} DPDK_2.0;
-
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
+	rte_pmd_ixgbe_bypass_event_show;
+	rte_pmd_ixgbe_bypass_event_store;
+	rte_pmd_ixgbe_bypass_init;
+	rte_pmd_ixgbe_bypass_state_set;
+	rte_pmd_ixgbe_bypass_state_show;
+	rte_pmd_ixgbe_bypass_ver_show;
+	rte_pmd_ixgbe_bypass_wd_reset;
+	rte_pmd_ixgbe_bypass_wd_timeout_show;
+	rte_pmd_ixgbe_bypass_wd_timeout_store;
 	rte_pmd_ixgbe_macsec_config_rxsc;
 	rte_pmd_ixgbe_macsec_config_txsc;
 	rte_pmd_ixgbe_macsec_disable;
 	rte_pmd_ixgbe_macsec_enable;
 	rte_pmd_ixgbe_macsec_select_rxsa;
 	rte_pmd_ixgbe_macsec_select_txsa;
+	rte_pmd_ixgbe_ping_vf;
+	rte_pmd_ixgbe_set_all_queues_drop_en;
+	rte_pmd_ixgbe_set_tc_bw_alloc;
+	rte_pmd_ixgbe_set_tx_loopback;
+	rte_pmd_ixgbe_set_vf_mac_addr;
+	rte_pmd_ixgbe_set_vf_mac_anti_spoof;
 	rte_pmd_ixgbe_set_vf_rate_limit;
 	rte_pmd_ixgbe_set_vf_rx;
 	rte_pmd_ixgbe_set_vf_rxmode;
+	rte_pmd_ixgbe_set_vf_split_drop_en;
 	rte_pmd_ixgbe_set_vf_tx;
+	rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
 	rte_pmd_ixgbe_set_vf_vlan_filter;
-} DPDK_16.11;
+	rte_pmd_ixgbe_set_vf_vlan_insert;
+	rte_pmd_ixgbe_set_vf_vlan_stripq;
 
-DPDK_17.05 {
-	global:
-
-	rte_pmd_ixgbe_ping_vf;
-	rte_pmd_ixgbe_set_tc_bw_alloc;
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_pmd_ixgbe_bypass_event_show;
-	rte_pmd_ixgbe_bypass_event_store;
-	rte_pmd_ixgbe_bypass_init;
-	rte_pmd_ixgbe_bypass_state_set;
-	rte_pmd_ixgbe_bypass_state_show;
-	rte_pmd_ixgbe_bypass_ver_show;
-	rte_pmd_ixgbe_bypass_wd_reset;
-	rte_pmd_ixgbe_bypass_wd_timeout_show;
-	rte_pmd_ixgbe_bypass_wd_timeout_store;
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/drivers/net/kni/rte_pmd_kni_version.map b/drivers/net/kni/rte_pmd_kni_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/net/kni/rte_pmd_kni_version.map
+++ b/drivers/net/kni/rte_pmd_kni_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/liquidio/rte_pmd_liquidio_version.map b/drivers/net/liquidio/rte_pmd_liquidio_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/net/liquidio/rte_pmd_liquidio_version.map
+++ b/drivers/net/liquidio/rte_pmd_liquidio_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/memif/rte_pmd_memif_version.map b/drivers/net/memif/rte_pmd_memif_version.map
index 8861484fb3..f9f17e4f6e 100644
--- a/drivers/net/memif/rte_pmd_memif_version.map
+++ b/drivers/net/memif/rte_pmd_memif_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
-        local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/mlx4/rte_pmd_mlx4_version.map b/drivers/net/mlx4/rte_pmd_mlx4_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/mlx4/rte_pmd_mlx4_version.map
+++ b/drivers/net/mlx4/rte_pmd_mlx4_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mlx5/rte_pmd_mlx5_version.map b/drivers/net/mlx5/rte_pmd_mlx5_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/mlx5/rte_pmd_mlx5_version.map
+++ b/drivers/net/mlx5/rte_pmd_mlx5_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mvneta/rte_pmd_mvneta_version.map b/drivers/net/mvneta/rte_pmd_mvneta_version.map
index 24bd5cdb35..f9f17e4f6e 100644
--- a/drivers/net/mvneta/rte_pmd_mvneta_version.map
+++ b/drivers/net/mvneta/rte_pmd_mvneta_version.map
@@ -1,3 +1,3 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mvpp2/rte_pmd_mvpp2_version.map b/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
+++ b/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/netvsc/rte_pmd_netvsc_version.map b/drivers/net/netvsc/rte_pmd_netvsc_version.map
index d534019a6b..f9f17e4f6e 100644
--- a/drivers/net/netvsc/rte_pmd_netvsc_version.map
+++ b/drivers/net/netvsc/rte_pmd_netvsc_version.map
@@ -1,5 +1,3 @@
-/* SPDX-License-Identifier: BSD-3-Clause */
-
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/nfb/rte_pmd_nfb_version.map b/drivers/net/nfb/rte_pmd_nfb_version.map
index fc8c95e919..f9f17e4f6e 100644
--- a/drivers/net/nfb/rte_pmd_nfb_version.map
+++ b/drivers/net/nfb/rte_pmd_nfb_version.map
@@ -1,4 +1,3 @@
-DPDK_19.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/nfp/rte_pmd_nfp_version.map b/drivers/net/nfp/rte_pmd_nfp_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/nfp/rte_pmd_nfp_version.map
+++ b/drivers/net/nfp/rte_pmd_nfp_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/null/rte_pmd_null_version.map b/drivers/net/null/rte_pmd_null_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/null/rte_pmd_null_version.map
+++ b/drivers/net/null/rte_pmd_null_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/octeontx/rte_pmd_octeontx_version.map b/drivers/net/octeontx/rte_pmd_octeontx_version.map
index a3161b14d0..f7cae02fac 100644
--- a/drivers/net/octeontx/rte_pmd_octeontx_version.map
+++ b/drivers/net/octeontx/rte_pmd_octeontx_version.map
@@ -1,11 +1,7 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_18.02 {
+DPDK_20.0 {
 	global:
 
 	rte_octeontx_pchan_map;
 
-} DPDK_17.11;
+	local: *;
+};
diff --git a/drivers/net/octeontx2/rte_pmd_octeontx2_version.map b/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
+++ b/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/pcap/rte_pmd_pcap_version.map b/drivers/net/pcap/rte_pmd_pcap_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/pcap/rte_pmd_pcap_version.map
+++ b/drivers/net/pcap/rte_pmd_pcap_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/pfe/rte_pmd_pfe_version.map b/drivers/net/pfe/rte_pmd_pfe_version.map
index b7b7c91683..f9f17e4f6e 100644
--- a/drivers/net/pfe/rte_pmd_pfe_version.map
+++ b/drivers/net/pfe/rte_pmd_pfe_version.map
@@ -1,4 +1,3 @@
-DPDK_19.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/qede/rte_pmd_qede_version.map b/drivers/net/qede/rte_pmd_qede_version.map
index 349c6e1c22..f9f17e4f6e 100644
--- a/drivers/net/qede/rte_pmd_qede_version.map
+++ b/drivers/net/qede/rte_pmd_qede_version.map
@@ -1,4 +1,3 @@
-DPDK_16.04 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ring/rte_pmd_ring_version.map b/drivers/net/ring/rte_pmd_ring_version.map
index 1f785d9409..ebb6be2733 100644
--- a/drivers/net/ring/rte_pmd_ring_version.map
+++ b/drivers/net/ring/rte_pmd_ring_version.map
@@ -1,14 +1,8 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_eth_from_ring;
 	rte_eth_from_rings;
 
 	local: *;
 };
-
-DPDK_2.2 {
-	global:
-
-	rte_eth_from_ring;
-
-} DPDK_2.0;
diff --git a/drivers/net/sfc/rte_pmd_sfc_version.map b/drivers/net/sfc/rte_pmd_sfc_version.map
index 31eca32ebe..f9f17e4f6e 100644
--- a/drivers/net/sfc/rte_pmd_sfc_version.map
+++ b/drivers/net/sfc/rte_pmd_sfc_version.map
@@ -1,4 +1,3 @@
-DPDK_17.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/softnic/rte_pmd_softnic_version.map b/drivers/net/softnic/rte_pmd_softnic_version.map
index bc44b06f98..50f113d5a2 100644
--- a/drivers/net/softnic/rte_pmd_softnic_version.map
+++ b/drivers/net/softnic/rte_pmd_softnic_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_pmd_softnic_run;
diff --git a/drivers/net/szedata2/rte_pmd_szedata2_version.map b/drivers/net/szedata2/rte_pmd_szedata2_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/szedata2/rte_pmd_szedata2_version.map
+++ b/drivers/net/szedata2/rte_pmd_szedata2_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/tap/rte_pmd_tap_version.map b/drivers/net/tap/rte_pmd_tap_version.map
index 31eca32ebe..f9f17e4f6e 100644
--- a/drivers/net/tap/rte_pmd_tap_version.map
+++ b/drivers/net/tap/rte_pmd_tap_version.map
@@ -1,4 +1,3 @@
-DPDK_17.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/thunderx/rte_pmd_thunderx_version.map b/drivers/net/thunderx/rte_pmd_thunderx_version.map
index 1901bcb3b3..f9f17e4f6e 100644
--- a/drivers/net/thunderx/rte_pmd_thunderx_version.map
+++ b/drivers/net/thunderx/rte_pmd_thunderx_version.map
@@ -1,4 +1,3 @@
-DPDK_16.07 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map b/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
+++ b/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vhost/rte_pmd_vhost_version.map b/drivers/net/vhost/rte_pmd_vhost_version.map
index 695db85749..16b591ccc4 100644
--- a/drivers/net/vhost/rte_pmd_vhost_version.map
+++ b/drivers/net/vhost/rte_pmd_vhost_version.map
@@ -1,13 +1,8 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	global:
 
 	rte_eth_vhost_get_queue_event;
-
-	local: *;
-};
-
-DPDK_16.11 {
-	global:
-
 	rte_eth_vhost_get_vid_from_port_id;
+
+	local: *;
 };
diff --git a/drivers/net/virtio/rte_pmd_virtio_version.map b/drivers/net/virtio/rte_pmd_virtio_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/virtio/rte_pmd_virtio_version.map
+++ b/drivers/net/virtio/rte_pmd_virtio_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map b/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
+++ b/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map b/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
+++ b/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map b/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
index d16a136fc8..ca6a0d7626 100644
--- a/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
+++ b/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
@@ -1,4 +1,4 @@
-DPDK_19.05 {
+DPDK_20.0 {
 	global:
 
 	rte_qdma_attr_get;
@@ -9,9 +9,9 @@ DPDK_19.05 {
 	rte_qdma_start;
 	rte_qdma_stop;
 	rte_qdma_vq_create;
-	rte_qdma_vq_destroy;
 	rte_qdma_vq_dequeue;
 	rte_qdma_vq_dequeue_multi;
+	rte_qdma_vq_destroy;
 	rte_qdma_vq_enqueue;
 	rte_qdma_vq_enqueue_multi;
 	rte_qdma_vq_stats;
diff --git a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
+++ b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/ioat/rte_rawdev_ioat_version.map b/drivers/raw/ioat/rte_rawdev_ioat_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/raw/ioat/rte_rawdev_ioat_version.map
+++ b/drivers/raw/ioat/rte_rawdev_ioat_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/ntb/rte_rawdev_ntb_version.map b/drivers/raw/ntb/rte_rawdev_ntb_version.map
index 8861484fb3..f9f17e4f6e 100644
--- a/drivers/raw/ntb/rte_rawdev_ntb_version.map
+++ b/drivers/raw/ntb/rte_rawdev_ntb_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
-        local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map b/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
+++ b/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/skeleton/rte_rawdev_skeleton_version.map b/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
+++ b/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
index b09370a104..c3daca8115 100644
--- a/lib/librte_acl/rte_acl_version.map
+++ b/lib/librte_acl/rte_acl_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_acl_add_rules;
diff --git a/lib/librte_bitratestats/rte_bitratestats_version.map b/lib/librte_bitratestats/rte_bitratestats_version.map
index fe7454452d..88fc2912db 100644
--- a/lib/librte_bitratestats/rte_bitratestats_version.map
+++ b/lib/librte_bitratestats/rte_bitratestats_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_stats_bitrate_calc;
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
index a0a11cea8d..906eee96bf 100644
--- a/lib/librte_cfgfile/rte_cfgfile_version.map
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -1,40 +1,22 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_cfgfile_add_entry;
+	rte_cfgfile_add_section;
 	rte_cfgfile_close;
+	rte_cfgfile_create;
 	rte_cfgfile_get_entry;
 	rte_cfgfile_has_entry;
 	rte_cfgfile_has_section;
 	rte_cfgfile_load;
+	rte_cfgfile_load_with_params;
 	rte_cfgfile_num_sections;
+	rte_cfgfile_save;
 	rte_cfgfile_section_entries;
+	rte_cfgfile_section_entries_by_index;
 	rte_cfgfile_section_num_entries;
 	rte_cfgfile_sections;
+	rte_cfgfile_set_entry;
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_cfgfile_section_entries_by_index;
-
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_cfgfile_load_with_params;
-
-} DPDK_16.04;
-
-DPDK_17.11 {
-	global:
-
-	rte_cfgfile_add_entry;
-	rte_cfgfile_add_section;
-	rte_cfgfile_create;
-	rte_cfgfile_save;
-	rte_cfgfile_set_entry;
-
-} DPDK_17.05;
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
index 04bcb387f2..95fce812ff 100644
--- a/lib/librte_cmdline/rte_cmdline_version.map
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	cirbuf_add_buf_head;
@@ -40,6 +40,7 @@ DPDK_2.0 {
 	cmdline_parse_num;
 	cmdline_parse_portlist;
 	cmdline_parse_string;
+	cmdline_poll;
 	cmdline_printf;
 	cmdline_quit;
 	cmdline_set_prompt;
@@ -68,10 +69,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_2.1 {
-	global:
-
-	cmdline_poll;
-
-} DPDK_2.0;
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 3deb265ac2..1dd1e259a0 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -1,92 +1,62 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	global:
 
-	rte_cryptodevs;
+	rte_crypto_aead_algorithm_strings;
+	rte_crypto_aead_operation_strings;
+	rte_crypto_auth_algorithm_strings;
+	rte_crypto_auth_operation_strings;
+	rte_crypto_cipher_algorithm_strings;
+	rte_crypto_cipher_operation_strings;
+	rte_crypto_op_pool_create;
+	rte_cryptodev_allocate_driver;
 	rte_cryptodev_callback_register;
 	rte_cryptodev_callback_unregister;
 	rte_cryptodev_close;
-	rte_cryptodev_count;
 	rte_cryptodev_configure;
+	rte_cryptodev_count;
+	rte_cryptodev_device_count_by_driver;
+	rte_cryptodev_devices_get;
+	rte_cryptodev_driver_id_get;
+	rte_cryptodev_driver_name_get;
+	rte_cryptodev_get_aead_algo_enum;
+	rte_cryptodev_get_auth_algo_enum;
+	rte_cryptodev_get_cipher_algo_enum;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
+	rte_cryptodev_get_sec_ctx;
 	rte_cryptodev_info_get;
+	rte_cryptodev_name_get;
 	rte_cryptodev_pmd_allocate;
 	rte_cryptodev_pmd_callback_process;
+	rte_cryptodev_pmd_create;
+	rte_cryptodev_pmd_create_dev_name;
+	rte_cryptodev_pmd_destroy;
+	rte_cryptodev_pmd_get_dev;
+	rte_cryptodev_pmd_get_named_dev;
+	rte_cryptodev_pmd_is_valid_dev;
+	rte_cryptodev_pmd_parse_input_args;
 	rte_cryptodev_pmd_release_device;
-	rte_cryptodev_sym_session_create;
-	rte_cryptodev_sym_session_free;
+	rte_cryptodev_queue_pair_count;
+	rte_cryptodev_queue_pair_setup;
 	rte_cryptodev_socket_id;
 	rte_cryptodev_start;
 	rte_cryptodev_stats_get;
 	rte_cryptodev_stats_reset;
 	rte_cryptodev_stop;
-	rte_cryptodev_queue_pair_count;
-	rte_cryptodev_queue_pair_setup;
-	rte_crypto_op_pool_create;
-
-	local: *;
-};
-
-DPDK_17.02 {
-	global:
-
-	rte_cryptodev_devices_get;
-	rte_cryptodev_pmd_create_dev_name;
-	rte_cryptodev_pmd_get_dev;
-	rte_cryptodev_pmd_get_named_dev;
-	rte_cryptodev_pmd_is_valid_dev;
+	rte_cryptodev_sym_capability_check_aead;
 	rte_cryptodev_sym_capability_check_auth;
 	rte_cryptodev_sym_capability_check_cipher;
 	rte_cryptodev_sym_capability_get;
-	rte_crypto_auth_algorithm_strings;
-	rte_crypto_auth_operation_strings;
-	rte_crypto_cipher_algorithm_strings;
-	rte_crypto_cipher_operation_strings;
-
-} DPDK_16.04;
-
-DPDK_17.05 {
-	global:
-
-	rte_cryptodev_get_auth_algo_enum;
-	rte_cryptodev_get_cipher_algo_enum;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_cryptodev_allocate_driver;
-	rte_cryptodev_device_count_by_driver;
-	rte_cryptodev_driver_id_get;
-	rte_cryptodev_driver_name_get;
-	rte_cryptodev_get_aead_algo_enum;
-	rte_cryptodev_sym_capability_check_aead;
-	rte_cryptodev_sym_session_init;
-	rte_cryptodev_sym_session_clear;
-	rte_crypto_aead_algorithm_strings;
-	rte_crypto_aead_operation_strings;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_cryptodev_get_sec_ctx;
-	rte_cryptodev_name_get;
-	rte_cryptodev_pmd_create;
-	rte_cryptodev_pmd_destroy;
-	rte_cryptodev_pmd_parse_input_args;
-
-} DPDK_17.08;
-
-DPDK_18.05 {
-	global:
-
 	rte_cryptodev_sym_get_header_session_size;
 	rte_cryptodev_sym_get_private_session_size;
+	rte_cryptodev_sym_session_clear;
+	rte_cryptodev_sym_session_create;
+	rte_cryptodev_sym_session_free;
+	rte_cryptodev_sym_session_init;
+	rte_cryptodevs;
 
-} DPDK_17.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
index 00e26b4804..1b7c643005 100644
--- a/lib/librte_distributor/rte_distributor_version.map
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_distributor_clear_returns;
@@ -10,4 +10,6 @@ DPDK_17.05 {
 	rte_distributor_request_pkt;
 	rte_distributor_return_pkt;
 	rte_distributor_returned_pkts;
+
+	local: *;
 };
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index f1982f2f73..8663517df3 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	__rte_panic;
@@ -6,44 +6,113 @@ DPDK_2.0 {
 	eal_timer_source;
 	per_lcore__lcore_id;
 	per_lcore__rte_errno;
+	rte_bus_dump;
+	rte_bus_find;
+	rte_bus_find_by_device;
+	rte_bus_find_by_name;
+	rte_bus_get_iommu_class;
+	rte_bus_probe;
+	rte_bus_register;
+	rte_bus_scan;
+	rte_bus_unregister;
 	rte_calloc;
 	rte_calloc_socket;
 	rte_cpu_get_flag_enabled;
+	rte_cpu_get_flag_name;
+	rte_cpu_is_supported;
+	rte_ctrl_thread_create;
 	rte_cycles_vmware_tsc_map;
 	rte_delay_us;
+	rte_delay_us_block;
+	rte_delay_us_callback_register;
+	rte_dev_is_probed;
+	rte_dev_probe;
+	rte_dev_remove;
+	rte_devargs_add;
+	rte_devargs_dump;
+	rte_devargs_insert;
+	rte_devargs_next;
+	rte_devargs_parse;
+	rte_devargs_parsef;
+	rte_devargs_remove;
+	rte_devargs_type_count;
 	rte_dump_physmem_layout;
 	rte_dump_registers;
 	rte_dump_stack;
 	rte_dump_tailq;
 	rte_eal_alarm_cancel;
 	rte_eal_alarm_set;
+	rte_eal_cleanup;
+	rte_eal_create_uio_dev;
 	rte_eal_get_lcore_state;
 	rte_eal_get_physmem_size;
+	rte_eal_get_runtime_dir;
 	rte_eal_has_hugepages;
+	rte_eal_has_pci;
+	rte_eal_hotplug_add;
+	rte_eal_hotplug_remove;
 	rte_eal_hpet_init;
 	rte_eal_init;
 	rte_eal_iopl_init;
+	rte_eal_iova_mode;
 	rte_eal_lcore_role;
+	rte_eal_mbuf_user_pool_ops;
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
+	rte_eal_primary_proc_alive;
 	rte_eal_process_type;
 	rte_eal_remote_launch;
 	rte_eal_tailq_lookup;
 	rte_eal_tailq_register;
+	rte_eal_using_phys_addrs;
+	rte_eal_vfio_intr_mode;
 	rte_eal_wait_lcore;
+	rte_epoll_ctl;
+	rte_epoll_wait;
 	rte_exit;
 	rte_free;
 	rte_get_hpet_cycles;
 	rte_get_hpet_hz;
+	rte_get_master_lcore;
+	rte_get_next_lcore;
 	rte_get_tsc_hz;
 	rte_hexdump;
+	rte_hypervisor_get;
+	rte_hypervisor_get_name;
+	rte_intr_allow_others;
 	rte_intr_callback_register;
 	rte_intr_callback_unregister;
+	rte_intr_cap_multiple;
 	rte_intr_disable;
+	rte_intr_dp_is_en;
+	rte_intr_efd_disable;
+	rte_intr_efd_enable;
 	rte_intr_enable;
+	rte_intr_free_epoll_fd;
+	rte_intr_rx_ctl;
+	rte_intr_tls_epfd;
+	rte_keepalive_create;
+	rte_keepalive_dispatch_pings;
+	rte_keepalive_mark_alive;
+	rte_keepalive_mark_sleep;
+	rte_keepalive_register_core;
+	rte_keepalive_register_relay_callback;
+	rte_lcore_count;
+	rte_lcore_has_role;
+	rte_lcore_index;
+	rte_lcore_is_enabled;
+	rte_lcore_to_socket_id;
 	rte_log;
 	rte_log_cur_msg_loglevel;
 	rte_log_cur_msg_logtype;
+	rte_log_dump;
+	rte_log_get_global_level;
+	rte_log_get_level;
+	rte_log_register;
+	rte_log_set_global_level;
+	rte_log_set_level;
+	rte_log_set_level_pattern;
+	rte_log_set_level_regexp;
 	rte_logs;
 	rte_malloc;
 	rte_malloc_dump_stats;
@@ -51,155 +120,38 @@ DPDK_2.0 {
 	rte_malloc_set_limit;
 	rte_malloc_socket;
 	rte_malloc_validate;
+	rte_malloc_virt2iova;
+	rte_mcfg_mem_read_lock;
+	rte_mcfg_mem_read_unlock;
+	rte_mcfg_mem_write_lock;
+	rte_mcfg_mem_write_unlock;
+	rte_mcfg_mempool_read_lock;
+	rte_mcfg_mempool_read_unlock;
+	rte_mcfg_mempool_write_lock;
+	rte_mcfg_mempool_write_unlock;
+	rte_mcfg_tailq_read_lock;
+	rte_mcfg_tailq_read_unlock;
+	rte_mcfg_tailq_write_lock;
+	rte_mcfg_tailq_write_unlock;
 	rte_mem_lock_page;
+	rte_mem_virt2iova;
 	rte_mem_virt2phy;
 	rte_memdump;
 	rte_memory_get_nchannel;
 	rte_memory_get_nrank;
 	rte_memzone_dump;
+	rte_memzone_free;
 	rte_memzone_lookup;
 	rte_memzone_reserve;
 	rte_memzone_reserve_aligned;
 	rte_memzone_reserve_bounded;
 	rte_memzone_walk;
 	rte_openlog_stream;
+	rte_rand;
 	rte_realloc;
-	rte_set_application_usage_hook;
-	rte_socket_id;
-	rte_strerror;
-	rte_strsplit;
-	rte_sys_gettid;
-	rte_thread_get_affinity;
-	rte_thread_set_affinity;
-	rte_vlog;
-	rte_zmalloc;
-	rte_zmalloc_socket;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_epoll_ctl;
-	rte_epoll_wait;
-	rte_intr_allow_others;
-	rte_intr_dp_is_en;
-	rte_intr_efd_disable;
-	rte_intr_efd_enable;
-	rte_intr_rx_ctl;
-	rte_intr_tls_epfd;
-	rte_memzone_free;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
-	rte_intr_cap_multiple;
-	rte_keepalive_create;
-	rte_keepalive_dispatch_pings;
-	rte_keepalive_mark_alive;
-	rte_keepalive_register_core;
-
-} DPDK_2.1;
-
-DPDK_16.04 {
-	global:
-
-	rte_cpu_get_flag_name;
-	rte_eal_primary_proc_alive;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
-	global:
-
-	rte_keepalive_mark_sleep;
-	rte_keepalive_register_relay_callback;
-	rte_rtm_supported;
-	rte_thread_setname;
-
-} DPDK_16.04;
-
-DPDK_16.11 {
-	global:
-
-	rte_delay_us_block;
-	rte_delay_us_callback_register;
-
-} DPDK_16.07;
-
-DPDK_17.02 {
-	global:
-
-	rte_bus_dump;
-	rte_bus_probe;
-	rte_bus_register;
-	rte_bus_scan;
-	rte_bus_unregister;
-
-} DPDK_16.11;
-
-DPDK_17.05 {
-	global:
-
-	rte_cpu_is_supported;
-	rte_intr_free_epoll_fd;
-	rte_log_dump;
-	rte_log_get_global_level;
-	rte_log_register;
-	rte_log_set_global_level;
-	rte_log_set_level;
-	rte_log_set_level_regexp;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_bus_find;
-	rte_bus_find_by_device;
-	rte_bus_find_by_name;
-	rte_log_get_level;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_eal_create_uio_dev;
-	rte_bus_get_iommu_class;
-	rte_eal_has_pci;
-	rte_eal_iova_mode;
-	rte_eal_using_phys_addrs;
-	rte_eal_vfio_intr_mode;
-	rte_lcore_has_role;
-	rte_malloc_virt2iova;
-	rte_mem_virt2iova;
-	rte_vfio_enable;
-	rte_vfio_is_enabled;
-	rte_vfio_noiommu_is_enabled;
-	rte_vfio_release_device;
-	rte_vfio_setup_device;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_hypervisor_get;
-	rte_hypervisor_get_name;
-	rte_vfio_clear_group;
 	rte_reciprocal_value;
 	rte_reciprocal_value_u64;
-
-}  DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_log_set_level_pattern;
+	rte_rtm_supported;
 	rte_service_attr_get;
 	rte_service_attr_reset_all;
 	rte_service_component_register;
@@ -212,6 +164,8 @@ DPDK_18.05 {
 	rte_service_get_count;
 	rte_service_get_name;
 	rte_service_lcore_add;
+	rte_service_lcore_attr_get;
+	rte_service_lcore_attr_reset_all;
 	rte_service_lcore_count;
 	rte_service_lcore_count_services;
 	rte_service_lcore_del;
@@ -221,6 +175,7 @@ DPDK_18.05 {
 	rte_service_lcore_stop;
 	rte_service_map_lcore_get;
 	rte_service_map_lcore_set;
+	rte_service_may_be_active;
 	rte_service_probe_capability;
 	rte_service_run_iter_on_app_lcore;
 	rte_service_runstate_get;
@@ -228,94 +183,43 @@ DPDK_18.05 {
 	rte_service_set_runstate_mapped_check;
 	rte_service_set_stats_enable;
 	rte_service_start_with_defaults;
-
-} DPDK_18.02;
-
-DPDK_18.08 {
-	global:
-
-	rte_eal_mbuf_user_pool_ops;
+	rte_set_application_usage_hook;
+	rte_socket_count;
+	rte_socket_id;
+	rte_socket_id_by_idx;
+	rte_srand;
+	rte_strerror;
+	rte_strscpy;
+	rte_strsplit;
+	rte_sys_gettid;
+	rte_thread_get_affinity;
+	rte_thread_set_affinity;
+	rte_thread_setname;
 	rte_uuid_compare;
 	rte_uuid_is_null;
 	rte_uuid_parse;
 	rte_uuid_unparse;
+	rte_vfio_clear_group;
 	rte_vfio_container_create;
 	rte_vfio_container_destroy;
 	rte_vfio_container_dma_map;
 	rte_vfio_container_dma_unmap;
 	rte_vfio_container_group_bind;
 	rte_vfio_container_group_unbind;
+	rte_vfio_enable;
 	rte_vfio_get_container_fd;
 	rte_vfio_get_group_fd;
 	rte_vfio_get_group_num;
-
-} DPDK_18.05;
-
-DPDK_18.11 {
-	global:
-
-	rte_dev_probe;
-	rte_dev_remove;
-	rte_eal_get_runtime_dir;
-	rte_eal_hotplug_add;
-	rte_eal_hotplug_remove;
-	rte_strscpy;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	rte_ctrl_thread_create;
-	rte_dev_is_probed;
-	rte_devargs_add;
-	rte_devargs_dump;
-	rte_devargs_insert;
-	rte_devargs_next;
-	rte_devargs_parse;
-	rte_devargs_parsef;
-	rte_devargs_remove;
-	rte_devargs_type_count;
-	rte_eal_cleanup;
-	rte_socket_count;
-	rte_socket_id_by_idx;
-
-} DPDK_18.11;
-
-DPDK_19.08 {
-	global:
-
-	rte_lcore_index;
-	rte_lcore_to_socket_id;
-	rte_mcfg_mem_read_lock;
-	rte_mcfg_mem_read_unlock;
-	rte_mcfg_mem_write_lock;
-	rte_mcfg_mem_write_unlock;
-	rte_mcfg_mempool_read_lock;
-	rte_mcfg_mempool_read_unlock;
-	rte_mcfg_mempool_write_lock;
-	rte_mcfg_mempool_write_unlock;
-	rte_mcfg_tailq_read_lock;
-	rte_mcfg_tailq_read_unlock;
-	rte_mcfg_tailq_write_lock;
-	rte_mcfg_tailq_write_unlock;
-	rte_rand;
-	rte_service_lcore_attr_get;
-	rte_service_lcore_attr_reset_all;
-	rte_service_may_be_active;
-	rte_srand;
-
-} DPDK_19.05;
-
-DPDK_19.11 {
-	global:
-
-	rte_get_master_lcore;
-	rte_get_next_lcore;
-	rte_lcore_count;
-	rte_lcore_is_enabled;
-
-} DPDK_19.08;
+	rte_vfio_is_enabled;
+	rte_vfio_noiommu_is_enabled;
+	rte_vfio_release_device;
+	rte_vfio_setup_device;
+	rte_vlog;
+	rte_zmalloc;
+	rte_zmalloc_socket;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_efd/rte_efd_version.map b/lib/librte_efd/rte_efd_version.map
index ae60a64178..e010eecfe4 100644
--- a/lib/librte_efd/rte_efd_version.map
+++ b/lib/librte_efd/rte_efd_version.map
@@ -1,4 +1,4 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
 	rte_efd_create;
diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map
index e59d51648f..28819c1bb7 100644
--- a/lib/librte_ethdev/rte_ethdev_version.map
+++ b/lib/librte_ethdev/rte_ethdev_version.map
@@ -1,35 +1,53 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	global:
 
+	_rte_eth_dev_callback_process;
+	_rte_eth_dev_reset;
+	rte_eth_add_first_rx_callback;
 	rte_eth_add_rx_callback;
 	rte_eth_add_tx_callback;
 	rte_eth_allmulticast_disable;
 	rte_eth_allmulticast_enable;
 	rte_eth_allmulticast_get;
+	rte_eth_dev_adjust_nb_rx_tx_desc;
 	rte_eth_dev_allocate;
 	rte_eth_dev_allocated;
+	rte_eth_dev_attach_secondary;
 	rte_eth_dev_callback_register;
 	rte_eth_dev_callback_unregister;
 	rte_eth_dev_close;
 	rte_eth_dev_configure;
 	rte_eth_dev_count;
+	rte_eth_dev_count_avail;
+	rte_eth_dev_count_total;
 	rte_eth_dev_default_mac_addr_set;
+	rte_eth_dev_filter_ctrl;
 	rte_eth_dev_filter_supported;
 	rte_eth_dev_flow_ctrl_get;
 	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_fw_version_get;
 	rte_eth_dev_get_dcb_info;
 	rte_eth_dev_get_eeprom;
 	rte_eth_dev_get_eeprom_length;
 	rte_eth_dev_get_mtu;
+	rte_eth_dev_get_name_by_port;
+	rte_eth_dev_get_port_by_name;
 	rte_eth_dev_get_reg_info;
+	rte_eth_dev_get_sec_ctx;
+	rte_eth_dev_get_supported_ptypes;
 	rte_eth_dev_get_vlan_offload;
-	rte_eth_devices;
 	rte_eth_dev_info_get;
 	rte_eth_dev_is_valid_port;
+	rte_eth_dev_l2_tunnel_eth_type_conf;
+	rte_eth_dev_l2_tunnel_offload_set;
+	rte_eth_dev_logtype;
 	rte_eth_dev_mac_addr_add;
 	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_pool_ops_supported;
 	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_probing_finish;
 	rte_eth_dev_release_port;
+	rte_eth_dev_reset;
 	rte_eth_dev_rss_hash_conf_get;
 	rte_eth_dev_rss_hash_update;
 	rte_eth_dev_rss_reta_query;
@@ -38,6 +56,7 @@ DPDK_2.2 {
 	rte_eth_dev_rx_intr_ctl_q;
 	rte_eth_dev_rx_intr_disable;
 	rte_eth_dev_rx_intr_enable;
+	rte_eth_dev_rx_offload_name;
 	rte_eth_dev_rx_queue_start;
 	rte_eth_dev_rx_queue_stop;
 	rte_eth_dev_set_eeprom;
@@ -47,18 +66,28 @@ DPDK_2.2 {
 	rte_eth_dev_set_mtu;
 	rte_eth_dev_set_rx_queue_stats_mapping;
 	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_vlan_ether_type;
 	rte_eth_dev_set_vlan_offload;
 	rte_eth_dev_set_vlan_pvid;
 	rte_eth_dev_set_vlan_strip_on_queue;
 	rte_eth_dev_socket_id;
 	rte_eth_dev_start;
 	rte_eth_dev_stop;
+	rte_eth_dev_tx_offload_name;
 	rte_eth_dev_tx_queue_start;
 	rte_eth_dev_tx_queue_stop;
 	rte_eth_dev_uc_all_hash_table_set;
 	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_udp_tunnel_port_add;
+	rte_eth_dev_udp_tunnel_port_delete;
 	rte_eth_dev_vlan_filter;
+	rte_eth_devices;
 	rte_eth_dma_zone_reserve;
+	rte_eth_find_next;
+	rte_eth_find_next_owned_by;
+	rte_eth_iterator_cleanup;
+	rte_eth_iterator_init;
+	rte_eth_iterator_next;
 	rte_eth_led_off;
 	rte_eth_led_on;
 	rte_eth_link;
@@ -75,6 +104,7 @@ DPDK_2.2 {
 	rte_eth_rx_queue_info_get;
 	rte_eth_rx_queue_setup;
 	rte_eth_set_queue_rate_limit;
+	rte_eth_speed_bitflag;
 	rte_eth_stats;
 	rte_eth_stats_get;
 	rte_eth_stats_reset;
@@ -85,66 +115,27 @@ DPDK_2.2 {
 	rte_eth_timesync_read_time;
 	rte_eth_timesync_read_tx_timestamp;
 	rte_eth_timesync_write_time;
-	rte_eth_tx_queue_info_get;
-	rte_eth_tx_queue_setup;
-	rte_eth_xstats_get;
-	rte_eth_xstats_reset;
-
-	local: *;
-};
-
-DPDK_16.04 {
-	global:
-
-	rte_eth_dev_get_supported_ptypes;
-	rte_eth_dev_l2_tunnel_eth_type_conf;
-	rte_eth_dev_l2_tunnel_offload_set;
-	rte_eth_dev_set_vlan_ether_type;
-	rte_eth_dev_udp_tunnel_port_add;
-	rte_eth_dev_udp_tunnel_port_delete;
-	rte_eth_speed_bitflag;
 	rte_eth_tx_buffer_count_callback;
 	rte_eth_tx_buffer_drop_callback;
 	rte_eth_tx_buffer_init;
 	rte_eth_tx_buffer_set_err_callback;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
-	global:
-
-	rte_eth_add_first_rx_callback;
-	rte_eth_dev_get_name_by_port;
-	rte_eth_dev_get_port_by_name;
-	rte_eth_xstats_get_names;
-
-} DPDK_16.04;
-
-DPDK_17.02 {
-	global:
-
-	_rte_eth_dev_reset;
-	rte_eth_dev_fw_version_get;
-
-} DPDK_16.07;
-
-DPDK_17.05 {
-	global:
-
-	rte_eth_dev_attach_secondary;
-	rte_eth_find_next;
 	rte_eth_tx_done_cleanup;
+	rte_eth_tx_queue_info_get;
+	rte_eth_tx_queue_setup;
+	rte_eth_xstats_get;
 	rte_eth_xstats_get_by_id;
 	rte_eth_xstats_get_id_by_name;
+	rte_eth_xstats_get_names;
 	rte_eth_xstats_get_names_by_id;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	_rte_eth_dev_callback_process;
-	rte_eth_dev_adjust_nb_rx_tx_desc;
+	rte_eth_xstats_reset;
+	rte_flow_copy;
+	rte_flow_create;
+	rte_flow_destroy;
+	rte_flow_error_set;
+	rte_flow_flush;
+	rte_flow_isolate;
+	rte_flow_query;
+	rte_flow_validate;
 	rte_tm_capabilities_get;
 	rte_tm_get_number_of_leaf_nodes;
 	rte_tm_hierarchy_commit;
@@ -176,65 +167,8 @@ DPDK_17.08 {
 	rte_tm_wred_profile_add;
 	rte_tm_wred_profile_delete;
 
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_eth_dev_get_sec_ctx;
-	rte_eth_dev_pool_ops_supported;
-	rte_eth_dev_reset;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_eth_dev_filter_ctrl;
-
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_eth_dev_count_avail;
-	rte_eth_dev_probing_finish;
-	rte_eth_find_next_owned_by;
-	rte_flow_copy;
-	rte_flow_create;
-	rte_flow_destroy;
-	rte_flow_error_set;
-	rte_flow_flush;
-	rte_flow_isolate;
-	rte_flow_query;
-	rte_flow_validate;
-
-} DPDK_18.02;
-
-DPDK_18.08 {
-	global:
-
-	rte_eth_dev_logtype;
-
-} DPDK_18.05;
-
-DPDK_18.11 {
-	global:
-
-	rte_eth_dev_rx_offload_name;
-	rte_eth_dev_tx_offload_name;
-	rte_eth_iterator_cleanup;
-	rte_eth_iterator_init;
-	rte_eth_iterator_next;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	rte_eth_dev_count_total;
-
-} DPDK_18.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_eventdev/rte_eventdev_version.map b/lib/librte_eventdev/rte_eventdev_version.map
index 76b3021d3a..edfc15282d 100644
--- a/lib/librte_eventdev/rte_eventdev_version.map
+++ b/lib/librte_eventdev/rte_eventdev_version.map
@@ -1,61 +1,38 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
-	rte_eventdevs;
-
+	rte_event_crypto_adapter_caps_get;
+	rte_event_crypto_adapter_create;
+	rte_event_crypto_adapter_create_ext;
+	rte_event_crypto_adapter_event_port_get;
+	rte_event_crypto_adapter_free;
+	rte_event_crypto_adapter_queue_pair_add;
+	rte_event_crypto_adapter_queue_pair_del;
+	rte_event_crypto_adapter_service_id_get;
+	rte_event_crypto_adapter_start;
+	rte_event_crypto_adapter_stats_get;
+	rte_event_crypto_adapter_stats_reset;
+	rte_event_crypto_adapter_stop;
+	rte_event_dequeue_timeout_ticks;
+	rte_event_dev_attr_get;
+	rte_event_dev_close;
+	rte_event_dev_configure;
 	rte_event_dev_count;
+	rte_event_dev_dump;
 	rte_event_dev_get_dev_id;
-	rte_event_dev_socket_id;
 	rte_event_dev_info_get;
-	rte_event_dev_configure;
+	rte_event_dev_selftest;
+	rte_event_dev_service_id_get;
+	rte_event_dev_socket_id;
 	rte_event_dev_start;
 	rte_event_dev_stop;
-	rte_event_dev_close;
-	rte_event_dev_dump;
+	rte_event_dev_stop_flush_callback_register;
 	rte_event_dev_xstats_by_name_get;
 	rte_event_dev_xstats_get;
 	rte_event_dev_xstats_names_get;
 	rte_event_dev_xstats_reset;
-
-	rte_event_port_default_conf_get;
-	rte_event_port_setup;
-	rte_event_port_link;
-	rte_event_port_unlink;
-	rte_event_port_links_get;
-
-	rte_event_queue_default_conf_get;
-	rte_event_queue_setup;
-
-	rte_event_dequeue_timeout_ticks;
-
-	rte_event_pmd_allocate;
-	rte_event_pmd_release;
-	rte_event_pmd_vdev_init;
-	rte_event_pmd_vdev_uninit;
-	rte_event_pmd_pci_probe;
-	rte_event_pmd_pci_remove;
-
-	local: *;
-};
-
-DPDK_17.08 {
-	global:
-
-	rte_event_ring_create;
-	rte_event_ring_free;
-	rte_event_ring_init;
-	rte_event_ring_lookup;
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_event_dev_attr_get;
-	rte_event_dev_service_id_get;
-	rte_event_port_attr_get;
-	rte_event_queue_attr_get;
-
 	rte_event_eth_rx_adapter_caps_get;
+	rte_event_eth_rx_adapter_cb_register;
 	rte_event_eth_rx_adapter_create;
 	rte_event_eth_rx_adapter_create_ext;
 	rte_event_eth_rx_adapter_free;
@@ -63,38 +40,9 @@ DPDK_17.11 {
 	rte_event_eth_rx_adapter_queue_del;
 	rte_event_eth_rx_adapter_service_id_get;
 	rte_event_eth_rx_adapter_start;
+	rte_event_eth_rx_adapter_stats_get;
 	rte_event_eth_rx_adapter_stats_reset;
 	rte_event_eth_rx_adapter_stop;
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_event_dev_selftest;
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_event_dev_stop_flush_callback_register;
-} DPDK_18.02;
-
-DPDK_19.05 {
-	global:
-
-	rte_event_crypto_adapter_caps_get;
-	rte_event_crypto_adapter_create;
-	rte_event_crypto_adapter_create_ext;
-	rte_event_crypto_adapter_event_port_get;
-	rte_event_crypto_adapter_free;
-	rte_event_crypto_adapter_queue_pair_add;
-	rte_event_crypto_adapter_queue_pair_del;
-	rte_event_crypto_adapter_service_id_get;
-	rte_event_crypto_adapter_start;
-	rte_event_crypto_adapter_stats_get;
-	rte_event_crypto_adapter_stats_reset;
-	rte_event_crypto_adapter_stop;
-	rte_event_port_unlinks_in_progress;
 	rte_event_eth_tx_adapter_caps_get;
 	rte_event_eth_tx_adapter_create;
 	rte_event_eth_tx_adapter_create_ext;
@@ -107,6 +55,26 @@ DPDK_19.05 {
 	rte_event_eth_tx_adapter_stats_get;
 	rte_event_eth_tx_adapter_stats_reset;
 	rte_event_eth_tx_adapter_stop;
+	rte_event_pmd_allocate;
+	rte_event_pmd_pci_probe;
+	rte_event_pmd_pci_remove;
+	rte_event_pmd_release;
+	rte_event_pmd_vdev_init;
+	rte_event_pmd_vdev_uninit;
+	rte_event_port_attr_get;
+	rte_event_port_default_conf_get;
+	rte_event_port_link;
+	rte_event_port_links_get;
+	rte_event_port_setup;
+	rte_event_port_unlink;
+	rte_event_port_unlinks_in_progress;
+	rte_event_queue_attr_get;
+	rte_event_queue_default_conf_get;
+	rte_event_queue_setup;
+	rte_event_ring_create;
+	rte_event_ring_free;
+	rte_event_ring_init;
+	rte_event_ring_lookup;
 	rte_event_timer_adapter_caps_get;
 	rte_event_timer_adapter_create;
 	rte_event_timer_adapter_create_ext;
@@ -121,11 +89,7 @@ DPDK_19.05 {
 	rte_event_timer_arm_burst;
 	rte_event_timer_arm_tmo_tick_burst;
 	rte_event_timer_cancel_burst;
-} DPDK_18.05;
+	rte_eventdevs;
 
-DPDK_19.08 {
-	global:
-
-	rte_event_eth_rx_adapter_cb_register;
-	rte_event_eth_rx_adapter_stats_get;
-} DPDK_19.05;
+	local: *;
+};
diff --git a/lib/librte_gro/rte_gro_version.map b/lib/librte_gro/rte_gro_version.map
index 1606b6dc72..9f6fe79e57 100644
--- a/lib/librte_gro/rte_gro_version.map
+++ b/lib/librte_gro/rte_gro_version.map
@@ -1,4 +1,4 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	global:
 
 	rte_gro_ctx_create;
diff --git a/lib/librte_gso/rte_gso_version.map b/lib/librte_gso/rte_gso_version.map
index e1fd453edb..8505a59c27 100644
--- a/lib/librte_gso/rte_gso_version.map
+++ b/lib/librte_gso/rte_gso_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_gso_segment;
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
index 734ae28b04..138c130c1b 100644
--- a/lib/librte_hash/rte_hash_version.map
+++ b/lib/librte_hash/rte_hash_version.map
@@ -1,58 +1,33 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_fbk_hash_create;
 	rte_fbk_hash_find_existing;
 	rte_fbk_hash_free;
 	rte_hash_add_key;
+	rte_hash_add_key_data;
 	rte_hash_add_key_with_hash;
+	rte_hash_add_key_with_hash_data;
+	rte_hash_count;
 	rte_hash_create;
 	rte_hash_del_key;
 	rte_hash_del_key_with_hash;
 	rte_hash_find_existing;
 	rte_hash_free;
+	rte_hash_get_key_with_position;
 	rte_hash_hash;
+	rte_hash_iterate;
 	rte_hash_lookup;
 	rte_hash_lookup_bulk;
-	rte_hash_lookup_with_hash;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_hash_add_key_data;
-	rte_hash_add_key_with_hash_data;
-	rte_hash_iterate;
 	rte_hash_lookup_bulk_data;
 	rte_hash_lookup_data;
+	rte_hash_lookup_with_hash;
 	rte_hash_lookup_with_hash_data;
 	rte_hash_reset;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
 	rte_hash_set_cmp_func;
 
-} DPDK_2.1;
-
-DPDK_16.07 {
-	global:
-
-	rte_hash_get_key_with_position;
-
-} DPDK_2.2;
-
-
-DPDK_18.08 {
-	global:
-
-	rte_hash_count;
-
-} DPDK_16.07;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_ip_frag/rte_ip_frag_version.map b/lib/librte_ip_frag/rte_ip_frag_version.map
index a193007c61..5dd34f828c 100644
--- a/lib/librte_ip_frag/rte_ip_frag_version.map
+++ b/lib/librte_ip_frag/rte_ip_frag_version.map
@@ -1,8 +1,9 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_ip_frag_free_death_row;
 	rte_ip_frag_table_create;
+	rte_ip_frag_table_destroy;
 	rte_ip_frag_table_statistics_dump;
 	rte_ipv4_frag_reassemble_packet;
 	rte_ipv4_fragment_packet;
@@ -12,13 +13,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_17.08 {
-	global:
-
-	rte_ip_frag_table_destroy;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_jobstats/rte_jobstats_version.map b/lib/librte_jobstats/rte_jobstats_version.map
index f89441438e..dbd2664ae2 100644
--- a/lib/librte_jobstats/rte_jobstats_version.map
+++ b/lib/librte_jobstats/rte_jobstats_version.map
@@ -1,6 +1,7 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_jobstats_abort;
 	rte_jobstats_context_finish;
 	rte_jobstats_context_init;
 	rte_jobstats_context_reset;
@@ -17,10 +18,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_jobstats_abort;
-
-} DPDK_2.0;
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
index c877dc6aaa..9cd3cedc54 100644
--- a/lib/librte_kni/rte_kni_version.map
+++ b/lib/librte_kni/rte_kni_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_kni_alloc;
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
index 8f4b4e3f8f..3ba0f4b59c 100644
--- a/lib/librte_kvargs/rte_kvargs_version.map
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_kvargs_count;
@@ -15,4 +15,4 @@ EXPERIMENTAL {
 	rte_kvargs_parse_delim;
 	rte_kvargs_strcmp;
 
-} DPDK_2.0;
+};
diff --git a/lib/librte_latencystats/rte_latencystats_version.map b/lib/librte_latencystats/rte_latencystats_version.map
index ac8403e821..e04e63463f 100644
--- a/lib/librte_latencystats/rte_latencystats_version.map
+++ b/lib/librte_latencystats/rte_latencystats_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_latencystats_get;
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
index 90beac853d..500f58b806 100644
--- a/lib/librte_lpm/rte_lpm_version.map
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -1,13 +1,6 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
-	rte_lpm_add;
-	rte_lpm_create;
-	rte_lpm_delete;
-	rte_lpm_delete_all;
-	rte_lpm_find_existing;
-	rte_lpm_free;
-	rte_lpm_is_rule_present;
 	rte_lpm6_add;
 	rte_lpm6_create;
 	rte_lpm6_delete;
@@ -18,29 +11,13 @@ DPDK_2.0 {
 	rte_lpm6_is_rule_present;
 	rte_lpm6_lookup;
 	rte_lpm6_lookup_bulk_func;
+	rte_lpm_add;
+	rte_lpm_create;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_is_rule_present;
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_lpm_add;
-	rte_lpm_find_existing;
-	rte_lpm_create;
-	rte_lpm_free;
-	rte_lpm_is_rule_present;
-	rte_lpm_delete;
-	rte_lpm_delete_all;
-
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_lpm6_add;
-	rte_lpm6_is_rule_present;
-	rte_lpm6_lookup;
-	rte_lpm6_lookup_bulk_func;
-
-} DPDK_16.04;
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
index 263dc0a21e..3bbb476975 100644
--- a/lib/librte_mbuf/rte_mbuf_version.map
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -1,26 +1,7 @@
-DPDK_2.0 {
-	global:
-
-	rte_get_rx_ol_flag_name;
-	rte_get_tx_ol_flag_name;
-	rte_mbuf_sanity_check;
-	rte_pktmbuf_dump;
-	rte_pktmbuf_init;
-	rte_pktmbuf_pool_init;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_pktmbuf_pool_create;
-
-} DPDK_2.0;
-
-DPDK_16.11 {
+DPDK_20.0 {
 	global:
 
+	__rte_pktmbuf_linearize;
 	__rte_pktmbuf_read;
 	rte_get_ptype_inner_l2_name;
 	rte_get_ptype_inner_l3_name;
@@ -31,28 +12,24 @@ DPDK_16.11 {
 	rte_get_ptype_name;
 	rte_get_ptype_tunnel_name;
 	rte_get_rx_ol_flag_list;
+	rte_get_rx_ol_flag_name;
 	rte_get_tx_ol_flag_list;
-
-} DPDK_2.1;
-
-DPDK_18.08 {
-	global:
-
+	rte_get_tx_ol_flag_name;
 	rte_mbuf_best_mempool_ops;
 	rte_mbuf_platform_mempool_ops;
+	rte_mbuf_sanity_check;
 	rte_mbuf_set_platform_mempool_ops;
 	rte_mbuf_set_user_mempool_ops;
 	rte_mbuf_user_mempool_ops;
-	rte_pktmbuf_pool_create_by_ops;
-} DPDK_16.11;
-
-DPDK_19.11 {
-	global:
-
-	__rte_pktmbuf_linearize;
 	rte_pktmbuf_clone;
+	rte_pktmbuf_dump;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_create;
+	rte_pktmbuf_pool_create_by_ops;
+	rte_pktmbuf_pool_init;
 
-} DPDK_18.08;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
@@ -68,4 +45,4 @@ EXPERIMENTAL {
 	rte_pktmbuf_copy;
 	rte_pktmbuf_free_bulk;
 
-} DPDK_18.08;
+};
diff --git a/lib/librte_member/rte_member_version.map b/lib/librte_member/rte_member_version.map
index 019e4cd962..87780ae611 100644
--- a/lib/librte_member/rte_member_version.map
+++ b/lib/librte_member/rte_member_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_member_add;
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
index ce9e791e78..d002dfc46f 100644
--- a/lib/librte_mempool/rte_mempool_version.map
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -1,57 +1,39 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_mempool_audit;
-	rte_mempool_calc_obj_size;
-	rte_mempool_create;
-	rte_mempool_dump;
-	rte_mempool_list_dump;
-	rte_mempool_lookup;
-	rte_mempool_walk;
-
-	local: *;
-};
-
-DPDK_16.07 {
-	global:
-
 	rte_mempool_avail_count;
 	rte_mempool_cache_create;
 	rte_mempool_cache_flush;
 	rte_mempool_cache_free;
+	rte_mempool_calc_obj_size;
 	rte_mempool_check_cookies;
+	rte_mempool_contig_blocks_check_cookies;
+	rte_mempool_create;
 	rte_mempool_create_empty;
 	rte_mempool_default_cache;
+	rte_mempool_dump;
 	rte_mempool_free;
 	rte_mempool_generic_get;
 	rte_mempool_generic_put;
 	rte_mempool_in_use_count;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
 	rte_mempool_mem_iter;
 	rte_mempool_obj_iter;
+	rte_mempool_op_calc_mem_size_default;
+	rte_mempool_op_populate_default;
 	rte_mempool_ops_table;
 	rte_mempool_populate_anon;
 	rte_mempool_populate_default;
+	rte_mempool_populate_iova;
 	rte_mempool_populate_virt;
 	rte_mempool_register_ops;
 	rte_mempool_set_ops_byname;
+	rte_mempool_walk;
 
-} DPDK_2.0;
-
-DPDK_17.11 {
-	global:
-
-	rte_mempool_populate_iova;
-
-} DPDK_16.07;
-
-DPDK_18.05 {
-	global:
-
-	rte_mempool_contig_blocks_check_cookies;
-	rte_mempool_op_calc_mem_size_default;
-	rte_mempool_op_populate_default;
-
-} DPDK_17.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
index 4b460d5803..46410b0369 100644
--- a/lib/librte_meter/rte_meter_version.map
+++ b/lib/librte_meter/rte_meter_version.map
@@ -1,21 +1,16 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_meter_srtcm_color_aware_check;
 	rte_meter_srtcm_color_blind_check;
 	rte_meter_srtcm_config;
+	rte_meter_srtcm_profile_config;
 	rte_meter_trtcm_color_aware_check;
 	rte_meter_trtcm_color_blind_check;
 	rte_meter_trtcm_config;
-
-	local: *;
-};
-
-DPDK_18.08 {
-	global:
-
-	rte_meter_srtcm_profile_config;
 	rte_meter_trtcm_profile_config;
+
+	local: *;
 };
 
 EXPERIMENTAL {
diff --git a/lib/librte_metrics/rte_metrics_version.map b/lib/librte_metrics/rte_metrics_version.map
index 6ac99a44a1..85663f356e 100644
--- a/lib/librte_metrics/rte_metrics_version.map
+++ b/lib/librte_metrics/rte_metrics_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_metrics_get_names;
diff --git a/lib/librte_net/rte_net_version.map b/lib/librte_net/rte_net_version.map
index fffc4a3723..8a4e75a3a0 100644
--- a/lib/librte_net/rte_net_version.map
+++ b/lib/librte_net/rte_net_version.map
@@ -1,25 +1,14 @@
-DPDK_16.11 {
-	global:
-	rte_net_get_ptype;
-
-	local: *;
-};
-
-DPDK_17.05 {
-	global:
-
-	rte_net_crc_calc;
-	rte_net_crc_set_alg;
-
-} DPDK_16.11;
-
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
 	rte_eth_random_addr;
 	rte_ether_format_addr;
+	rte_net_crc_calc;
+	rte_net_crc_set_alg;
+	rte_net_get_ptype;
 
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_pci/rte_pci_version.map b/lib/librte_pci/rte_pci_version.map
index 03790cb0f0..67eb845796 100644
--- a/lib/librte_pci/rte_pci_version.map
+++ b/lib/librte_pci/rte_pci_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	pci_map_resource;
diff --git a/lib/librte_pdump/rte_pdump_version.map b/lib/librte_pdump/rte_pdump_version.map
index 3e744f3012..6d02ccce6d 100644
--- a/lib/librte_pdump/rte_pdump_version.map
+++ b/lib/librte_pdump/rte_pdump_version.map
@@ -1,4 +1,4 @@
-DPDK_16.07 {
+DPDK_20.0 {
 	global:
 
 	rte_pdump_disable;
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
index 420f065d6e..64d38afecd 100644
--- a/lib/librte_pipeline/rte_pipeline_version.map
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -1,6 +1,8 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_pipeline_ah_packet_drop;
+	rte_pipeline_ah_packet_hijack;
 	rte_pipeline_check;
 	rte_pipeline_create;
 	rte_pipeline_flush;
@@ -9,42 +11,22 @@ DPDK_2.0 {
 	rte_pipeline_port_in_create;
 	rte_pipeline_port_in_disable;
 	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_stats_read;
 	rte_pipeline_port_out_create;
 	rte_pipeline_port_out_packet_insert;
+	rte_pipeline_port_out_stats_read;
 	rte_pipeline_run;
 	rte_pipeline_table_create;
 	rte_pipeline_table_default_entry_add;
 	rte_pipeline_table_default_entry_delete;
 	rte_pipeline_table_entry_add;
-	rte_pipeline_table_entry_delete;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_pipeline_port_in_stats_read;
-	rte_pipeline_port_out_stats_read;
-	rte_pipeline_table_stats_read;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
 	rte_pipeline_table_entry_add_bulk;
+	rte_pipeline_table_entry_delete;
 	rte_pipeline_table_entry_delete_bulk;
+	rte_pipeline_table_stats_read;
 
-} DPDK_2.1;
-
-DPDK_16.04 {
-	global:
-
-	rte_pipeline_ah_packet_hijack;
-	rte_pipeline_ah_packet_drop;
-
-} DPDK_2.2;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
index d5989721d7..18c6154672 100644
--- a/lib/librte_port/rte_port_version.map
+++ b/lib/librte_port/rte_port_version.map
@@ -1,65 +1,35 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_nodrop_ops;
 	rte_port_ethdev_writer_ops;
+	rte_port_fd_reader_ops;
+	rte_port_fd_writer_nodrop_ops;
+	rte_port_fd_writer_ops;
+	rte_port_kni_reader_ops;
+	rte_port_kni_writer_nodrop_ops;
+	rte_port_kni_writer_ops;
+	rte_port_ring_multi_reader_ops;
+	rte_port_ring_multi_writer_nodrop_ops;
+	rte_port_ring_multi_writer_ops;
 	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_reader_ipv6_frag_ops;
 	rte_port_ring_reader_ops;
 	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_writer_ipv6_ras_ops;
+	rte_port_ring_writer_nodrop_ops;
 	rte_port_ring_writer_ops;
 	rte_port_sched_reader_ops;
 	rte_port_sched_writer_ops;
 	rte_port_sink_ops;
 	rte_port_source_ops;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_port_ethdev_writer_nodrop_ops;
-	rte_port_ring_reader_ipv6_frag_ops;
-	rte_port_ring_writer_ipv6_ras_ops;
-	rte_port_ring_writer_nodrop_ops;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
-	rte_port_ring_multi_reader_ops;
-	rte_port_ring_multi_writer_ops;
-	rte_port_ring_multi_writer_nodrop_ops;
-
-} DPDK_2.1;
-
-DPDK_16.07 {
-	global:
-
-	rte_port_kni_reader_ops;
-	rte_port_kni_writer_ops;
-	rte_port_kni_writer_nodrop_ops;
-
-} DPDK_2.2;
-
-DPDK_16.11 {
-	global:
-
-	rte_port_fd_reader_ops;
-	rte_port_fd_writer_ops;
-	rte_port_fd_writer_nodrop_ops;
-
-} DPDK_16.07;
-
-DPDK_18.11 {
-	global:
-
 	rte_port_sym_crypto_reader_ops;
-	rte_port_sym_crypto_writer_ops;
 	rte_port_sym_crypto_writer_nodrop_ops;
+	rte_port_sym_crypto_writer_ops;
 
-} DPDK_16.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
index 7729838137..55a168f56e 100644
--- a/lib/librte_power/rte_power_version.map
+++ b/lib/librte_power/rte_power_version.map
@@ -1,39 +1,27 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_power_exit;
+	rte_power_freq_disable_turbo;
 	rte_power_freq_down;
+	rte_power_freq_enable_turbo;
 	rte_power_freq_max;
 	rte_power_freq_min;
 	rte_power_freq_up;
 	rte_power_freqs;
+	rte_power_get_capabilities;
 	rte_power_get_env;
 	rte_power_get_freq;
+	rte_power_guest_channel_send_msg;
 	rte_power_init;
 	rte_power_set_env;
 	rte_power_set_freq;
+	rte_power_turbo_status;
 	rte_power_unset_env;
 
 	local: *;
 };
 
-DPDK_17.11 {
-	global:
-
-	rte_power_guest_channel_send_msg;
-	rte_power_freq_disable_turbo;
-	rte_power_freq_enable_turbo;
-	rte_power_turbo_status;
-
-} DPDK_2.0;
-
-DPDK_18.08 {
-	global:
-
-	rte_power_get_capabilities;
-
-} DPDK_17.11;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_rawdev/rte_rawdev_version.map b/lib/librte_rawdev/rte_rawdev_version.map
index b61dbff11c..d847c9e0d3 100644
--- a/lib/librte_rawdev/rte_rawdev_version.map
+++ b/lib/librte_rawdev/rte_rawdev_version.map
@@ -1,4 +1,4 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	rte_rawdev_close;
@@ -17,8 +17,8 @@ DPDK_18.08 {
 	rte_rawdev_pmd_release;
 	rte_rawdev_queue_conf_get;
 	rte_rawdev_queue_count;
-	rte_rawdev_queue_setup;
 	rte_rawdev_queue_release;
+	rte_rawdev_queue_setup;
 	rte_rawdev_reset;
 	rte_rawdev_selftest;
 	rte_rawdev_set_attr;
diff --git a/lib/librte_reorder/rte_reorder_version.map b/lib/librte_reorder/rte_reorder_version.map
index 0a8a54de83..cf444062df 100644
--- a/lib/librte_reorder/rte_reorder_version.map
+++ b/lib/librte_reorder/rte_reorder_version.map
@@ -1,13 +1,13 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_reorder_create;
-	rte_reorder_init;
+	rte_reorder_drain;
 	rte_reorder_find_existing;
-	rte_reorder_reset;
 	rte_reorder_free;
+	rte_reorder_init;
 	rte_reorder_insert;
-	rte_reorder_drain;
+	rte_reorder_reset;
 
 	local: *;
 };
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
index 510c1386e0..89d84bcf48 100644
--- a/lib/librte_ring/rte_ring_version.map
+++ b/lib/librte_ring/rte_ring_version.map
@@ -1,8 +1,9 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_ring_create;
 	rte_ring_dump;
+	rte_ring_free;
 	rte_ring_get_memsize;
 	rte_ring_init;
 	rte_ring_list_dump;
@@ -11,13 +12,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_2.2 {
-	global:
-
-	rte_ring_free;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
index f33761e63e..cefd990367 100644
--- a/lib/librte_sched/rte_sched_version.map
+++ b/lib/librte_sched/rte_sched_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_approx;
@@ -14,6 +14,9 @@ DPDK_2.0 {
 	rte_sched_port_enqueue;
 	rte_sched_port_free;
 	rte_sched_port_get_memory_footprint;
+	rte_sched_port_pkt_read_color;
+	rte_sched_port_pkt_read_tree_path;
+	rte_sched_port_pkt_write;
 	rte_sched_queue_read_stats;
 	rte_sched_subport_config;
 	rte_sched_subport_read_stats;
@@ -21,15 +24,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_2.1 {
-	global:
-
-	rte_sched_port_pkt_write;
-	rte_sched_port_pkt_read_tree_path;
-	rte_sched_port_pkt_read_color;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_security/rte_security_version.map b/lib/librte_security/rte_security_version.map
index 53267bf3cc..b07314bbf4 100644
--- a/lib/librte_security/rte_security_version.map
+++ b/lib/librte_security/rte_security_version.map
@@ -1,4 +1,4 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
 	rte_security_attach_session;
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
index 6237252bec..40f72b1fe8 100644
--- a/lib/librte_table/rte_table_version.map
+++ b/lib/librte_table/rte_table_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_table_acl_ops;
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
index 72f75c8181..2a59d3f081 100644
--- a/lib/librte_timer/rte_timer_version.map
+++ b/lib/librte_timer/rte_timer_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_timer_dump_stats;
@@ -14,16 +14,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_19.05 {
-	global:
-
-	rte_timer_dump_stats;
-	rte_timer_manage;
-	rte_timer_reset;
-	rte_timer_stop;
-	rte_timer_subsystem_init;
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
index ce517b1271..c512377fe6 100644
--- a/lib/librte_vhost/rte_vhost_version.map
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -1,64 +1,34 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_vhost_avail_entries;
 	rte_vhost_dequeue_burst;
 	rte_vhost_driver_callback_register;
-	rte_vhost_driver_register;
-	rte_vhost_enable_guest_notification;
-	rte_vhost_enqueue_burst;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_vhost_driver_unregister;
-
-} DPDK_2.0;
-
-DPDK_16.07 {
-	global:
-
-	rte_vhost_avail_entries;
-	rte_vhost_get_ifname;
-	rte_vhost_get_numa_node;
-	rte_vhost_get_queue_num;
-
-} DPDK_2.1;
-
-DPDK_17.05 {
-	global:
-
 	rte_vhost_driver_disable_features;
 	rte_vhost_driver_enable_features;
 	rte_vhost_driver_get_features;
+	rte_vhost_driver_register;
 	rte_vhost_driver_set_features;
 	rte_vhost_driver_start;
+	rte_vhost_driver_unregister;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_enqueue_burst;
+	rte_vhost_get_ifname;
 	rte_vhost_get_mem_table;
 	rte_vhost_get_mtu;
 	rte_vhost_get_negotiated_features;
+	rte_vhost_get_numa_node;
+	rte_vhost_get_queue_num;
 	rte_vhost_get_vhost_vring;
 	rte_vhost_get_vring_num;
 	rte_vhost_gpa_to_vva;
 	rte_vhost_log_used_vring;
 	rte_vhost_log_write;
-
-} DPDK_16.07;
-
-DPDK_17.08 {
-	global:
-
 	rte_vhost_rx_queue_count;
-
-} DPDK_17.05;
-
-DPDK_18.02 {
-	global:
-
 	rte_vhost_vring_call;
 
-} DPDK_17.08;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
-- 
2.17.1

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions
  2019-11-08 17:12  5%     ` Ray Kinsella
@ 2019-11-08 17:38  5%       ` Thomas Monjalon
  2019-11-11 11:03  5%         ` Ray Kinsella
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-08 17:38 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole

08/11/2019 18:12, Ray Kinsella:
> On 08/11/2019 17:11, Thomas Monjalon wrote:
> > 08/11/2019 13:46, Ray Kinsella:
> >> +#. The ABI version is managed at a project level in DPDK, with the ABI version
> >> +   reflected in all library's soname.
> > 
> > It is not specifying the experimental lib exception.
> > But I can live without it.
> 
> I will fix in a follow up on Monday.

If you send a new version, please rebase as there was a change in master
with LTO series. Thanks




^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v9 4/4] doc: add maintainer for abi policy
  2019-11-08 12:46 13% ` [dpdk-dev] [PATCH v9 4/4] doc: add maintainer for abi policy Ray Kinsella
@ 2019-11-08 17:18  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-08 17:18 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole

08/11/2019 13:46, Ray Kinsella:
> Add an entry to the maintainer file for the abi policy.
> 
> Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
> Acked-by: John Mcnamara <john.mcnamara@intel.com>
> ---
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> +ABI Policy
> +M: Ray Kinsella <mdr@ashroe.eu>
> +F: doc/guides/contributing/abi_*.rst

If you are doing a new version, this patch can be squashed in the first one.

If you are doing a new version, please use --in-reply-to.



^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions
  2019-11-08 17:11  5%   ` Thomas Monjalon
@ 2019-11-08 17:12  5%     ` Ray Kinsella
  2019-11-08 17:38  5%       ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Ray Kinsella @ 2019-11-08 17:12 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole



On 08/11/2019 17:11, Thomas Monjalon wrote:
> 08/11/2019 13:46, Ray Kinsella:
>> This policy change introduces major ABI versions, these are
>> declared every year, typically aligned with the LTS release
>> and are supported by subsequent releases in the following year.
>> This change is intended to improve ABI stabilty for those projects
>> consuming DPDK.
>>
>> Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
>> Acked-by: John Mcnamara <john.mcnamara@intel.com>
>> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
> 
> Acked-by: Thomas Monjalon <thomas@monjalon.net>
> 
>> ---
>> +#. Major ABI versions are declared no more frequently than yearly. Compatibility
>> +   with the major ABI version is mandatory in subsequent releases until a new
>> +   major ABI version is declared.
>> +#. Major ABI version are usually but not always declared aligned with a
>> +   :ref:`LTS release <stable_lts_releases>`.
> 
> OK thanks
> 
>> +#. The ABI version is managed at a project level in DPDK, with the ABI version
>> +   reflected in all library's soname.
> 
> It is not specifying the experimental lib exception.
> But I can live without it.

I will fix in a follow up on Monday.

> 
>> +A new major ABI version is declared no more frequently than yearly, with
>> +declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
>> +Compatibility with the major ABI version is then mandatory in subsequent
>> +releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
>> +20.11.
> 
> OK thanks
> 
>> +   Note that, this policy details the method by which the ABI may be changed,
>> +   with due regard to preserving compatibility and observing deprecation
>> +   notices. This process however should not be undertaken lightly, as a general
>> +   rule ABI stability is extremely important for downstream consumers of DPDK.
>> +   The API should only be changed for significant reasons, such as performance
>> +   enhancements. API breakages due to changes such as reorganizing public
>> +   structure fields for aesthetic or readability purposes should be avoided.
> 
> OK thanks
> 
>> +Libraries marked as ``experimental`` are entirely not considered part of an ABI
>> +version, and may change without warning at any time. Experimental libraries
>> +always have a major version of ``0`` to indicate they exist outside of
>> +ABI Versioning, with the minor version incremented with each ABI change
>> +to library.
> 
> OK
> 
> 

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions
  2019-11-08 12:46 23% ` [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-08 17:11  5%   ` Thomas Monjalon
  2019-11-08 17:12  5%     ` Ray Kinsella
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-08 17:11 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole

08/11/2019 13:46, Ray Kinsella:
> This policy change introduces major ABI versions, these are
> declared every year, typically aligned with the LTS release
> and are supported by subsequent releases in the following year.
> This change is intended to improve ABI stabilty for those projects
> consuming DPDK.
> 
> Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
> Acked-by: John Mcnamara <john.mcnamara@intel.com>
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>

Acked-by: Thomas Monjalon <thomas@monjalon.net>

> ---
> +#. Major ABI versions are declared no more frequently than yearly. Compatibility
> +   with the major ABI version is mandatory in subsequent releases until a new
> +   major ABI version is declared.
> +#. Major ABI version are usually but not always declared aligned with a
> +   :ref:`LTS release <stable_lts_releases>`.

OK thanks

> +#. The ABI version is managed at a project level in DPDK, with the ABI version
> +   reflected in all library's soname.

It is not specifying the experimental lib exception.
But I can live without it.

> +A new major ABI version is declared no more frequently than yearly, with
> +declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
> +Compatibility with the major ABI version is then mandatory in subsequent
> +releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
> +20.11.

OK thanks

> +   Note that, this policy details the method by which the ABI may be changed,
> +   with due regard to preserving compatibility and observing deprecation
> +   notices. This process however should not be undertaken lightly, as a general
> +   rule ABI stability is extremely important for downstream consumers of DPDK.
> +   The API should only be changed for significant reasons, such as performance
> +   enhancements. API breakages due to changes such as reorganizing public
> +   structure fields for aesthetic or readability purposes should be avoided.

OK thanks

> +Libraries marked as ``experimental`` are entirely not considered part of an ABI
> +version, and may change without warning at any time. Experimental libraries
> +always have a major version of ``0`` to indicate they exist outside of
> +ABI Versioning, with the minor version incremented with each ABI change
> +to library.

OK



^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH] eventdev: reserve space in main structs for extension
@ 2019-11-08 16:56  4% jerinj
  2019-11-12  2:58  0% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: jerinj @ 2019-11-08 16:56 UTC (permalink / raw)
  To: dev, Jerin Jacob; +Cc: thomas

From: Jerin Jacob <jerinj@marvell.com>

The struct rte_eventdev and rte_eventdev_data are supposed
to be used internally only, but there is a chance that
increasing their size would break ABI for some applications.
In order to allow smooth addition of features without breaking
ABI compatibility, some space is reserved.

Signed-off-by: Jerin Jacob <jerinj@marvell.com>
---
 lib/librte_eventdev/rte_eventdev.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
index ced6f29d9..bc8952576 100644
--- a/lib/librte_eventdev/rte_eventdev.h
+++ b/lib/librte_eventdev/rte_eventdev.h
@@ -1282,6 +1282,8 @@ struct rte_eventdev_data {
 
 	char name[RTE_EVENTDEV_NAME_MAX_LEN];
 	/**< Unique identifier name */
+	uint64_t reserved_64s[4]; /**< Reserved for future fields */
+	void *reserved_ptrs[4]; /**< Reserved for future fields */
 } __rte_cache_aligned;
 
 /** @internal The data structure associated with each event device. */
@@ -1314,6 +1316,9 @@ struct rte_eventdev {
 	RTE_STD_C11
 	uint8_t attached : 1;
 	/**< Flag indicating the device is attached */
+
+	uint64_t reserved_64s[4]; /**< Reserved for future fields */
+	void *reserved_ptrs[4]; /**< Reserved for future fields */
 } __rte_cache_aligned;
 
 extern struct rte_eventdev *rte_eventdevs;
-- 
2.23.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 16:11  0%                     ` Dekel Peled
@ 2019-11-08 16:53  0%                       ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2019-11-08 16:53 UTC (permalink / raw)
  To: Dekel Peled, Matan Azrad, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

On 11/8/2019 4:11 PM, Dekel Peled wrote:
> Thanks, PSB.
> 
>> -----Original Message-----
>> From: Ferruh Yigit <ferruh.yigit@intel.com>
>> Sent: Friday, November 8, 2019 2:52 PM
>> To: Matan Azrad <matan@mellanox.com>; Dekel Peled
>> <dekelp@mellanox.com>; john.mcnamara@intel.com;
>> marko.kovacevic@intel.com; nhorman@tuxdriver.com;
>> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com;
>> anatoly.burakov@intel.com; xuanziyang2@huawei.com;
>> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com;
>> wenzhuo.lu@intel.com; konstantin.ananyev@intel.com; Shahaf Shuler
>> <shahafs@mellanox.com>; Slava Ovsiienko <viacheslavo@mellanox.com>;
>> rmody@marvell.com; shshaikh@marvell.com;
>> maxime.coquelin@redhat.com; tiwei.bie@intel.com;
>> zhihong.wang@intel.com; yongwang@vmware.com; Thomas Monjalon
>> <thomas@monjalon.net>; arybchenko@solarflare.com;
>> jingjing.wu@intel.com; bernard.iremonger@intel.com
>> Cc: dev@dpdk.org
>> Subject: Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO
>> packet size
>>
>> On 11/8/2019 11:56 AM, Matan Azrad wrote:
>>>
>>>
>>> From: Ferruh Yigit
>>>> On 11/8/2019 10:10 AM, Matan Azrad wrote:
>>>>>
>>>>>
>>>>> From: Ferruh Yigit
>>>>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
>>>>>>> Hi
>>>>>>>
>>>>>>> From: Ferruh Yigit
>>>>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
>>>>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>>>>>>>>>
>>>>>>>> 	RTE_ETHER_MAX_LEN;
>>>>>>>>>  	}
>>>>>>>>>
>>>>>>>>> +	/*
>>>>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
>>>> packet
>>>>>>>>> +	 * size is supported by the configured device.
>>>>>>>>> +	 */
>>>>>>>>> +	if (dev_conf->rxmode.offloads &
>>>> DEV_RX_OFFLOAD_TCP_LRO) {
>>>>>>>>> +		ret = check_lro_pkt_size(
>>>>>>>>> +				port_id, dev_conf-
>>>>>>>>> rxmode.max_lro_pkt_size,
>>>>>>>>> +				dev_info.max_lro_pkt_size);
>>>>>>>>> +		if (ret != 0)
>>>>>>>>> +			goto rollback;
>>>>>>>>> +	}
>>>>>>>>> +
>>>>>>>>
>>>>>>>> This check forces applications that enable LRO to provide
>>>>>> 'max_lro_pkt_size'
>>>>>>>> config value.
>>>>>>>
>>>>>>> Yes.(we can break an API, we noticed it)
>>>>>>
>>>>>> I am not talking about API/ABI breakage, that part is OK.
>>>>>> With this check, if the application requested LRO offload but not
>>>>>> provided 'max_lro_pkt_size' value, device configuration will fail.
>>>>>>
>>>>> Yes
>>>>>> Can there be a case application is good with whatever the PMD can
>>>>>> support as max?
>>>>> Yes can be - you know, we can do everything we want but it is better
>>>>> to be
>>>> consistent:
>>>>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
>>>>> offload, max
>>>> lro pkt len should be mandatory for LRO offload.
>>>>>
>>>>> So your question is actually why both, non-lro packets and LRO
>>>>> packets max
>>>> size are mandatory...
>>>>>
>>>>>
>>>>> I think it should be important values for net applications management.
>>>>> Also good for mbuf size managements.
>>>>>
>>>>>>>
>>>>>>>> - Why it is mandatory now, how it was working before if it is
>>>>>>>> mandatory value?
>>>>>>>
>>>>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
>>>>>>> frame
>>>>>> offload.
>>>>>>> So now, when the user configures a LRO offload he must to set max
>>>>>>> lro pkt
>>>>>> len.
>>>>>>> We don't want to confuse the user here with the max rx pkt len
>>>>>> configurations and behaviors, they should be with same logic.
>>>>>>>
>>>>>>> This parameter defines well the LRO behavior.
>>>>>>> Before this, each PMD took its own interpretation to what should
>>>>>>> be the
>>>>>> maximum size for LRO aggregated packets.
>>>>>>> Now, the user must say what is his intension, and the ethdev can
>>>>>>> limit it
>>>>>> according to the device capability.
>>>>>>> By this way, also, the PMD can organize\optimize its data-path more.
>>>>>>> Also, the application can create different mempools for LRO queues
>>>>>>> to
>>>>>> allow bigger packet receiving for LRO traffic.
>>>>>>>
>>>>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
>> '0'?
>>>>>>> Yes, you can see the feature description Dekel added.
>>>>>>> This patch also updates all the PMDs support an LRO for non-0 value.
>>>>>>
>>>>>> Of course I can see the updates Matan, my point is "What happens if
>>>>>> PMD doesn't provide 'max_lro_pkt_size'",
>>>>>> 1) There is no check for it right, so it is acceptable?
>>>>>
>>>>> There is check.
>>>>> If the capability is 0, any non-zero configuration will fail.
>>>>>
>>>>>> 2) Are we making this filed mandatory to provide for PMDs, it is
>>>>>> easy to make new fields mandatory for PMDs but is this really
>> necessary?
>>>>>
>>>>> Yes, for consistence.
>>>>>
>>>>>>>
>>>>>>> as same as max rx pkt len, no?
>>>>>>>
>>>>>>>> - What do you think setting 'max_lro_pkt_size' config value to
>>>>>>>> what PMD provided if application doesn't provide it?
>>>>>>> Same answers as above.
>>>>>>>
>>>>>>
>>>>>> If application doesn't care the value, as it has been till now, and
>>>>>> not provided explicit 'max_lro_pkt_size', why not ethdev level use
>>>>>> the value provided by PMD instead of failing?
>>>>>
>>>>> Again, same question we can ask on max rx pkt len.
>>>>>
>>>>> Looks like the packet size is very important value which should be
>>>>> set by
>>>> the application.
>>>>>
>>>>> Previous applications have no option to configure it, so they
>>>>> haven't
>>>> configure it, (probably cover it somehow) I think it is our miss to
>>>> supply this info.
>>>>>
>>>>> Let's do it in same way as we do max rx pkt len (as this patch main idea).
>>>>> Later, we can change both to other meaning.
>>>>>
>>>>
>>>> I think it is not a good reason to introduce a new mandatory config
>>>> option for application because of 'max_rx_pkt_len' does it.
>>>
>>> It is mandatory only if LRO offload is configured.
>>>
>>>> Will it work, if:
>>>> - If application doesn't provide this value, use the PMD max
>>>
>>> May cause a problem if the mbuf size is not enough for the PMD maximum.
>>
>> OK, this is what I was missing, for this case I was thinking max_rx_pkt_len will
>> be used but you already explained that application may want to use different
>> mempools for LRO queues.
>>
>> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
>> account and program the device accordingly (of course in LRO enabled case)
>> ?
>> This part seems missing and should be highlighted to other PMD maintainers.
>>
> 
> All relevant PMDs were modified and maintainers are copied on this patch series.
> 

What modified is PMD announcing a 'dev_info->max_lro_pkt_size' value, which is good.

But PMDs are not using user provided 'rxmode.max_lro_pkt_size' value, I assume
they are still using 'max_rx_pkt_len' to configure the device.

+1 to cc'ing maintainers, but everyone not able to follow all patches and not
sure if every maintainer read the patch and recognized they should update their
driver. I think better to highlight this things in cover letter / emails etc.
I hope it is more clear now.



Not for this patch, but generally;
As a process, previously I proposed a keeping a todo list under documentation
for PMDs for these kind of things, that each PMD maintainer can go there to
figure out what kind of changes required because of others changes, but that
didn't go in.
Other option is whoever updating library update all PMDs fully, but based on
feature it can be very hard to update others PMDs.

Overall these gaps are causing inconsistencies between PMDs and we need a proper
solution.


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 1/3] ethdev: support API to set max LRO packet size
  @ 2019-11-08 16:42  4%       ` Dekel Peled
  2019-11-10 23:07  0%         ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Dekel Peled @ 2019-11-08 16:42 UTC (permalink / raw)
  To: john.mcnamara, marko.kovacevic, nhorman, ajit.khaparde,
	somnath.kotur, anatoly.burakov, xuanziyang2, cloud.wangxiaoyun,
	zhouguoyang, wenzhuo.lu, konstantin.ananyev, matan, shahafs,
	viacheslavo, rmody, shshaikh, maxime.coquelin, tiwei.bie,
	zhihong.wang, yongwang, thomas, ferruh.yigit, arybchenko,
	jingjing.wu, bernard.iremonger
  Cc: dev

This patch implements [1], to support API for configuration and
validation of max size for LRO aggregated packet.
API change notice [2] is removed, and release notes for 19.11
are updated accordingly.

Various PMDs using LRO offload are updated, the new data members are
initialized to ensure they don't fail validation.

[1] http://patches.dpdk.org/patch/58217/
[2] http://patches.dpdk.org/patch/57492/

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Matan Azrad <matan@mellanox.com>
---
 doc/guides/nics/features.rst           |  2 ++
 doc/guides/rel_notes/deprecation.rst   |  4 ----
 doc/guides/rel_notes/release_19_11.rst |  8 +++++++
 drivers/net/bnxt/bnxt_ethdev.c         |  1 +
 drivers/net/hinic/hinic_pmd_ethdev.c   |  1 +
 drivers/net/ixgbe/ixgbe_ethdev.c       |  1 +
 drivers/net/mlx5/mlx5.h                |  3 +++
 drivers/net/mlx5/mlx5_ethdev.c         |  1 +
 drivers/net/mlx5/mlx5_rxq.c            |  1 -
 drivers/net/qede/qede_ethdev.c         |  1 +
 drivers/net/virtio/virtio_ethdev.c     |  1 +
 drivers/net/vmxnet3/vmxnet3_ethdev.c   |  1 +
 lib/librte_ethdev/rte_ethdev.c         | 44 ++++++++++++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h         |  4 ++++
 14 files changed, 68 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index 7a31cf7..2138ce3 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -193,10 +193,12 @@ LRO
 Supports Large Receive Offload.
 
 * **[uses]       rte_eth_rxconf,rte_eth_rxmode**: ``offloads:DEV_RX_OFFLOAD_TCP_LRO``.
+  ``dev_conf.rxmode.max_lro_pkt_size``.
 * **[implements] datapath**: ``LRO functionality``.
 * **[implements] rte_eth_dev_data**: ``lro``.
 * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
 * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
+* **[provides]   rte_eth_dev_info**: ``max_lro_pkt_size``.
 
 
 .. _nic_features_tso:
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index c10dc30..fdec33d 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -87,10 +87,6 @@ Deprecation Notices
   This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
   thereby improve Rx performance if application wishes do so.
 
-* ethdev: New 32-bit fields may be added for maximum LRO session size, in
-  struct ``rte_eth_dev_info`` for the port capability and in struct
-  ``rte_eth_rxmode`` for the port configuration.
-
 * cryptodev: support for using IV with all sizes is added, J0 still can
   be used but only when IV length in following structs ``rte_crypto_auth_xform``,
   ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index 87b7bd0..a3fc023 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -418,6 +418,14 @@ ABI Changes
   align the Ethernet header on receive and all known encapsulations
   preserve the alignment of the header.
 
+* ethdev: Added 32-bit fields for maximum LRO aggregated packet size, in
+  struct ``rte_eth_dev_info`` for the port capability and in struct
+  ``rte_eth_rxmode`` for the port configuration.
+  Application should use the new field in struct ``rte_eth_rxmode`` to configure
+  the requested size.
+  PMD should use the new field in struct ``rte_eth_dev_info`` to report the
+  supported port capability.
+
 
 Shared Library Versions
 -----------------------
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index b9b055e..741b897 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -519,6 +519,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	/* Fast path specifics */
 	dev_info->min_rx_bufsize = 1;
 	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
+	dev_info->max_lro_pkt_size = BNXT_MAX_PKT_LEN;
 
 	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
 	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED)
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 9f37a40..b33b2cf 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -727,6 +727,7 @@ static void hinic_get_speed_capa(struct rte_eth_dev *dev, uint32_t *speed_capa)
 	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
 	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
 	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
+	info->max_lro_pkt_size = HINIC_MAX_JUMBO_FRAME_SIZE;
 	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
 	info->min_mtu = HINIC_MIN_MTU_SIZE;
 	info->max_mtu = HINIC_MAX_MTU_SIZE;
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 30c0379..5719552 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3814,6 +3814,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	}
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL register */
 	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pkt_size = RTE_IPV4_MAX_PKT_LEN;
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
 	dev_info->max_vfs = pci_dev->max_vfs;
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index fab58c9..4783b5c 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -206,6 +206,9 @@ struct mlx5_hca_attr {
 #define MLX5_LRO_SUPPORTED(dev) \
 	(((struct mlx5_priv *)((dev)->data->dev_private))->config.lro.supported)
 
+/* Maximal size of aggregated LRO packet. */
+#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
+
 /* LRO configurations structure. */
 struct mlx5_lro_config {
 	uint32_t supported:1; /* Whether LRO is supported. */
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 2b7c867..3adc824 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -606,6 +606,7 @@ struct ethtool_link_settings {
 	/* FIXME: we should ask the device for these values. */
 	info->min_rx_bufsize = 32;
 	info->max_rx_pktlen = 65536;
+	info->max_lro_pkt_size = MLX5_MAX_LRO_SIZE;
 	/*
 	 * Since we need one CQ per QP, the limit is the minimum number
 	 * between the two values.
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 24d0eaa..9423e7b 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -1701,7 +1701,6 @@ struct mlx5_rxq_obj *
 	return 0;
 }
 
-#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
 #define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
 					sizeof(struct rte_vlan_hdr) * 2 + \
 					sizeof(struct rte_ipv6_hdr)))
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 575982f..ccbb8a4 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1277,6 +1277,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
 	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
 	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
+	dev_info->max_lro_pkt_size = (uint32_t)0x7FFF;
 	dev_info->rx_desc_lim = qede_rx_desc_lim;
 	dev_info->tx_desc_lim = qede_tx_desc_lim;
 
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 044eb10..22ce5a2 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -2435,6 +2435,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
 		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
 	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
 	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
+	dev_info->max_lro_pkt_size = VIRTIO_MAX_RX_PKTLEN;
 	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
 
 	host_features = VTPCI_OPS(hw)->get_features(hw);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index d1faeaa..d18e8bc 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1161,6 +1161,7 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)
 	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
 	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
 	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pkt_size = 16384;
 	dev_info->speed_capa = ETH_LINK_SPEED_10G;
 	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 652c369..c642ba5 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1136,6 +1136,26 @@ struct rte_eth_dev *
 	return name;
 }
 
+static inline int
+check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
+		   uint32_t dev_info_size)
+{
+	int ret = 0;
+
+	if (config_size > dev_info_size) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "> max allowed value %u\n", port_id, config_size,
+			       dev_info_size);
+		ret = -EINVAL;
+	} else if (config_size < RTE_ETHER_MIN_LEN) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "< min allowed value %u\n", port_id, config_size,
+			       (unsigned int)RTE_ETHER_MIN_LEN);
+		ret = -EINVAL;
+	}
+	return ret;
+}
+
 int
 rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
@@ -1266,6 +1286,18 @@ struct rte_eth_dev *
 							RTE_ETHER_MAX_LEN;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		ret = check_lro_pkt_size(
+				port_id, dev_conf->rxmode.max_lro_pkt_size,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			goto rollback;
+	}
+
 	/* Any requested offloading must be within its device capabilities */
 	if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) !=
 	     dev_conf->rxmode.offloads) {
@@ -1770,6 +1802,18 @@ struct rte_eth_dev *
 		return -EINVAL;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		int ret = check_lro_pkt_size(port_id,
+				dev->data->dev_conf.rxmode.max_lro_pkt_size,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			return ret;
+	}
+
 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
 					      socket_id, &local_conf, mp);
 	if (!ret) {
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 44d77b3..1b76df5 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -395,6 +395,8 @@ struct rte_eth_rxmode {
 	/** The multi-queue packet distribution mode to be used, e.g. RSS. */
 	enum rte_eth_rx_mq_mode mq_mode;
 	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME enabled. */
+	/** Maximum allowed size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
 	/**
 	 * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
@@ -1218,6 +1220,8 @@ struct rte_eth_dev_info {
 	const uint32_t *dev_flags; /**< Device flags */
 	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
 	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
+	/** Maximum configurable size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
 	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
 	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
-- 
1.8.3.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 16:08  0%                         ` Dekel Peled
@ 2019-11-08 16:28  0%                           ` Ananyev, Konstantin
  2019-11-09 18:26  0%                             ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-08 16:28 UTC (permalink / raw)
  To: Dekel Peled, Matan Azrad, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev


> >
> >
> > > > > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > > > >>>>>
> > > > > > >>>> 	RTE_ETHER_MAX_LEN;
> > > > > > >>>>>  	}
> > > > > > >>>>>
> > > > > > >>>>> +	/*
> > > > > > >>>>> +	 * If LRO is enabled, check that the maximum
> > aggregated
> > > > > > packet
> > > > > > >>>>> +	 * size is supported by the configured device.
> > > > > > >>>>> +	 */
> > > > > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > > > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > > > > >>>>> +		ret = check_lro_pkt_size(
> > > > > > >>>>> +				port_id, dev_conf-
> > > > > > >>>>> rxmode.max_lro_pkt_size,
> > > > > > >>>>> +				dev_info.max_lro_pkt_size);
> > > > > > >>>>> +		if (ret != 0)
> > > > > > >>>>> +			goto rollback;
> > > > > > >>>>> +	}
> > > > > > >>>>> +
> > > > > > >>>>
> > > > > > >>>> This check forces applications that enable LRO to provide
> > > > > > >> 'max_lro_pkt_size'
> > > > > > >>>> config value.
> > > > > > >>>
> > > > > > >>> Yes.(we can break an API, we noticed it)
> > > > > > >>
> > > > > > >> I am not talking about API/ABI breakage, that part is OK.
> > > > > > >> With this check, if the application requested LRO offload but
> > > > > > >> not provided 'max_lro_pkt_size' value, device configuration will
> > fail.
> > > > > > >>
> > > > > > > Yes
> > > > > > >> Can there be a case application is good with whatever the PMD
> > > > > > >> can support as max?
> > > > > > > Yes can be - you know, we can do everything we want but it is
> > > > > > > better to be
> > > > > > consistent:
> > > > > > > Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > > > > > > offload, max
> > > > > > lro pkt len should be mandatory for LRO offload.
> > > > > > >
> > > > > > > So your question is actually why both, non-lro packets and LRO
> > > > > > > packets max
> > > > > > size are mandatory...
> > > > > > >
> > > > > > >
> > > > > > > I think it should be important values for net applications
> > management.
> > > > > > > Also good for mbuf size managements.
> > > > > > >
> > > > > > >>>
> > > > > > >>>> - Why it is mandatory now, how it was working before if it
> > > > > > >>>> is mandatory value?
> > > > > > >>>
> > > > > > >>> It is the same as max_rx_pkt_len which is mandatory for
> > > > > > >>> jumbo frame
> > > > > > >> offload.
> > > > > > >>> So now, when the user configures a LRO offload he must to
> > > > > > >>> set max lro pkt
> > > > > > >> len.
> > > > > > >>> We don't want to confuse the user here with the max rx pkt
> > > > > > >>> len
> > > > > > >> configurations and behaviors, they should be with same logic.
> > > > > > >>>
> > > > > > >>> This parameter defines well the LRO behavior.
> > > > > > >>> Before this, each PMD took its own interpretation to what
> > > > > > >>> should be the
> > > > > > >> maximum size for LRO aggregated packets.
> > > > > > >>> Now, the user must say what is his intension, and the ethdev
> > > > > > >>> can limit it
> > > > > > >> according to the device capability.
> > > > > > >>> By this way, also, the PMD can organize\optimize its data-path
> > more.
> > > > > > >>> Also, the application can create different mempools for LRO
> > > > > > >>> queues to
> > > > > > >> allow bigger packet receiving for LRO traffic.
> > > > > > >>>
> > > > > > >>>> - What happens if PMD doesn't provide 'max_lro_pkt_size',
> > > > > > >>>> so it is
> > > > '0'?
> > > > > > >>> Yes, you can see the feature description Dekel added.
> > > > > > >>> This patch also updates all the PMDs support an LRO for non-0
> > value.
> > > > > > >>
> > > > > > >> Of course I can see the updates Matan, my point is "What
> > > > > > >> happens if PMD doesn't provide 'max_lro_pkt_size'",
> > > > > > >> 1) There is no check for it right, so it is acceptable?
> > > > > > >
> > > > > > > There is check.
> > > > > > > If the capability is 0, any non-zero configuration will fail.
> > > > > > >
> > > > > > >> 2) Are we making this filed mandatory to provide for PMDs, it
> > > > > > >> is easy to make new fields mandatory for PMDs but is this
> > > > > > >> really
> > > > necessary?
> > > > > > >
> > > > > > > Yes, for consistence.
> > > > > > >
> > > > > > >>>
> > > > > > >>> as same as max rx pkt len, no?
> > > > > > >>>
> > > > > > >>>> - What do you think setting 'max_lro_pkt_size' config value
> > > > > > >>>> to what PMD provided if application doesn't provide it?
> > > > > > >>> Same answers as above.
> > > > > > >>>
> > > > > > >>
> > > > > > >> If application doesn't care the value, as it has been till
> > > > > > >> now, and not provided explicit 'max_lro_pkt_size', why not
> > > > > > >> ethdev level use the value provided by PMD instead of failing?
> > > > > > >
> > > > > > > Again, same question we can ask on max rx pkt len.
> > > > > > >
> > > > > > > Looks like the packet size is very important value which
> > > > > > > should be set by
> > > > > > the application.
> > > > > > >
> > > > > > > Previous applications have no option to configure it, so they
> > > > > > > haven't
> > > > > > configure it, (probably cover it somehow) I think it is our miss
> > > > > > to supply this info.
> > > > > > >
> > > > > > > Let's do it in same way as we do max rx pkt len (as this patch main
> > idea).
> > > > > > > Later, we can change both to other meaning.
> > > > > > >
> > > > > >
> > > > > > I think it is not a good reason to introduce a new mandatory
> > > > > > config option for application because of 'max_rx_pkt_len' does it.
> > > > >
> > > > > It is mandatory only if LRO offload is configured.
> > > >
> > > > So max_rx_pkt_len will remain max size of one packet, while
> > > > max_lro_len will be max accumulate size for each LRO session?
> > > >
> > >
> > > Yes.
> > >
> > > > BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
> > >
> > > Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
> > > Change to RTE_IPV4_MAX_PKT_LEN?
> > >
> > > > ixgbe_vf, as I remember, doesn’t support LRO at all.
> > >
> > > Please see my change in drivers/net/ixgbe/ixgbe_vf_representor.c
> > > Remove it?
> >
> > Yes, please for both.
> 
> Will change in v5.
> 
> >
> > >
> > > >
> > > > >
> > > > > > Will it work, if:
> > > > > > - If application doesn't provide this value, use the PMD max
> > > > >
> > > > > May cause a problem if the mbuf size is not enough for the PMD
> > maximum.
> > > >
> > > > Another question, what will happen if PMD will ignore that value and
> > > > will generate packets bigger then requested?
> > >
> > > PMD should use this value and not ignore it.
> >
> > Hmm, ok but this patch updates mxl driver only...
> > I suppose you expect other PMD maintainers to do the job for their PMDs,
> > right?
> > If so, are they aware (and agree) for this new hard requirement and changes
> > required?
> > Again what PMD should do if it can't support exact value?
> > Let say user asked max_lro_size=20KB but PMD can do only 16KB or 24KB?
> > Should it fail, or round to smallest, or ...?
> >
> > Actually I wonder, should it really be a hard requirement or more like a
> > guidance to PMD?
> > Why app needs and *exact* value for LRO size?
> 
> The exact value should be configured to HW as LRO session limit.

But if the HW can't support this exact value, see the example above?
In fact, shouldn't we allow PMD to forbid user to configure max LRO size?
Let say if in dev_info max_lro_size==0, then PMD doesn't support LRO size
configuration at all.
That way PMDs who do support LRO, but don't want to (can't to)
support configurable LRO size will stay untouched.

> 
> >
> >
> > > >
> > > > >
> > > > > > - If both application and PMD doesn't provide this value, fail
> > > > > > on
> > > > configure()?
> > > > >
> > > > > It will work.
> > > > > In my opinion - not ideal.
> > > > >
> > > > > Matan
> > > > >


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v7 10/10] buildtools: add ABI versioning check script
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (9 preceding siblings ...)
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0 Anatoly Burakov
@ 2019-11-08 16:25 23%     ` Anatoly Burakov
  2019-11-19 18:16  8%       ` Thomas Monjalon
  10 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand, Pawel Modrak

From: Marcin Baran <marcinx.baran@intel.com>

Add a shell script that checks whether built libraries are
versioned with expected ABI (current ABI, current ABI + 1,
or EXPERIMENTAL).

The following command was used to verify current source tree
(assuming build directory is in ./build):

find ./build/lib ./build/drivers -name  \*.so \
	-exec ./buildtools/check-abi-version.sh {} \; -print

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - Moved this to the end of the patchset
    - Fixed bug when ABI symbols were not found because the .so
      did not declare any public symbols

 buildtools/check-abi-version.sh | 54 +++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100755 buildtools/check-abi-version.sh

diff --git a/buildtools/check-abi-version.sh b/buildtools/check-abi-version.sh
new file mode 100755
index 0000000000..29aea97735
--- /dev/null
+++ b/buildtools/check-abi-version.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+# Check whether library symbols have correct
+# version (provided ABI number or provided ABI
+# number + 1 or EXPERIMENTAL).
+# Args:
+#   $1: path of the library .so file
+#   $2: ABI major version number to check
+#       (defaults to ABI_VERSION file value)
+
+if [ -z "$1" ]; then
+    echo "Script checks whether library symbols have"
+    echo "correct version (ABI_VER/ABI_VER+1/EXPERIMENTAL)"
+    echo "Usage:"
+    echo "  $0 SO_FILE_PATH [ABI_VER]"
+    exit 1
+fi
+
+LIB="$1"
+DEFAULT_ABI=$(cat "$(dirname \
+            $(readlink -f $0))/../config/ABI_VERSION" | \
+            cut -d'.' -f 1)
+ABIVER="DPDK_${2-$DEFAULT_ABI}"
+NEXT_ABIVER="DPDK_$((${2-$DEFAULT_ABI}+1))"
+
+ret=0
+
+# get output of objdump
+OBJ_DUMP_OUTPUT=`objdump -TC --section=.text ${LIB} 2>&1 | grep ".text"`
+
+# there may not be any .text sections in the .so file, in which case exit early
+echo "${OBJ_DUMP_OUTPUT}" | grep "not found in any input file" -q
+if [ "$?" -eq 0 ]; then
+    exit 0
+fi
+
+# we have symbols, so let's see if the versions are correct
+for SYM in `echo "${OBJ_DUMP_OUTPUT}" | awk '{print $(NF-1) "-" $NF}'`
+do
+    version=$(echo $SYM | cut -d'-' -f 1)
+    symbol=$(echo $SYM | cut -d'-' -f 2)
+    case $version in (*"$ABIVER"*|*"$NEXT_ABIVER"*|"EXPERIMENTAL")
+        ;;
+    (*)
+        echo "Warning: symbol $symbol ($version) should be annotated " \
+             "as ABI version $ABIVER / $NEXT_ABIVER, or EXPERIMENTAL."
+        ret=1
+    ;;
+    esac
+done
+
+exit $ret
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v7 08/10] drivers/octeontx: add missing public symbol
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (7 preceding siblings ...)
  2019-11-08 16:25  6%     ` [dpdk-dev] [PATCH v7 07/10] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
@ 2019-11-08 16:25  3%     ` Anatoly Burakov
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0 Anatoly Burakov
  2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 10/10] buildtools: add ABI versioning check script Anatoly Burakov
  10 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Jerin Jacob, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand, pbhagavatula, stable

The logtype symbol was missing from the .map file. Add it.

Fixes: d8dd31652cf4 ("common/octeontx: move mbox to common folder")
Cc: pbhagavatula@caviumnetworks.com
Cc: stable@dpdk.org

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - add this patch to avoid compile breakage when bumping ABI

 drivers/common/octeontx/rte_common_octeontx_version.map | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/common/octeontx/rte_common_octeontx_version.map b/drivers/common/octeontx/rte_common_octeontx_version.map
index f04b3b7f8a..a9b3cff9bc 100644
--- a/drivers/common/octeontx/rte_common_octeontx_version.map
+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
@@ -1,6 +1,7 @@
 DPDK_18.05 {
 	global:
 
+	octeontx_logtype_mbox;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
 	octeontx_mbox_send;
-- 
2.17.1

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v7 07/10] distributor: rename v2.0 ABI to _single suffix
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (6 preceding siblings ...)
  2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 06/10] distributor: " Anatoly Burakov
@ 2019-11-08 16:25  6%     ` Anatoly Burakov
  2019-11-08 16:25  3%     ` [dpdk-dev] [PATCH v7 08/10] drivers/octeontx: add missing public symbol Anatoly Burakov
                       ` (2 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, David Hunt, john.mcnamara, ray.kinsella,
	bruce.richardson, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

The original ABI versioning was slightly misleading in that the
DPDK 2.0 ABI was really a single mode for the distributor, and is
used as such throughout the distributor code.

Fix this by renaming all _v20 API's to _single API's, and remove
symbol versioning.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
---

Notes:
    v4:
    - Changed it back to how it was with v2
    - Removed remaining v2.0 symbols
    
    v3:
    - Removed single mode from distributor as per Dave's comments
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_distributor/Makefile               |  2 +-
 lib/librte_distributor/distributor_private.h  | 10 +--
 lib/librte_distributor/meson.build            |  2 +-
 lib/librte_distributor/rte_distributor.c      | 24 +++----
 ...ributor_v20.c => rte_distributor_single.c} | 64 +++++++++----------
 ...ributor_v20.h => rte_distributor_single.h} | 26 ++++----
 .../rte_distributor_version.map               | 18 +-----
 7 files changed, 66 insertions(+), 80 deletions(-)
 rename lib/librte_distributor/{rte_distributor_v20.c => rte_distributor_single.c} (87%)
 rename lib/librte_distributor/{rte_distributor_v20.h => rte_distributor_single.h} (89%)

diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 0ef80dcff4..d9d0089166 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -15,7 +15,7 @@ EXPORT_MAP := rte_distributor_version.map
 LIBABIVER := 1
 
 # all source are stored in SRCS-y
-SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_v20.c
+SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_single.c
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor.c
 ifeq ($(CONFIG_RTE_ARCH_X86),y)
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor_match_sse.c
diff --git a/lib/librte_distributor/distributor_private.h b/lib/librte_distributor/distributor_private.h
index c89371123e..489aef2acb 100644
--- a/lib/librte_distributor/distributor_private.h
+++ b/lib/librte_distributor/distributor_private.h
@@ -55,7 +55,7 @@ extern "C" {
  * the next cache line to worker 0, we pad this out to three cache lines.
  * Only 64-bits of the memory is actually used though.
  */
-union rte_distributor_buffer_v20 {
+union rte_distributor_buffer_single {
 	volatile int64_t bufptr64;
 	char pad[RTE_CACHE_LINE_SIZE*3];
 } __rte_cache_aligned;
@@ -80,8 +80,8 @@ struct rte_distributor_returned_pkts {
 	struct rte_mbuf *mbufs[RTE_DISTRIB_MAX_RETURNS];
 };
 
-struct rte_distributor_v20 {
-	TAILQ_ENTRY(rte_distributor_v20) next;    /**< Next in list. */
+struct rte_distributor_single {
+	TAILQ_ENTRY(rte_distributor_single) next;    /**< Next in list. */
 
 	char name[RTE_DISTRIBUTOR_NAMESIZE];  /**< Name of the ring. */
 	unsigned int num_workers;             /**< Number of workers polling */
@@ -96,7 +96,7 @@ struct rte_distributor_v20 {
 
 	struct rte_distributor_backlog backlog[RTE_DISTRIB_MAX_WORKERS];
 
-	union rte_distributor_buffer_v20 bufs[RTE_DISTRIB_MAX_WORKERS];
+	union rte_distributor_buffer_single bufs[RTE_DISTRIB_MAX_WORKERS];
 
 	struct rte_distributor_returned_pkts returns;
 };
@@ -154,7 +154,7 @@ struct rte_distributor {
 
 	enum rte_distributor_match_function dist_match_fn;
 
-	struct rte_distributor_v20 *d_v20;
+	struct rte_distributor_single *d_single;
 };
 
 void
diff --git a/lib/librte_distributor/meson.build b/lib/librte_distributor/meson.build
index c9617d7b14..50b91887b5 100644
--- a/lib/librte_distributor/meson.build
+++ b/lib/librte_distributor/meson.build
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-sources = files('rte_distributor.c', 'rte_distributor_v20.c')
+sources = files('rte_distributor.c', 'rte_distributor_single.c')
 if arch_subdir == 'x86'
 	sources += files('rte_distributor_match_sse.c')
 else
diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index a4c8ff6a96..6c5b0c86e8 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -17,7 +17,7 @@
 #include <rte_tailq.h>
 
 #include "rte_distributor.h"
-#include "rte_distributor_v20.h"
+#include "rte_distributor_single.h"
 #include "distributor_private.h"
 
 TAILQ_HEAD(rte_dist_burst_list, rte_distributor);
@@ -42,7 +42,7 @@ rte_distributor_request_pkt(struct rte_distributor *d,
 	volatile int64_t *retptr64;
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
-		rte_distributor_request_pkt_v20(d->d_v20,
+		rte_distributor_request_pkt_single(d->d_single,
 			worker_id, oldpkt[0]);
 		return;
 	}
@@ -93,7 +93,8 @@ rte_distributor_poll_pkt(struct rte_distributor *d,
 	unsigned int i;
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
-		pkts[0] = rte_distributor_poll_pkt_v20(d->d_v20, worker_id);
+		pkts[0] = rte_distributor_poll_pkt_single(d->d_single,
+			worker_id);
 		return (pkts[0]) ? 1 : 0;
 	}
 
@@ -133,7 +134,7 @@ rte_distributor_get_pkt(struct rte_distributor *d,
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
 		if (return_count <= 1) {
-			pkts[0] = rte_distributor_get_pkt_v20(d->d_v20,
+			pkts[0] = rte_distributor_get_pkt_single(d->d_single,
 				worker_id, oldpkt[0]);
 			return (pkts[0]) ? 1 : 0;
 		} else
@@ -163,7 +164,7 @@ rte_distributor_return_pkt(struct rte_distributor *d,
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
 		if (num == 1)
-			return rte_distributor_return_pkt_v20(d->d_v20,
+			return rte_distributor_return_pkt_single(d->d_single,
 				worker_id, oldpkt[0]);
 		else
 			return -EINVAL;
@@ -354,7 +355,8 @@ rte_distributor_process(struct rte_distributor *d,
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_process_v20(d->d_v20, mbufs, num_mbufs);
+		return rte_distributor_process_single(d->d_single,
+			mbufs, num_mbufs);
 	}
 
 	if (unlikely(num_mbufs == 0)) {
@@ -494,7 +496,7 @@ rte_distributor_returned_pkts(struct rte_distributor *d,
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_returned_pkts_v20(d->d_v20,
+		return rte_distributor_returned_pkts_single(d->d_single,
 				mbufs, max_mbufs);
 	}
 
@@ -537,7 +539,7 @@ rte_distributor_flush(struct rte_distributor *d)
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_flush_v20(d->d_v20);
+		return rte_distributor_flush_single(d->d_single);
 	}
 
 	flushed = total_outstanding(d);
@@ -568,7 +570,7 @@ rte_distributor_clear_returns(struct rte_distributor *d)
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		rte_distributor_clear_returns_v20(d->d_v20);
+		rte_distributor_clear_returns_single(d->d_single);
 		return;
 	}
 
@@ -610,9 +612,9 @@ rte_distributor_create(const char *name,
 			rte_errno = ENOMEM;
 			return NULL;
 		}
-		d->d_v20 = rte_distributor_create_v20(name,
+		d->d_single = rte_distributor_create_single(name,
 				socket_id, num_workers);
-		if (d->d_v20 == NULL) {
+		if (d->d_single == NULL) {
 			free(d);
 			/* rte_errno will have been set */
 			return NULL;
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_single.c
similarity index 87%
rename from lib/librte_distributor/rte_distributor_v20.c
rename to lib/librte_distributor/rte_distributor_single.c
index 655944bdb3..91d8824c64 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_single.c
@@ -15,10 +15,10 @@
 #include <rte_pause.h>
 #include <rte_tailq.h>
 
-#include "rte_distributor_v20.h"
+#include "rte_distributor_single.h"
 #include "distributor_private.h"
 
-TAILQ_HEAD(rte_distributor_list, rte_distributor_v20);
+TAILQ_HEAD(rte_distributor_list, rte_distributor_single);
 
 static struct rte_tailq_elem rte_distributor_tailq = {
 	.name = "RTE_DISTRIBUTOR",
@@ -27,11 +27,11 @@ EAL_REGISTER_TAILQ(rte_distributor_tailq)
 
 /**** APIs called by workers ****/
 
-void __vsym
-rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
+void
+rte_distributor_request_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	int64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_GET_BUF;
 	while (unlikely(__atomic_load_n(&buf->bufptr64, __ATOMIC_RELAXED)
@@ -42,11 +42,11 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 }
 
-struct rte_mbuf * __vsym
-rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
+struct rte_mbuf *
+rte_distributor_poll_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	/* Sync with distributor. Acquire bufptr64. */
 	if (__atomic_load_n(&buf->bufptr64, __ATOMIC_ACQUIRE)
 		& RTE_DISTRIB_GET_BUF)
@@ -57,22 +57,22 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 	return (struct rte_mbuf *)((uintptr_t)ret);
 }
 
-struct rte_mbuf * __vsym
-rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
+struct rte_mbuf *
+rte_distributor_get_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
 	struct rte_mbuf *ret;
-	rte_distributor_request_pkt_v20(d, worker_id, oldpkt);
-	while ((ret = rte_distributor_poll_pkt_v20(d, worker_id)) == NULL)
+	rte_distributor_request_pkt_single(d, worker_id, oldpkt);
+	while ((ret = rte_distributor_poll_pkt_single(d, worker_id)) == NULL)
 		rte_pause();
 	return ret;
 }
 
-int __vsym
-rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
+int
+rte_distributor_return_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	uint64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_RETURN_BUF;
 	/* Sync with distributor on RETURN_BUF flag. */
@@ -104,7 +104,7 @@ backlog_pop(struct rte_distributor_backlog *bl)
 
 /* stores a packet returned from a worker inside the returns array */
 static inline void
-store_return(uintptr_t oldbuf, struct rte_distributor_v20 *d,
+store_return(uintptr_t oldbuf, struct rte_distributor_single *d,
 		unsigned *ret_start, unsigned *ret_count)
 {
 	/* store returns in a circular buffer - code is branch-free */
@@ -115,7 +115,7 @@ store_return(uintptr_t oldbuf, struct rte_distributor_v20 *d,
 }
 
 static inline void
-handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
+handle_worker_shutdown(struct rte_distributor_single *d, unsigned int wkr)
 {
 	d->in_flight_tags[wkr] = 0;
 	d->in_flight_bitmask &= ~(1UL << wkr);
@@ -146,7 +146,7 @@ handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
 		 * Note that the tags were set before first level call
 		 * to rte_distributor_process.
 		 */
-		rte_distributor_process_v20(d, pkts, i);
+		rte_distributor_process_single(d, pkts, i);
 		bl->count = bl->start = 0;
 	}
 }
@@ -156,7 +156,7 @@ handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
  * to do a partial flush.
  */
 static int
-process_returns(struct rte_distributor_v20 *d)
+process_returns(struct rte_distributor_single *d)
 {
 	unsigned wkr;
 	unsigned flushed = 0;
@@ -200,8 +200,8 @@ process_returns(struct rte_distributor_v20 *d)
 }
 
 /* process a set of packets to distribute them to workers */
-int __vsym
-rte_distributor_process_v20(struct rte_distributor_v20 *d,
+int
+rte_distributor_process_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned num_mbufs)
 {
 	unsigned next_idx = 0;
@@ -316,8 +316,8 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 }
 
 /* return to the caller, packets returned from workers */
-int __vsym
-rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
+int
+rte_distributor_returned_pkts_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned max_mbufs)
 {
 	struct rte_distributor_returned_pkts *returns = &d->returns;
@@ -339,7 +339,7 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
  * being worked on or queued up in a backlog.
  */
 static inline unsigned
-total_outstanding(const struct rte_distributor_v20 *d)
+total_outstanding(const struct rte_distributor_single *d)
 {
 	unsigned wkr, total_outstanding;
 
@@ -353,20 +353,20 @@ total_outstanding(const struct rte_distributor_v20 *d)
 
 /* flush the distributor, so that there are no outstanding packets in flight or
  * queued up. */
-int __vsym
-rte_distributor_flush_v20(struct rte_distributor_v20 *d)
+int
+rte_distributor_flush_single(struct rte_distributor_single *d)
 {
 	const unsigned flushed = total_outstanding(d);
 
 	while (total_outstanding(d) > 0)
-		rte_distributor_process_v20(d, NULL, 0);
+		rte_distributor_process_single(d, NULL, 0);
 
 	return flushed;
 }
 
 /* clears the internal returns array in the distributor */
-void __vsym
-rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
+void
+rte_distributor_clear_returns_single(struct rte_distributor_single *d)
 {
 	d->returns.start = d->returns.count = 0;
 #ifndef __OPTIMIZE__
@@ -375,12 +375,12 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 }
 
 /* creates a distributor instance */
-struct rte_distributor_v20 * __vsym
-rte_distributor_create_v20(const char *name,
+struct rte_distributor_single *
+rte_distributor_create_single(const char *name,
 		unsigned socket_id,
 		unsigned num_workers)
 {
-	struct rte_distributor_v20 *d;
+	struct rte_distributor_single *d;
 	struct rte_distributor_list *distributor_list;
 	char mz_name[RTE_MEMZONE_NAMESIZE];
 	const struct rte_memzone *mz;
diff --git a/lib/librte_distributor/rte_distributor_v20.h b/lib/librte_distributor/rte_distributor_single.h
similarity index 89%
rename from lib/librte_distributor/rte_distributor_v20.h
rename to lib/librte_distributor/rte_distributor_single.h
index 12865658ba..2f80aa43d1 100644
--- a/lib/librte_distributor/rte_distributor_v20.h
+++ b/lib/librte_distributor/rte_distributor_single.h
@@ -2,8 +2,8 @@
  * Copyright(c) 2010-2014 Intel Corporation
  */
 
-#ifndef _RTE_DISTRIB_V20_H_
-#define _RTE_DISTRIB_V20_H_
+#ifndef _RTE_DISTRIB_SINGLE_H_
+#define _RTE_DISTRIB_SINGLE_H_
 
 /**
  * @file
@@ -19,7 +19,7 @@ extern "C" {
 
 #define RTE_DISTRIBUTOR_NAMESIZE 32 /**< Length of name for instance */
 
-struct rte_distributor_v20;
+struct rte_distributor_single;
 struct rte_mbuf;
 
 /**
@@ -38,8 +38,8 @@ struct rte_mbuf;
  * @return
  *   The newly created distributor instance
  */
-struct rte_distributor_v20 *
-rte_distributor_create_v20(const char *name, unsigned int socket_id,
+struct rte_distributor_single *
+rte_distributor_create_single(const char *name, unsigned int socket_id,
 		unsigned int num_workers);
 
 /*  *** APIS to be called on the distributor lcore ***  */
@@ -74,7 +74,7 @@ rte_distributor_create_v20(const char *name, unsigned int socket_id,
  *   The number of mbufs processed.
  */
 int
-rte_distributor_process_v20(struct rte_distributor_v20 *d,
+rte_distributor_process_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs);
 
 /**
@@ -92,7 +92,7 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
  *   The number of mbufs returned in the mbufs array.
  */
 int
-rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
+rte_distributor_returned_pkts_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs);
 
 /**
@@ -107,7 +107,7 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
  *   The number of queued/in-flight packets that were completed by this call.
  */
 int
-rte_distributor_flush_v20(struct rte_distributor_v20 *d);
+rte_distributor_flush_single(struct rte_distributor_single *d);
 
 /**
  * Clears the array of returned packets used as the source for the
@@ -119,7 +119,7 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d);
  *   The distributor instance to be used
  */
 void
-rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d);
+rte_distributor_clear_returns_single(struct rte_distributor_single *d);
 
 /*  *** APIS to be called on the worker lcores ***  */
 /*
@@ -148,7 +148,7 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d);
  *   A new packet to be processed by the worker thread.
  */
 struct rte_mbuf *
-rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_get_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *oldpkt);
 
 /**
@@ -164,7 +164,7 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
  *   The previous packet being processed by the worker
  */
 int
-rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_return_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *mbuf);
 
 /**
@@ -188,7 +188,7 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
  *   The previous packet, if any, being processed by the worker
  */
 void
-rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_request_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *oldpkt);
 
 /**
@@ -208,7 +208,7 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
  *   packet is yet available.
  */
 struct rte_mbuf *
-rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_poll_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id);
 
 #ifdef __cplusplus
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
index 3a285b394e..00e26b4804 100644
--- a/lib/librte_distributor/rte_distributor_version.map
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -1,19 +1,3 @@
-DPDK_2.0 {
-	global:
-
-	rte_distributor_clear_returns;
-	rte_distributor_create;
-	rte_distributor_flush;
-	rte_distributor_get_pkt;
-	rte_distributor_poll_pkt;
-	rte_distributor_process;
-	rte_distributor_request_pkt;
-	rte_distributor_return_pkt;
-	rte_distributor_returned_pkts;
-
-	local: *;
-};
-
 DPDK_17.05 {
 	global:
 
@@ -26,4 +10,4 @@ DPDK_17.05 {
 	rte_distributor_request_pkt;
 	rte_distributor_return_pkt;
 	rte_distributor_returned_pkts;
-} DPDK_2.0;
+};
-- 
2.17.1

^ permalink raw reply	[relevance 6%]

* [dpdk-dev] [PATCH v7 06/10] distributor: remove deprecated code
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (5 preceding siblings ...)
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 05/10] lpm: " Anatoly Burakov
@ 2019-11-08 16:25  4%     ` Anatoly Burakov
  2019-11-08 16:25  6%     ` [dpdk-dev] [PATCH v7 07/10] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
                       ` (3 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, David Hunt, john.mcnamara, ray.kinsella,
	bruce.richardson, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
---

Notes:
    v5:
    - Fixed shared library linking error due to versioning still enabled
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_distributor/rte_distributor.c      | 74 +++++--------------
 .../rte_distributor_v1705.h                   | 61 ---------------
 lib/librte_distributor/rte_distributor_v20.c  |  9 ---
 3 files changed, 18 insertions(+), 126 deletions(-)
 delete mode 100644 lib/librte_distributor/rte_distributor_v1705.h

diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index 2cc32ddba2..a4c8ff6a96 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -18,7 +18,6 @@
 
 #include "rte_distributor.h"
 #include "rte_distributor_v20.h"
-#include "rte_distributor_v1705.h"
 #include "distributor_private.h"
 
 TAILQ_HEAD(rte_dist_burst_list, rte_distributor);
@@ -32,8 +31,8 @@ EAL_REGISTER_TAILQ(rte_dist_burst_tailq)
 
 /**** Burst Packet APIs called by workers ****/
 
-void __vsym
-rte_distributor_request_pkt_v1705(struct rte_distributor *d,
+void
+rte_distributor_request_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt,
 		unsigned int count)
 {
@@ -83,14 +82,9 @@ rte_distributor_request_pkt_v1705(struct rte_distributor *d,
 	__atomic_store_n(retptr64, *retptr64 | RTE_DISTRIB_GET_BUF,
 			__ATOMIC_RELEASE);
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_request_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(void rte_distributor_request_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt,
-		unsigned int count),
-		rte_distributor_request_pkt_v1705);
 
-int __vsym
-rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
+int
+rte_distributor_poll_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts)
 {
 	struct rte_distributor_buffer *buf = &d->bufs[worker_id];
@@ -129,13 +123,9 @@ rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
 
 	return count;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_poll_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_poll_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **pkts),
-		rte_distributor_poll_pkt_v1705);
 
-int __vsym
-rte_distributor_get_pkt_v1705(struct rte_distributor *d,
+int
+rte_distributor_get_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts,
 		struct rte_mbuf **oldpkt, unsigned int return_count)
 {
@@ -163,14 +153,9 @@ rte_distributor_get_pkt_v1705(struct rte_distributor *d,
 	}
 	return count;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_get_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_get_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **pkts,
-		struct rte_mbuf **oldpkt, unsigned int return_count),
-		rte_distributor_get_pkt_v1705);
 
-int __vsym
-rte_distributor_return_pkt_v1705(struct rte_distributor *d,
+int
+rte_distributor_return_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt, int num)
 {
 	struct rte_distributor_buffer *buf = &d->bufs[worker_id];
@@ -202,10 +187,6 @@ rte_distributor_return_pkt_v1705(struct rte_distributor *d,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_return_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_return_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt, int num),
-		rte_distributor_return_pkt_v1705);
 
 /**** APIs called on distributor core ***/
 
@@ -359,8 +340,8 @@ release(struct rte_distributor *d, unsigned int wkr)
 
 
 /* process a set of packets to distribute them to workers */
-int __vsym
-rte_distributor_process_v1705(struct rte_distributor *d,
+int
+rte_distributor_process(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs)
 {
 	unsigned int next_idx = 0;
@@ -500,14 +481,10 @@ rte_distributor_process_v1705(struct rte_distributor *d,
 
 	return num_mbufs;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_process, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_process(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int num_mbufs),
-		rte_distributor_process_v1705);
 
 /* return to the caller, packets returned from workers */
-int __vsym
-rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
+int
+rte_distributor_returned_pkts(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs)
 {
 	struct rte_distributor_returned_pkts *returns = &d->returns;
@@ -532,10 +509,6 @@ rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
 
 	return retval;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_returned_pkts, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_returned_pkts(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int max_mbufs),
-		rte_distributor_returned_pkts_v1705);
 
 /*
  * Return the number of packets in-flight in a distributor, i.e. packets
@@ -556,8 +529,8 @@ total_outstanding(const struct rte_distributor *d)
  * Flush the distributor, so that there are no outstanding packets in flight or
  * queued up.
  */
-int __vsym
-rte_distributor_flush_v1705(struct rte_distributor *d)
+int
+rte_distributor_flush(struct rte_distributor *d)
 {
 	unsigned int flushed;
 	unsigned int wkr;
@@ -586,13 +559,10 @@ rte_distributor_flush_v1705(struct rte_distributor *d)
 
 	return flushed;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_flush, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_flush(struct rte_distributor *d),
-		rte_distributor_flush_v1705);
 
 /* clears the internal returns array in the distributor */
-void __vsym
-rte_distributor_clear_returns_v1705(struct rte_distributor *d)
+void
+rte_distributor_clear_returns(struct rte_distributor *d)
 {
 	unsigned int wkr;
 
@@ -608,13 +578,10 @@ rte_distributor_clear_returns_v1705(struct rte_distributor *d)
 		__atomic_store_n(&(d->bufs[wkr].retptr64[0]), 0,
 				__ATOMIC_RELEASE);
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_clear_returns, _v1705, 17.05);
-MAP_STATIC_SYMBOL(void rte_distributor_clear_returns(struct rte_distributor *d),
-		rte_distributor_clear_returns_v1705);
 
 /* creates a distributor instance */
-struct rte_distributor * __vsym
-rte_distributor_create_v1705(const char *name,
+struct rte_distributor *
+rte_distributor_create(const char *name,
 		unsigned int socket_id,
 		unsigned int num_workers,
 		unsigned int alg_type)
@@ -688,8 +655,3 @@ rte_distributor_create_v1705(const char *name,
 
 	return d;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_create, _v1705, 17.05);
-MAP_STATIC_SYMBOL(struct rte_distributor *rte_distributor_create(
-		const char *name, unsigned int socket_id,
-		unsigned int num_workers, unsigned int alg_type),
-		rte_distributor_create_v1705);
diff --git a/lib/librte_distributor/rte_distributor_v1705.h b/lib/librte_distributor/rte_distributor_v1705.h
deleted file mode 100644
index df4d9e8150..0000000000
--- a/lib/librte_distributor/rte_distributor_v1705.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef _RTE_DISTRIB_V1705_H_
-#define _RTE_DISTRIB_V1705_H_
-
-/**
- * @file
- * RTE distributor
- *
- * The distributor is a component which is designed to pass packets
- * one-at-a-time to workers, with dynamic load balancing.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct rte_distributor *
-rte_distributor_create_v1705(const char *name, unsigned int socket_id,
-		unsigned int num_workers,
-		unsigned int alg_type);
-
-int
-rte_distributor_process_v1705(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int num_mbufs);
-
-int
-rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int max_mbufs);
-
-int
-rte_distributor_flush_v1705(struct rte_distributor *d);
-
-void
-rte_distributor_clear_returns_v1705(struct rte_distributor *d);
-
-int
-rte_distributor_get_pkt_v1705(struct rte_distributor *d,
-	unsigned int worker_id, struct rte_mbuf **pkts,
-	struct rte_mbuf **oldpkt, unsigned int retcount);
-
-int
-rte_distributor_return_pkt_v1705(struct rte_distributor *d,
-	unsigned int worker_id, struct rte_mbuf **oldpkt, int num);
-
-void
-rte_distributor_request_pkt_v1705(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt,
-		unsigned int count);
-
-int
-rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **mbufs);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_v20.c
index 7a6fddf556..655944bdb3 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_v20.c
@@ -41,7 +41,6 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 	/* Sync with distributor on GET_BUF flag. */
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 }
-VERSION_SYMBOL(rte_distributor_request_pkt, _v20, 2.0);
 
 struct rte_mbuf * __vsym
 rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
@@ -57,7 +56,6 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 	int64_t ret = buf->bufptr64 >> RTE_DISTRIB_FLAG_BITS;
 	return (struct rte_mbuf *)((uintptr_t)ret);
 }
-VERSION_SYMBOL(rte_distributor_poll_pkt, _v20, 2.0);
 
 struct rte_mbuf * __vsym
 rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
@@ -69,7 +67,6 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
 		rte_pause();
 	return ret;
 }
-VERSION_SYMBOL(rte_distributor_get_pkt, _v20, 2.0);
 
 int __vsym
 rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
@@ -82,7 +79,6 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 	return 0;
 }
-VERSION_SYMBOL(rte_distributor_return_pkt, _v20, 2.0);
 
 /**** APIs called on distributor core ***/
 
@@ -318,7 +314,6 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 	d->returns.count = ret_count;
 	return num_mbufs;
 }
-VERSION_SYMBOL(rte_distributor_process, _v20, 2.0);
 
 /* return to the caller, packets returned from workers */
 int __vsym
@@ -339,7 +334,6 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
 
 	return retval;
 }
-VERSION_SYMBOL(rte_distributor_returned_pkts, _v20, 2.0);
 
 /* return the number of packets in-flight in a distributor, i.e. packets
  * being worked on or queued up in a backlog.
@@ -369,7 +363,6 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d)
 
 	return flushed;
 }
-VERSION_SYMBOL(rte_distributor_flush, _v20, 2.0);
 
 /* clears the internal returns array in the distributor */
 void __vsym
@@ -380,7 +373,6 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 	memset(d->returns.mbufs, 0, sizeof(d->returns.mbufs));
 #endif
 }
-VERSION_SYMBOL(rte_distributor_clear_returns, _v20, 2.0);
 
 /* creates a distributor instance */
 struct rte_distributor_v20 * __vsym
@@ -424,4 +416,3 @@ rte_distributor_create_v20(const char *name,
 
 	return d;
 }
-VERSION_SYMBOL(rte_distributor_create, _v20, 2.0);
-- 
2.17.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v7 05/10] lpm: remove deprecated code
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (4 preceding siblings ...)
  2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 04/10] timer: remove deprecated code Anatoly Burakov
@ 2019-11-08 16:25  2%     ` Anatoly Burakov
  2019-11-19 21:43  0%       ` David Marchand
  2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 06/10] distributor: " Anatoly Burakov
                       ` (4 subsequent siblings)
  10 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Bruce Richardson, Vladimir Medvedkin,
	john.mcnamara, ray.kinsella, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_lpm/rte_lpm.c  | 1010 ++-----------------------------------
 lib/librte_lpm/rte_lpm.h  |   88 ----
 lib/librte_lpm/rte_lpm6.c |  140 +----
 lib/librte_lpm/rte_lpm6.h |   25 -
 4 files changed, 59 insertions(+), 1204 deletions(-)

diff --git a/lib/librte_lpm/rte_lpm.c b/lib/librte_lpm/rte_lpm.c
index 106916dc82..b78c487447 100644
--- a/lib/librte_lpm/rte_lpm.c
+++ b/lib/librte_lpm/rte_lpm.c
@@ -90,34 +90,8 @@ depth_to_range(uint8_t depth)
 /*
  * Find an existing lpm table and return a pointer to it.
  */
-struct rte_lpm_v20 * __vsym
-rte_lpm_find_existing_v20(const char *name)
-{
-	struct rte_lpm_v20 *l = NULL;
-	struct rte_tailq_entry *te;
-	struct rte_lpm_list *lpm_list;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	rte_mcfg_tailq_read_lock();
-	TAILQ_FOREACH(te, lpm_list, next) {
-		l = te->data;
-		if (strncmp(name, l->name, RTE_LPM_NAMESIZE) == 0)
-			break;
-	}
-	rte_mcfg_tailq_read_unlock();
-
-	if (te == NULL) {
-		rte_errno = ENOENT;
-		return NULL;
-	}
-
-	return l;
-}
-VERSION_SYMBOL(rte_lpm_find_existing, _v20, 2.0);
-
-struct rte_lpm * __vsym
-rte_lpm_find_existing_v1604(const char *name)
+struct rte_lpm *
+rte_lpm_find_existing(const char *name)
 {
 	struct rte_lpm *l = NULL;
 	struct rte_tailq_entry *te;
@@ -140,88 +114,12 @@ rte_lpm_find_existing_v1604(const char *name)
 
 	return l;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_find_existing, _v1604, 16.04);
-MAP_STATIC_SYMBOL(struct rte_lpm *rte_lpm_find_existing(const char *name),
-		rte_lpm_find_existing_v1604);
 
 /*
  * Allocates memory for LPM object
  */
-struct rte_lpm_v20 * __vsym
-rte_lpm_create_v20(const char *name, int socket_id, int max_rules,
-		__rte_unused int flags)
-{
-	char mem_name[RTE_LPM_NAMESIZE];
-	struct rte_lpm_v20 *lpm = NULL;
-	struct rte_tailq_entry *te;
-	uint32_t mem_size;
-	struct rte_lpm_list *lpm_list;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	RTE_BUILD_BUG_ON(sizeof(struct rte_lpm_tbl_entry_v20) != 2);
-
-	/* Check user arguments. */
-	if ((name == NULL) || (socket_id < -1) || (max_rules == 0)) {
-		rte_errno = EINVAL;
-		return NULL;
-	}
-
-	snprintf(mem_name, sizeof(mem_name), "LPM_%s", name);
-
-	/* Determine the amount of memory to allocate. */
-	mem_size = sizeof(*lpm) + (sizeof(lpm->rules_tbl[0]) * max_rules);
-
-	rte_mcfg_tailq_write_lock();
-
-	/* guarantee there's no existing */
-	TAILQ_FOREACH(te, lpm_list, next) {
-		lpm = te->data;
-		if (strncmp(name, lpm->name, RTE_LPM_NAMESIZE) == 0)
-			break;
-	}
-
-	if (te != NULL) {
-		lpm = NULL;
-		rte_errno = EEXIST;
-		goto exit;
-	}
-
-	/* allocate tailq entry */
-	te = rte_zmalloc("LPM_TAILQ_ENTRY", sizeof(*te), 0);
-	if (te == NULL) {
-		RTE_LOG(ERR, LPM, "Failed to allocate tailq entry\n");
-		rte_errno = ENOMEM;
-		goto exit;
-	}
-
-	/* Allocate memory to store the LPM data structures. */
-	lpm = rte_zmalloc_socket(mem_name, mem_size,
-			RTE_CACHE_LINE_SIZE, socket_id);
-	if (lpm == NULL) {
-		RTE_LOG(ERR, LPM, "LPM memory allocation failed\n");
-		rte_free(te);
-		rte_errno = ENOMEM;
-		goto exit;
-	}
-
-	/* Save user arguments. */
-	lpm->max_rules = max_rules;
-	strlcpy(lpm->name, name, sizeof(lpm->name));
-
-	te->data = lpm;
-
-	TAILQ_INSERT_TAIL(lpm_list, te, next);
-
-exit:
-	rte_mcfg_tailq_write_unlock();
-
-	return lpm;
-}
-VERSION_SYMBOL(rte_lpm_create, _v20, 2.0);
-
-struct rte_lpm * __vsym
-rte_lpm_create_v1604(const char *name, int socket_id,
+struct rte_lpm *
+rte_lpm_create(const char *name, int socket_id,
 		const struct rte_lpm_config *config)
 {
 	char mem_name[RTE_LPM_NAMESIZE];
@@ -321,45 +219,12 @@ rte_lpm_create_v1604(const char *name, int socket_id,
 
 	return lpm;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_create, _v1604, 16.04);
-MAP_STATIC_SYMBOL(
-	struct rte_lpm *rte_lpm_create(const char *name, int socket_id,
-			const struct rte_lpm_config *config), rte_lpm_create_v1604);
 
 /*
  * Deallocates memory for given LPM table.
  */
-void __vsym
-rte_lpm_free_v20(struct rte_lpm_v20 *lpm)
-{
-	struct rte_lpm_list *lpm_list;
-	struct rte_tailq_entry *te;
-
-	/* Check user arguments. */
-	if (lpm == NULL)
-		return;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	rte_mcfg_tailq_write_lock();
-
-	/* find our tailq entry */
-	TAILQ_FOREACH(te, lpm_list, next) {
-		if (te->data == (void *) lpm)
-			break;
-	}
-	if (te != NULL)
-		TAILQ_REMOVE(lpm_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	rte_free(lpm);
-	rte_free(te);
-}
-VERSION_SYMBOL(rte_lpm_free, _v20, 2.0);
-
-void __vsym
-rte_lpm_free_v1604(struct rte_lpm *lpm)
+void
+rte_lpm_free(struct rte_lpm *lpm)
 {
 	struct rte_lpm_list *lpm_list;
 	struct rte_tailq_entry *te;
@@ -387,9 +252,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm)
 	rte_free(lpm);
 	rte_free(te);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_free, _v1604, 16.04);
-MAP_STATIC_SYMBOL(void rte_lpm_free(struct rte_lpm *lpm),
-		rte_lpm_free_v1604);
 
 /*
  * Adds a rule to the rule table.
@@ -402,79 +264,7 @@ MAP_STATIC_SYMBOL(void rte_lpm_free(struct rte_lpm *lpm),
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static int32_t
-rule_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth,
-	uint8_t next_hop)
-{
-	uint32_t rule_gindex, rule_index, last_rule;
-	int i;
-
-	VERIFY_DEPTH(depth);
-
-	/* Scan through rule group to see if rule already exists. */
-	if (lpm->rule_info[depth - 1].used_rules > 0) {
-
-		/* rule_gindex stands for rule group index. */
-		rule_gindex = lpm->rule_info[depth - 1].first_rule;
-		/* Initialise rule_index to point to start of rule group. */
-		rule_index = rule_gindex;
-		/* Last rule = Last used rule in this rule group. */
-		last_rule = rule_gindex + lpm->rule_info[depth - 1].used_rules;
-
-		for (; rule_index < last_rule; rule_index++) {
-
-			/* If rule already exists update its next_hop and return. */
-			if (lpm->rules_tbl[rule_index].ip == ip_masked) {
-				lpm->rules_tbl[rule_index].next_hop = next_hop;
-
-				return rule_index;
-			}
-		}
-
-		if (rule_index == lpm->max_rules)
-			return -ENOSPC;
-	} else {
-		/* Calculate the position in which the rule will be stored. */
-		rule_index = 0;
-
-		for (i = depth - 1; i > 0; i--) {
-			if (lpm->rule_info[i - 1].used_rules > 0) {
-				rule_index = lpm->rule_info[i - 1].first_rule
-						+ lpm->rule_info[i - 1].used_rules;
-				break;
-			}
-		}
-		if (rule_index == lpm->max_rules)
-			return -ENOSPC;
-
-		lpm->rule_info[depth - 1].first_rule = rule_index;
-	}
-
-	/* Make room for the new rule in the array. */
-	for (i = RTE_LPM_MAX_DEPTH; i > depth; i--) {
-		if (lpm->rule_info[i - 1].first_rule
-				+ lpm->rule_info[i - 1].used_rules == lpm->max_rules)
-			return -ENOSPC;
-
-		if (lpm->rule_info[i - 1].used_rules > 0) {
-			lpm->rules_tbl[lpm->rule_info[i - 1].first_rule
-				+ lpm->rule_info[i - 1].used_rules]
-					= lpm->rules_tbl[lpm->rule_info[i - 1].first_rule];
-			lpm->rule_info[i - 1].first_rule++;
-		}
-	}
-
-	/* Add the new rule. */
-	lpm->rules_tbl[rule_index].ip = ip_masked;
-	lpm->rules_tbl[rule_index].next_hop = next_hop;
-
-	/* Increment the used rules counter for this rule group. */
-	lpm->rule_info[depth - 1].used_rules++;
-
-	return rule_index;
-}
-
-static int32_t
-rule_add_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
+rule_add(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 	uint32_t next_hop)
 {
 	uint32_t rule_gindex, rule_index, last_rule;
@@ -550,30 +340,7 @@ rule_add_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static void
-rule_delete_v20(struct rte_lpm_v20 *lpm, int32_t rule_index, uint8_t depth)
-{
-	int i;
-
-	VERIFY_DEPTH(depth);
-
-	lpm->rules_tbl[rule_index] =
-			lpm->rules_tbl[lpm->rule_info[depth - 1].first_rule
-				+ lpm->rule_info[depth - 1].used_rules - 1];
-
-	for (i = depth; i < RTE_LPM_MAX_DEPTH; i++) {
-		if (lpm->rule_info[i].used_rules > 0) {
-			lpm->rules_tbl[lpm->rule_info[i].first_rule - 1] =
-				lpm->rules_tbl[lpm->rule_info[i].first_rule
-					+ lpm->rule_info[i].used_rules - 1];
-			lpm->rule_info[i].first_rule--;
-		}
-	}
-
-	lpm->rule_info[depth - 1].used_rules--;
-}
-
-static void
-rule_delete_v1604(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
+rule_delete(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
 {
 	int i;
 
@@ -600,28 +367,7 @@ rule_delete_v1604(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static int32_t
-rule_find_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth)
-{
-	uint32_t rule_gindex, last_rule, rule_index;
-
-	VERIFY_DEPTH(depth);
-
-	rule_gindex = lpm->rule_info[depth - 1].first_rule;
-	last_rule = rule_gindex + lpm->rule_info[depth - 1].used_rules;
-
-	/* Scan used rules at given depth to find rule. */
-	for (rule_index = rule_gindex; rule_index < last_rule; rule_index++) {
-		/* If rule is found return the rule index. */
-		if (lpm->rules_tbl[rule_index].ip == ip_masked)
-			return rule_index;
-	}
-
-	/* If rule is not found return -EINVAL. */
-	return -EINVAL;
-}
-
-static int32_t
-rule_find_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
+rule_find(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
 {
 	uint32_t rule_gindex, last_rule, rule_index;
 
@@ -645,42 +391,7 @@ rule_find_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
  * Find, clean and allocate a tbl8.
  */
 static int32_t
-tbl8_alloc_v20(struct rte_lpm_tbl_entry_v20 *tbl8)
-{
-	uint32_t group_idx; /* tbl8 group index. */
-	struct rte_lpm_tbl_entry_v20 *tbl8_entry;
-
-	/* Scan through tbl8 to find a free (i.e. INVALID) tbl8 group. */
-	for (group_idx = 0; group_idx < RTE_LPM_TBL8_NUM_GROUPS;
-			group_idx++) {
-		tbl8_entry = &tbl8[group_idx * RTE_LPM_TBL8_GROUP_NUM_ENTRIES];
-		/* If a free tbl8 group is found clean it and set as VALID. */
-		if (!tbl8_entry->valid_group) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = INVALID,
-				.depth = 0,
-				.valid_group = VALID,
-			};
-			new_tbl8_entry.next_hop = 0;
-
-			memset(&tbl8_entry[0], 0,
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES *
-					sizeof(tbl8_entry[0]));
-
-			__atomic_store(tbl8_entry, &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-
-			/* Return group index for allocated tbl8 group. */
-			return group_idx;
-		}
-	}
-
-	/* If there are no tbl8 groups free then return error. */
-	return -ENOSPC;
-}
-
-static int32_t
-tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
+tbl8_alloc(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
 {
 	uint32_t group_idx; /* tbl8 group index. */
 	struct rte_lpm_tbl_entry *tbl8_entry;
@@ -714,22 +425,7 @@ tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
 }
 
 static void
-tbl8_free_v20(struct rte_lpm_tbl_entry_v20 *tbl8, uint32_t tbl8_group_start)
-{
-	/* Set tbl8 group invalid*/
-	struct rte_lpm_tbl_entry_v20 zero_tbl8_entry = {
-		.valid = INVALID,
-		.depth = 0,
-		.valid_group = INVALID,
-	};
-	zero_tbl8_entry.next_hop = 0;
-
-	__atomic_store(&tbl8[tbl8_group_start], &zero_tbl8_entry,
-			__ATOMIC_RELAXED);
-}
-
-static void
-tbl8_free_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
+tbl8_free(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
 {
 	/* Set tbl8 group invalid*/
 	struct rte_lpm_tbl_entry zero_tbl8_entry = {0};
@@ -739,78 +435,7 @@ tbl8_free_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
 }
 
 static __rte_noinline int32_t
-add_depth_small_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	uint32_t tbl24_index, tbl24_range, tbl8_index, tbl8_group_end, i, j;
-
-	/* Calculate the index into Table24. */
-	tbl24_index = ip >> 8;
-	tbl24_range = depth_to_range(depth);
-
-	for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-		/*
-		 * For invalid OR valid and non-extended tbl 24 entries set
-		 * entry.
-		 */
-		if (!lpm->tbl24[i].valid || (lpm->tbl24[i].valid_group == 0 &&
-				lpm->tbl24[i].depth <= depth)) {
-
-			struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-				.valid = VALID,
-				.valid_group = 0,
-				.depth = depth,
-			};
-			new_tbl24_entry.next_hop = next_hop;
-
-			/* Setting tbl24 entry in one go to avoid race
-			 * conditions
-			 */
-			__atomic_store(&lpm->tbl24[i], &new_tbl24_entry,
-					__ATOMIC_RELEASE);
-
-			continue;
-		}
-
-		if (lpm->tbl24[i].valid_group == 1) {
-			/* If tbl24 entry is valid and extended calculate the
-			 *  index into tbl8.
-			 */
-			tbl8_index = lpm->tbl24[i].group_idx *
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-			tbl8_group_end = tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-			for (j = tbl8_index; j < tbl8_group_end; j++) {
-				if (!lpm->tbl8[j].valid ||
-						lpm->tbl8[j].depth <= depth) {
-					struct rte_lpm_tbl_entry_v20
-						new_tbl8_entry = {
-						.valid = VALID,
-						.valid_group = VALID,
-						.depth = depth,
-					};
-					new_tbl8_entry.next_hop = next_hop;
-
-					/*
-					 * Setting tbl8 entry in one go to avoid
-					 * race conditions
-					 */
-					__atomic_store(&lpm->tbl8[j],
-						&new_tbl8_entry,
-						__ATOMIC_RELAXED);
-
-					continue;
-				}
-			}
-		}
-	}
-
-	return 0;
-}
-
-static __rte_noinline int32_t
-add_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+add_depth_small(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
 #define group_idx next_hop
@@ -882,150 +507,7 @@ add_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 }
 
 static __rte_noinline int32_t
-add_depth_big_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth,
-		uint8_t next_hop)
-{
-	uint32_t tbl24_index;
-	int32_t tbl8_group_index, tbl8_group_start, tbl8_group_end, tbl8_index,
-		tbl8_range, i;
-
-	tbl24_index = (ip_masked >> 8);
-	tbl8_range = depth_to_range(depth);
-
-	if (!lpm->tbl24[tbl24_index].valid) {
-		/* Search for a free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v20(lpm->tbl8);
-
-		/* Check tbl8 allocation was successful. */
-		if (tbl8_group_index < 0) {
-			return tbl8_group_index;
-		}
-
-		/* Find index into tbl8 and range. */
-		tbl8_index = (tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES) +
-				(ip_masked & 0xFF);
-
-		/* Set tbl8 entry. */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop = next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		/*
-		 * Update tbl24 entry to point to new tbl8 entry. Note: The
-		 * ext_flag and tbl8_index need to be updated simultaneously,
-		 * so assign whole structure in one go
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.group_idx = (uint8_t)tbl8_group_index,
-			.valid = VALID,
-			.valid_group = 1,
-			.depth = 0,
-		};
-
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
-
-	} /* If valid entry but not extended calculate the index into Table8. */
-	else if (lpm->tbl24[tbl24_index].valid_group == 0) {
-		/* Search for free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v20(lpm->tbl8);
-
-		if (tbl8_group_index < 0) {
-			return tbl8_group_index;
-		}
-
-		tbl8_group_start = tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-		tbl8_group_end = tbl8_group_start +
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-		/* Populate new tbl8 with tbl24 value. */
-		for (i = tbl8_group_start; i < tbl8_group_end; i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = lpm->tbl24[tbl24_index].depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop =
-				lpm->tbl24[tbl24_index].next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-
-		/* Insert new rule into the tbl8 entry. */
-		for (i = tbl8_index; i < tbl8_index + tbl8_range; i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop = next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		/*
-		 * Update tbl24 entry to point to new tbl8 entry. Note: The
-		 * ext_flag and tbl8_index need to be updated simultaneously,
-		 * so assign whole structure in one go.
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-				.group_idx = (uint8_t)tbl8_group_index,
-				.valid = VALID,
-				.valid_group = 1,
-				.depth = 0,
-		};
-
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
-
-	} else { /*
-		* If it is valid, extended entry calculate the index into tbl8.
-		*/
-		tbl8_group_index = lpm->tbl24[tbl24_index].group_idx;
-		tbl8_group_start = tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-
-			if (!lpm->tbl8[i].valid ||
-					lpm->tbl8[i].depth <= depth) {
-				struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-					.valid = VALID,
-					.depth = depth,
-					.valid_group = lpm->tbl8[i].valid_group,
-				};
-				new_tbl8_entry.next_hop = next_hop;
-				/*
-				 * Setting tbl8 entry in one go to avoid race
-				 * condition
-				 */
-				__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
-
-				continue;
-			}
-		}
-	}
-
-	return 0;
-}
-
-static __rte_noinline int32_t
-add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
+add_depth_big(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 		uint32_t next_hop)
 {
 #define group_idx next_hop
@@ -1038,7 +520,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 
 	if (!lpm->tbl24[tbl24_index].valid) {
 		/* Search for a free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);
+		tbl8_group_index = tbl8_alloc(lpm->tbl8, lpm->number_tbl8s);
 
 		/* Check tbl8 allocation was successful. */
 		if (tbl8_group_index < 0) {
@@ -1084,7 +566,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 	} /* If valid entry but not extended calculate the index into Table8. */
 	else if (lpm->tbl24[tbl24_index].valid_group == 0) {
 		/* Search for free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);
+		tbl8_group_index = tbl8_alloc(lpm->tbl8, lpm->number_tbl8s);
 
 		if (tbl8_group_index < 0) {
 			return tbl8_group_index;
@@ -1177,49 +659,8 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 /*
  * Add a route
  */
-int __vsym
-rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	int32_t rule_index, status = 0;
-	uint32_t ip_masked;
-
-	/* Check user arguments. */
-	if ((lpm == NULL) || (depth < 1) || (depth > RTE_LPM_MAX_DEPTH))
-		return -EINVAL;
-
-	ip_masked = ip & depth_to_mask(depth);
-
-	/* Add the rule to the rule table. */
-	rule_index = rule_add_v20(lpm, ip_masked, depth, next_hop);
-
-	/* If the is no space available for new rule return error. */
-	if (rule_index < 0) {
-		return rule_index;
-	}
-
-	if (depth <= MAX_DEPTH_TBL24) {
-		status = add_depth_small_v20(lpm, ip_masked, depth, next_hop);
-	} else { /* If depth > RTE_LPM_MAX_DEPTH_TBL24 */
-		status = add_depth_big_v20(lpm, ip_masked, depth, next_hop);
-
-		/*
-		 * If add fails due to exhaustion of tbl8 extensions delete
-		 * rule that was added to rule table.
-		 */
-		if (status < 0) {
-			rule_delete_v20(lpm, rule_index, depth);
-
-			return status;
-		}
-	}
-
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm_add, _v20, 2.0);
-
-int __vsym
-rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+int
+rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
 	int32_t rule_index, status = 0;
@@ -1232,7 +673,7 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 	ip_masked = ip & depth_to_mask(depth);
 
 	/* Add the rule to the rule table. */
-	rule_index = rule_add_v1604(lpm, ip_masked, depth, next_hop);
+	rule_index = rule_add(lpm, ip_masked, depth, next_hop);
 
 	/* If the is no space available for new rule return error. */
 	if (rule_index < 0) {
@@ -1240,16 +681,16 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 	}
 
 	if (depth <= MAX_DEPTH_TBL24) {
-		status = add_depth_small_v1604(lpm, ip_masked, depth, next_hop);
+		status = add_depth_small(lpm, ip_masked, depth, next_hop);
 	} else { /* If depth > RTE_LPM_MAX_DEPTH_TBL24 */
-		status = add_depth_big_v1604(lpm, ip_masked, depth, next_hop);
+		status = add_depth_big(lpm, ip_masked, depth, next_hop);
 
 		/*
 		 * If add fails due to exhaustion of tbl8 extensions delete
 		 * rule that was added to rule table.
 		 */
 		if (status < 0) {
-			rule_delete_v1604(lpm, rule_index, depth);
+			rule_delete(lpm, rule_index, depth);
 
 			return status;
 		}
@@ -1257,42 +698,12 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_add, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_add(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth, uint32_t next_hop), rte_lpm_add_v1604);
 
 /*
  * Look for a rule in the high-level rules table
  */
-int __vsym
-rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-uint8_t *next_hop)
-{
-	uint32_t ip_masked;
-	int32_t rule_index;
-
-	/* Check user arguments. */
-	if ((lpm == NULL) ||
-		(next_hop == NULL) ||
-		(depth < 1) || (depth > RTE_LPM_MAX_DEPTH))
-		return -EINVAL;
-
-	/* Look for the rule using rule_find. */
-	ip_masked = ip & depth_to_mask(depth);
-	rule_index = rule_find_v20(lpm, ip_masked, depth);
-
-	if (rule_index >= 0) {
-		*next_hop = lpm->rules_tbl[rule_index].next_hop;
-		return 1;
-	}
-
-	/* If rule is not found return 0. */
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm_is_rule_present, _v20, 2.0);
-
-int __vsym
-rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+int
+rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop)
 {
 	uint32_t ip_masked;
@@ -1306,7 +717,7 @@ uint32_t *next_hop)
 
 	/* Look for the rule using rule_find. */
 	ip_masked = ip & depth_to_mask(depth);
-	rule_index = rule_find_v1604(lpm, ip_masked, depth);
+	rule_index = rule_find(lpm, ip_masked, depth);
 
 	if (rule_index >= 0) {
 		*next_hop = lpm->rules_tbl[rule_index].next_hop;
@@ -1316,12 +727,9 @@ uint32_t *next_hop)
 	/* If rule is not found return 0. */
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_is_rule_present, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth, uint32_t *next_hop), rte_lpm_is_rule_present_v1604);
 
 static int32_t
-find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
+find_previous_rule(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint8_t *sub_rule_depth)
 {
 	int32_t rule_index;
@@ -1331,7 +739,7 @@ find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 	for (prev_depth = (uint8_t)(depth - 1); prev_depth > 0; prev_depth--) {
 		ip_masked = ip & depth_to_mask(prev_depth);
 
-		rule_index = rule_find_v20(lpm, ip_masked, prev_depth);
+		rule_index = rule_find(lpm, ip_masked, prev_depth);
 
 		if (rule_index >= 0) {
 			*sub_rule_depth = prev_depth;
@@ -1343,133 +751,7 @@ find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 }
 
 static int32_t
-find_previous_rule_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-		uint8_t *sub_rule_depth)
-{
-	int32_t rule_index;
-	uint32_t ip_masked;
-	uint8_t prev_depth;
-
-	for (prev_depth = (uint8_t)(depth - 1); prev_depth > 0; prev_depth--) {
-		ip_masked = ip & depth_to_mask(prev_depth);
-
-		rule_index = rule_find_v1604(lpm, ip_masked, prev_depth);
-
-		if (rule_index >= 0) {
-			*sub_rule_depth = prev_depth;
-			return rule_index;
-		}
-	}
-
-	return -1;
-}
-
-static int32_t
-delete_depth_small_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked,
-	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
-{
-	uint32_t tbl24_range, tbl24_index, tbl8_group_index, tbl8_index, i, j;
-
-	/* Calculate the range and index into Table24. */
-	tbl24_range = depth_to_range(depth);
-	tbl24_index = (ip_masked >> 8);
-
-	/*
-	 * Firstly check the sub_rule_index. A -1 indicates no replacement rule
-	 * and a positive number indicates a sub_rule_index.
-	 */
-	if (sub_rule_index < 0) {
-		/*
-		 * If no replacement rule exists then invalidate entries
-		 * associated with this rule.
-		 */
-		for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-
-			if (lpm->tbl24[i].valid_group == 0 &&
-					lpm->tbl24[i].depth <= depth) {
-				struct rte_lpm_tbl_entry_v20
-					zero_tbl24_entry = {
-						.valid = INVALID,
-						.depth = 0,
-						.valid_group = 0,
-					};
-					zero_tbl24_entry.next_hop = 0;
-				__atomic_store(&lpm->tbl24[i],
-					&zero_tbl24_entry, __ATOMIC_RELEASE);
-			} else if (lpm->tbl24[i].valid_group == 1) {
-				/*
-				 * If TBL24 entry is extended, then there has
-				 * to be a rule with depth >= 25 in the
-				 * associated TBL8 group.
-				 */
-
-				tbl8_group_index = lpm->tbl24[i].group_idx;
-				tbl8_index = tbl8_group_index *
-						RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-				for (j = tbl8_index; j < (tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
-
-					if (lpm->tbl8[j].depth <= depth)
-						lpm->tbl8[j].valid = INVALID;
-				}
-			}
-		}
-	} else {
-		/*
-		 * If a replacement rule exists then modify entries
-		 * associated with this rule.
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.next_hop = lpm->rules_tbl[sub_rule_index].next_hop,
-			.valid = VALID,
-			.valid_group = 0,
-			.depth = sub_rule_depth,
-		};
-
-		struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-			.valid = VALID,
-			.valid_group = VALID,
-			.depth = sub_rule_depth,
-		};
-		new_tbl8_entry.next_hop =
-				lpm->rules_tbl[sub_rule_index].next_hop;
-
-		for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-
-			if (lpm->tbl24[i].valid_group == 0 &&
-					lpm->tbl24[i].depth <= depth) {
-				__atomic_store(&lpm->tbl24[i], &new_tbl24_entry,
-						__ATOMIC_RELEASE);
-			} else  if (lpm->tbl24[i].valid_group == 1) {
-				/*
-				 * If TBL24 entry is extended, then there has
-				 * to be a rule with depth >= 25 in the
-				 * associated TBL8 group.
-				 */
-
-				tbl8_group_index = lpm->tbl24[i].group_idx;
-				tbl8_index = tbl8_group_index *
-						RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-				for (j = tbl8_index; j < (tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
-
-					if (lpm->tbl8[j].depth <= depth)
-						__atomic_store(&lpm->tbl8[j],
-							&new_tbl8_entry,
-							__ATOMIC_RELAXED);
-				}
-			}
-		}
-	}
-
-	return 0;
-}
-
-static int32_t
-delete_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
+delete_depth_small(struct rte_lpm *lpm, uint32_t ip_masked,
 	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
 {
 #define group_idx next_hop
@@ -1576,7 +858,7 @@ delete_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
  * thus can be recycled
  */
 static int32_t
-tbl8_recycle_check_v20(struct rte_lpm_tbl_entry_v20 *tbl8,
+tbl8_recycle_check(struct rte_lpm_tbl_entry *tbl8,
 		uint32_t tbl8_group_start)
 {
 	uint32_t tbl8_group_end, i;
@@ -1623,140 +905,7 @@ tbl8_recycle_check_v20(struct rte_lpm_tbl_entry_v20 *tbl8,
 }
 
 static int32_t
-tbl8_recycle_check_v1604(struct rte_lpm_tbl_entry *tbl8,
-		uint32_t tbl8_group_start)
-{
-	uint32_t tbl8_group_end, i;
-	tbl8_group_end = tbl8_group_start + RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-	/*
-	 * Check the first entry of the given tbl8. If it is invalid we know
-	 * this tbl8 does not contain any rule with a depth < RTE_LPM_MAX_DEPTH
-	 *  (As they would affect all entries in a tbl8) and thus this table
-	 *  can not be recycled.
-	 */
-	if (tbl8[tbl8_group_start].valid) {
-		/*
-		 * If first entry is valid check if the depth is less than 24
-		 * and if so check the rest of the entries to verify that they
-		 * are all of this depth.
-		 */
-		if (tbl8[tbl8_group_start].depth <= MAX_DEPTH_TBL24) {
-			for (i = (tbl8_group_start + 1); i < tbl8_group_end;
-					i++) {
-
-				if (tbl8[i].depth !=
-						tbl8[tbl8_group_start].depth) {
-
-					return -EEXIST;
-				}
-			}
-			/* If all entries are the same return the tb8 index */
-			return tbl8_group_start;
-		}
-
-		return -EEXIST;
-	}
-	/*
-	 * If the first entry is invalid check if the rest of the entries in
-	 * the tbl8 are invalid.
-	 */
-	for (i = (tbl8_group_start + 1); i < tbl8_group_end; i++) {
-		if (tbl8[i].valid)
-			return -EEXIST;
-	}
-	/* If no valid entries are found then return -EINVAL. */
-	return -EINVAL;
-}
-
-static int32_t
-delete_depth_big_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked,
-	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
-{
-	uint32_t tbl24_index, tbl8_group_index, tbl8_group_start, tbl8_index,
-			tbl8_range, i;
-	int32_t tbl8_recycle_index;
-
-	/*
-	 * Calculate the index into tbl24 and range. Note: All depths larger
-	 * than MAX_DEPTH_TBL24 are associated with only one tbl24 entry.
-	 */
-	tbl24_index = ip_masked >> 8;
-
-	/* Calculate the index into tbl8 and range. */
-	tbl8_group_index = lpm->tbl24[tbl24_index].group_idx;
-	tbl8_group_start = tbl8_group_index * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-	tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-	tbl8_range = depth_to_range(depth);
-
-	if (sub_rule_index < 0) {
-		/*
-		 * Loop through the range of entries on tbl8 for which the
-		 * rule_to_delete must be removed or modified.
-		 */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (lpm->tbl8[i].depth <= depth)
-				lpm->tbl8[i].valid = INVALID;
-		}
-	} else {
-		/* Set new tbl8 entry. */
-		struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-			.valid = VALID,
-			.depth = sub_rule_depth,
-			.valid_group = lpm->tbl8[tbl8_group_start].valid_group,
-		};
-
-		new_tbl8_entry.next_hop =
-				lpm->rules_tbl[sub_rule_index].next_hop;
-		/*
-		 * Loop through the range of entries on tbl8 for which the
-		 * rule_to_delete must be modified.
-		 */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (lpm->tbl8[i].depth <= depth)
-				__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
-		}
-	}
-
-	/*
-	 * Check if there are any valid entries in this tbl8 group. If all
-	 * tbl8 entries are invalid we can free the tbl8 and invalidate the
-	 * associated tbl24 entry.
-	 */
-
-	tbl8_recycle_index = tbl8_recycle_check_v20(lpm->tbl8, tbl8_group_start);
-
-	if (tbl8_recycle_index == -EINVAL) {
-		/* Set tbl24 before freeing tbl8 to avoid race condition.
-		 * Prevent the free of the tbl8 group from hoisting.
-		 */
-		lpm->tbl24[tbl24_index].valid = 0;
-		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v20(lpm->tbl8, tbl8_group_start);
-	} else if (tbl8_recycle_index > -1) {
-		/* Update tbl24 entry. */
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.next_hop = lpm->tbl8[tbl8_recycle_index].next_hop,
-			.valid = VALID,
-			.valid_group = 0,
-			.depth = lpm->tbl8[tbl8_recycle_index].depth,
-		};
-
-		/* Set tbl24 before freeing tbl8 to avoid race condition.
-		 * Prevent the free of the tbl8 group from hoisting.
-		 */
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELAXED);
-		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v20(lpm->tbl8, tbl8_group_start);
-	}
-
-	return 0;
-}
-
-static int32_t
-delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
+delete_depth_big(struct rte_lpm *lpm, uint32_t ip_masked,
 	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
 {
 #define group_idx next_hop
@@ -1811,7 +960,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 	 * associated tbl24 entry.
 	 */
 
-	tbl8_recycle_index = tbl8_recycle_check_v1604(lpm->tbl8, tbl8_group_start);
+	tbl8_recycle_index = tbl8_recycle_check(lpm->tbl8, tbl8_group_start);
 
 	if (tbl8_recycle_index == -EINVAL) {
 		/* Set tbl24 before freeing tbl8 to avoid race condition.
@@ -1819,7 +968,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 		 */
 		lpm->tbl24[tbl24_index].valid = 0;
 		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v1604(lpm->tbl8, tbl8_group_start);
+		tbl8_free(lpm->tbl8, tbl8_group_start);
 	} else if (tbl8_recycle_index > -1) {
 		/* Update tbl24 entry. */
 		struct rte_lpm_tbl_entry new_tbl24_entry = {
@@ -1835,7 +984,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
 				__ATOMIC_RELAXED);
 		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v1604(lpm->tbl8, tbl8_group_start);
+		tbl8_free(lpm->tbl8, tbl8_group_start);
 	}
 #undef group_idx
 	return 0;
@@ -1844,8 +993,8 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 /*
  * Deletes a rule
  */
-int __vsym
-rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
+int
+rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
 {
 	int32_t rule_to_delete_index, sub_rule_index;
 	uint32_t ip_masked;
@@ -1864,7 +1013,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 	 * Find the index of the input rule, that needs to be deleted, in the
 	 * rule table.
 	 */
-	rule_to_delete_index = rule_find_v20(lpm, ip_masked, depth);
+	rule_to_delete_index = rule_find(lpm, ip_masked, depth);
 
 	/*
 	 * Check if rule_to_delete_index was found. If no rule was found the
@@ -1874,7 +1023,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 		return -EINVAL;
 
 	/* Delete the rule from the rule table. */
-	rule_delete_v20(lpm, rule_to_delete_index, depth);
+	rule_delete(lpm, rule_to_delete_index, depth);
 
 	/*
 	 * Find rule to replace the rule_to_delete. If there is no rule to
@@ -1882,100 +1031,26 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 	 * entries associated with this rule.
 	 */
 	sub_rule_depth = 0;
-	sub_rule_index = find_previous_rule_v20(lpm, ip, depth, &sub_rule_depth);
+	sub_rule_index = find_previous_rule(lpm, ip, depth, &sub_rule_depth);
 
 	/*
 	 * If the input depth value is less than 25 use function
 	 * delete_depth_small otherwise use delete_depth_big.
 	 */
 	if (depth <= MAX_DEPTH_TBL24) {
-		return delete_depth_small_v20(lpm, ip_masked, depth,
+		return delete_depth_small(lpm, ip_masked, depth,
 				sub_rule_index, sub_rule_depth);
 	} else { /* If depth > MAX_DEPTH_TBL24 */
-		return delete_depth_big_v20(lpm, ip_masked, depth, sub_rule_index,
+		return delete_depth_big(lpm, ip_masked, depth, sub_rule_index,
 				sub_rule_depth);
 	}
 }
-VERSION_SYMBOL(rte_lpm_delete, _v20, 2.0);
-
-int __vsym
-rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
-{
-	int32_t rule_to_delete_index, sub_rule_index;
-	uint32_t ip_masked;
-	uint8_t sub_rule_depth;
-	/*
-	 * Check input arguments. Note: IP must be a positive integer of 32
-	 * bits in length therefore it need not be checked.
-	 */
-	if ((lpm == NULL) || (depth < 1) || (depth > RTE_LPM_MAX_DEPTH)) {
-		return -EINVAL;
-	}
-
-	ip_masked = ip & depth_to_mask(depth);
-
-	/*
-	 * Find the index of the input rule, that needs to be deleted, in the
-	 * rule table.
-	 */
-	rule_to_delete_index = rule_find_v1604(lpm, ip_masked, depth);
-
-	/*
-	 * Check if rule_to_delete_index was found. If no rule was found the
-	 * function rule_find returns -EINVAL.
-	 */
-	if (rule_to_delete_index < 0)
-		return -EINVAL;
-
-	/* Delete the rule from the rule table. */
-	rule_delete_v1604(lpm, rule_to_delete_index, depth);
-
-	/*
-	 * Find rule to replace the rule_to_delete. If there is no rule to
-	 * replace the rule_to_delete we return -1 and invalidate the table
-	 * entries associated with this rule.
-	 */
-	sub_rule_depth = 0;
-	sub_rule_index = find_previous_rule_v1604(lpm, ip, depth, &sub_rule_depth);
-
-	/*
-	 * If the input depth value is less than 25 use function
-	 * delete_depth_small otherwise use delete_depth_big.
-	 */
-	if (depth <= MAX_DEPTH_TBL24) {
-		return delete_depth_small_v1604(lpm, ip_masked, depth,
-				sub_rule_index, sub_rule_depth);
-	} else { /* If depth > MAX_DEPTH_TBL24 */
-		return delete_depth_big_v1604(lpm, ip_masked, depth, sub_rule_index,
-				sub_rule_depth);
-	}
-}
-BIND_DEFAULT_SYMBOL(rte_lpm_delete, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth), rte_lpm_delete_v1604);
 
 /*
  * Delete all rules from the LPM table.
  */
-void __vsym
-rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm)
-{
-	/* Zero rule information. */
-	memset(lpm->rule_info, 0, sizeof(lpm->rule_info));
-
-	/* Zero tbl24. */
-	memset(lpm->tbl24, 0, sizeof(lpm->tbl24));
-
-	/* Zero tbl8. */
-	memset(lpm->tbl8, 0, sizeof(lpm->tbl8));
-
-	/* Delete all rules form the rules table. */
-	memset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);
-}
-VERSION_SYMBOL(rte_lpm_delete_all, _v20, 2.0);
-
-void __vsym
-rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
+void
+rte_lpm_delete_all(struct rte_lpm *lpm)
 {
 	/* Zero rule information. */
 	memset(lpm->rule_info, 0, sizeof(lpm->rule_info));
@@ -1990,6 +1065,3 @@ rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
 	/* Delete all rules form the rules table. */
 	memset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_delete_all, _v1604, 16.04);
-MAP_STATIC_SYMBOL(void rte_lpm_delete_all(struct rte_lpm *lpm),
-		rte_lpm_delete_all_v1604);
diff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h
index 26303e6288..b9d49ac879 100644
--- a/lib/librte_lpm/rte_lpm.h
+++ b/lib/librte_lpm/rte_lpm.h
@@ -64,31 +64,6 @@ extern "C" {
 
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
 /** @internal Tbl24 entry structure. */
-__extension__
-struct rte_lpm_tbl_entry_v20 {
-	/**
-	 * Stores Next hop (tbl8 or tbl24 when valid_group is not set) or
-	 * a group index pointing to a tbl8 structure (tbl24 only, when
-	 * valid_group is set)
-	 */
-	RTE_STD_C11
-	union {
-		uint8_t next_hop;
-		uint8_t group_idx;
-	};
-	/* Using single uint8_t to store 3 values. */
-	uint8_t valid     :1;   /**< Validation flag. */
-	/**
-	 * For tbl24:
-	 *  - valid_group == 0: entry stores a next hop
-	 *  - valid_group == 1: entry stores a group_index pointing to a tbl8
-	 * For tbl8:
-	 *  - valid_group indicates whether the current tbl8 is in use or not
-	 */
-	uint8_t valid_group :1;
-	uint8_t depth       :6; /**< Rule depth. */
-} __rte_aligned(sizeof(uint16_t));
-
 __extension__
 struct rte_lpm_tbl_entry {
 	/**
@@ -111,16 +86,6 @@ struct rte_lpm_tbl_entry {
 };
 
 #else
-__extension__
-struct rte_lpm_tbl_entry_v20 {
-	uint8_t depth       :6;
-	uint8_t valid_group :1;
-	uint8_t valid       :1;
-	union {
-		uint8_t group_idx;
-		uint8_t next_hop;
-	};
-} __rte_aligned(sizeof(uint16_t));
 
 __extension__
 struct rte_lpm_tbl_entry {
@@ -141,11 +106,6 @@ struct rte_lpm_config {
 };
 
 /** @internal Rule structure. */
-struct rte_lpm_rule_v20 {
-	uint32_t ip; /**< Rule IP address. */
-	uint8_t  next_hop; /**< Rule next hop. */
-};
-
 struct rte_lpm_rule {
 	uint32_t ip; /**< Rule IP address. */
 	uint32_t next_hop; /**< Rule next hop. */
@@ -158,21 +118,6 @@ struct rte_lpm_rule_info {
 };
 
 /** @internal LPM structure. */
-struct rte_lpm_v20 {
-	/* LPM metadata. */
-	char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
-	uint32_t max_rules; /**< Max. balanced rules per lpm. */
-	struct rte_lpm_rule_info rule_info[RTE_LPM_MAX_DEPTH]; /**< Rule info table. */
-
-	/* LPM Tables. */
-	struct rte_lpm_tbl_entry_v20 tbl24[RTE_LPM_TBL24_NUM_ENTRIES]
-			__rte_cache_aligned; /**< LPM tbl24 table. */
-	struct rte_lpm_tbl_entry_v20 tbl8[RTE_LPM_TBL8_NUM_ENTRIES]
-			__rte_cache_aligned; /**< LPM tbl8 table. */
-	struct rte_lpm_rule_v20 rules_tbl[]
-			__rte_cache_aligned; /**< LPM rules. */
-};
-
 struct rte_lpm {
 	/* LPM metadata. */
 	char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
@@ -209,11 +154,6 @@ struct rte_lpm {
 struct rte_lpm *
 rte_lpm_create(const char *name, int socket_id,
 		const struct rte_lpm_config *config);
-struct rte_lpm_v20 *
-rte_lpm_create_v20(const char *name, int socket_id, int max_rules, int flags);
-struct rte_lpm *
-rte_lpm_create_v1604(const char *name, int socket_id,
-		const struct rte_lpm_config *config);
 
 /**
  * Find an existing LPM object and return a pointer to it.
@@ -227,10 +167,6 @@ rte_lpm_create_v1604(const char *name, int socket_id,
  */
 struct rte_lpm *
 rte_lpm_find_existing(const char *name);
-struct rte_lpm_v20 *
-rte_lpm_find_existing_v20(const char *name);
-struct rte_lpm *
-rte_lpm_find_existing_v1604(const char *name);
 
 /**
  * Free an LPM object.
@@ -242,10 +178,6 @@ rte_lpm_find_existing_v1604(const char *name);
  */
 void
 rte_lpm_free(struct rte_lpm *lpm);
-void
-rte_lpm_free_v20(struct rte_lpm_v20 *lpm);
-void
-rte_lpm_free_v1604(struct rte_lpm *lpm);
 
 /**
  * Add a rule to the LPM table.
@@ -263,12 +195,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm);
  */
 int
 rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint32_t next_hop);
-int
-rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop);
-int
-rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-		uint32_t next_hop);
 
 /**
  * Check if a rule is present in the LPM table,
@@ -288,12 +214,6 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 int
 rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop);
-int
-rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-uint8_t *next_hop);
-int
-rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-uint32_t *next_hop);
 
 /**
  * Delete a rule from the LPM table.
@@ -309,10 +229,6 @@ uint32_t *next_hop);
  */
 int
 rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
-int
-rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth);
-int
-rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
 
 /**
  * Delete all rules from the LPM table.
@@ -322,10 +238,6 @@ rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
  */
 void
 rte_lpm_delete_all(struct rte_lpm *lpm);
-void
-rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm);
-void
-rte_lpm_delete_all_v1604(struct rte_lpm *lpm);
 
 /**
  * Lookup an IP into the LPM table.
diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c
index 0d161dc327..c46e557e23 100644
--- a/lib/librte_lpm/rte_lpm6.c
+++ b/lib/librte_lpm/rte_lpm6.c
@@ -809,18 +809,6 @@ add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl,
 	return 1;
 }
 
-/*
- * Add a route
- */
-int __vsym
-rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	return rte_lpm6_add_v1705(lpm, ip, depth, next_hop);
-}
-VERSION_SYMBOL(rte_lpm6_add, _v20, 2.0);
-
-
 /*
  * Simulate adding a route to LPM
  *
@@ -842,7 +830,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 
 	/* Inspect the first three bytes through tbl24 on the first step. */
 	ret = simulate_add_step(lpm, lpm->tbl24, &tbl_next, masked_ip,
-			ADD_FIRST_BYTE, 1, depth, &need_tbl_nb);
+		ADD_FIRST_BYTE, 1, depth, &need_tbl_nb);
 	total_need_tbl_nb = need_tbl_nb;
 	/*
 	 * Inspect one by one the rest of the bytes until
@@ -851,7 +839,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && ret == 1; i++) {
 		tbl = tbl_next;
 		ret = simulate_add_step(lpm, tbl, &tbl_next, masked_ip, 1,
-				(uint8_t)(i+1), depth, &need_tbl_nb);
+			(uint8_t)(i + 1), depth, &need_tbl_nb);
 		total_need_tbl_nb += need_tbl_nb;
 	}
 
@@ -862,9 +850,12 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	return 0;
 }
 
-int __vsym
-rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t next_hop)
+/*
+ * Add a route
+ */
+int
+rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
+	uint32_t next_hop)
 {
 	struct rte_lpm6_tbl_entry *tbl;
 	struct rte_lpm6_tbl_entry *tbl_next = NULL;
@@ -896,8 +887,8 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 	/* Inspect the first three bytes through tbl24 on the first step. */
 	tbl = lpm->tbl24;
 	status = add_step(lpm, tbl, TBL24_IND, &tbl_next, &tbl_next_num,
-			masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop,
-			is_new_rule);
+		masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop,
+		is_new_rule);
 	assert(status >= 0);
 
 	/*
@@ -907,17 +898,13 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 	for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && status == 1; i++) {
 		tbl = tbl_next;
 		status = add_step(lpm, tbl, tbl_next_num, &tbl_next,
-				&tbl_next_num, masked_ip, 1, (uint8_t)(i+1),
-				depth, next_hop, is_new_rule);
+			&tbl_next_num, masked_ip, 1, (uint8_t)(i + 1),
+			depth, next_hop, is_new_rule);
 		assert(status >= 0);
 	}
 
 	return status;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_add, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip,
-				uint8_t depth, uint32_t next_hop),
-		rte_lpm6_add_v1705);
 
 /*
  * Takes a pointer to a table entry and inspect one level.
@@ -955,26 +942,8 @@ lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl,
 /*
  * Looks up an IP
  */
-int __vsym
-rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop)
-{
-	uint32_t next_hop32 = 0;
-	int32_t status;
-
-	/* DEBUG: Check user input arguments. */
-	if (next_hop == NULL)
-		return -EINVAL;
-
-	status = rte_lpm6_lookup_v1705(lpm, ip, &next_hop32);
-	if (status == 0)
-		*next_hop = (uint8_t)next_hop32;
-
-	return status;
-}
-VERSION_SYMBOL(rte_lpm6_lookup, _v20, 2.0);
-
-int __vsym
-rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
+int
+rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
 		uint32_t *next_hop)
 {
 	const struct rte_lpm6_tbl_entry *tbl;
@@ -1001,56 +970,12 @@ rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
 
 	return status;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_lookup, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
-				uint32_t *next_hop), rte_lpm6_lookup_v1705);
 
 /*
  * Looks up a group of IP addresses
  */
-int __vsym
-rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int16_t * next_hops, unsigned n)
-{
-	unsigned i;
-	const struct rte_lpm6_tbl_entry *tbl;
-	const struct rte_lpm6_tbl_entry *tbl_next = NULL;
-	uint32_t tbl24_index, next_hop;
-	uint8_t first_byte;
-	int status;
-
-	/* DEBUG: Check user input arguments. */
-	if ((lpm == NULL) || (ips == NULL) || (next_hops == NULL))
-		return -EINVAL;
-
-	for (i = 0; i < n; i++) {
-		first_byte = LOOKUP_FIRST_BYTE;
-		tbl24_index = (ips[i][0] << BYTES2_SIZE) |
-				(ips[i][1] << BYTE_SIZE) | ips[i][2];
-
-		/* Calculate pointer to the first entry to be inspected */
-		tbl = &lpm->tbl24[tbl24_index];
-
-		do {
-			/* Continue inspecting following levels until success or failure */
-			status = lookup_step(lpm, tbl, &tbl_next, ips[i], first_byte++,
-					&next_hop);
-			tbl = tbl_next;
-		} while (status == 1);
-
-		if (status < 0)
-			next_hops[i] = -1;
-		else
-			next_hops[i] = (int16_t)next_hop;
-	}
-
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm6_lookup_bulk_func, _v20, 2.0);
-
-int __vsym
-rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
+int
+rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n)
 {
@@ -1090,37 +1015,12 @@ rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_lookup_bulk_func, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
-				uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-				int32_t *next_hops, unsigned int n),
-		rte_lpm6_lookup_bulk_func_v1705);
 
 /*
  * Look for a rule in the high-level rules table
  */
-int __vsym
-rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t *next_hop)
-{
-	uint32_t next_hop32 = 0;
-	int32_t status;
-
-	/* DEBUG: Check user input arguments. */
-	if (next_hop == NULL)
-		return -EINVAL;
-
-	status = rte_lpm6_is_rule_present_v1705(lpm, ip, depth, &next_hop32);
-	if (status > 0)
-		*next_hop = (uint8_t)next_hop32;
-
-	return status;
-
-}
-VERSION_SYMBOL(rte_lpm6_is_rule_present, _v20, 2.0);
-
-int __vsym
-rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
+int
+rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop)
 {
 	uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE];
@@ -1136,10 +1036,6 @@ rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 
 	return rule_find(lpm, masked_ip, depth, next_hop);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_is_rule_present, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_is_rule_present(struct rte_lpm6 *lpm,
-				uint8_t *ip, uint8_t depth, uint32_t *next_hop),
-		rte_lpm6_is_rule_present_v1705);
 
 /*
  * Delete a rule from the rule table.
diff --git a/lib/librte_lpm/rte_lpm6.h b/lib/librte_lpm/rte_lpm6.h
index 5d59ccb1fe..37dfb20249 100644
--- a/lib/librte_lpm/rte_lpm6.h
+++ b/lib/librte_lpm/rte_lpm6.h
@@ -96,12 +96,6 @@ rte_lpm6_free(struct rte_lpm6 *lpm);
 int
 rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t next_hop);
-int
-rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t next_hop);
-int
-rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t next_hop);
 
 /**
  * Check if a rule is present in the LPM table,
@@ -121,12 +115,6 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 int
 rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop);
-int
-rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t *next_hop);
-int
-rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t *next_hop);
 
 /**
  * Delete a rule from the LPM table.
@@ -184,11 +172,6 @@ rte_lpm6_delete_all(struct rte_lpm6 *lpm);
  */
 int
 rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip, uint32_t *next_hop);
-int
-rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop);
-int
-rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
-		uint32_t *next_hop);
 
 /**
  * Lookup multiple IP addresses in an LPM table.
@@ -210,14 +193,6 @@ int
 rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n);
-int
-rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int16_t *next_hops, unsigned int n);
-int
-rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int32_t *next_hops, unsigned int n);
 
 #ifdef __cplusplus
 }
-- 
2.17.1

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v7 04/10] timer: remove deprecated code
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (3 preceding siblings ...)
  2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script Anatoly Burakov
@ 2019-11-08 16:25  4%     ` Anatoly Burakov
  2019-11-19 21:42  0%       ` David Marchand
  2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 05/10] lpm: " Anatoly Burakov
                       ` (5 subsequent siblings)
  10 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Robert Sanford, Erik Gabriel Carrillo,
	john.mcnamara, ray.kinsella, bruce.richardson, thomas,
	david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
---

Notes:
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_timer/rte_timer.c | 100 ++++-------------------------------
 lib/librte_timer/rte_timer.h |  15 ------
 2 files changed, 10 insertions(+), 105 deletions(-)

diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c
index 381a9f43f8..ca88454ff6 100644
--- a/lib/librte_timer/rte_timer.c
+++ b/lib/librte_timer/rte_timer.c
@@ -68,9 +68,6 @@ static struct rte_timer_data *rte_timer_data_arr;
 static const uint32_t default_data_id;
 static uint32_t rte_timer_subsystem_initialized;
 
-/* For maintaining older interfaces for a period */
-static struct rte_timer_data default_timer_data;
-
 /* when debug is enabled, store some statistics */
 #ifdef RTE_LIBRTE_TIMER_DEBUG
 #define __TIMER_STAT_ADD(priv_timer, name, n) do {			\
@@ -131,30 +128,14 @@ rte_timer_data_dealloc(uint32_t id)
 	return 0;
 }
 
-void __vsym
-rte_timer_subsystem_init_v20(void)
-{
-	unsigned lcore_id;
-	struct priv_timer *priv_timer = default_timer_data.priv_timer;
-
-	/* since priv_timer is static, it's zeroed by default, so only init some
-	 * fields.
-	 */
-	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++) {
-		rte_spinlock_init(&priv_timer[lcore_id].list_lock);
-		priv_timer[lcore_id].prev_lcore = lcore_id;
-	}
-}
-VERSION_SYMBOL(rte_timer_subsystem_init, _v20, 2.0);
-
 /* Init the timer library. Allocate an array of timer data structs in shared
  * memory, and allocate the zeroth entry for use with original timer
  * APIs. Since the intersection of the sets of lcore ids in primary and
  * secondary processes should be empty, the zeroth entry can be shared by
  * multiple processes.
  */
-int __vsym
-rte_timer_subsystem_init_v1905(void)
+int
+rte_timer_subsystem_init(void)
 {
 	const struct rte_memzone *mz;
 	struct rte_timer_data *data;
@@ -209,9 +190,6 @@ rte_timer_subsystem_init_v1905(void)
 
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_timer_subsystem_init(void),
-		  rte_timer_subsystem_init_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_subsystem_init, _v1905, 19.05);
 
 void
 rte_timer_subsystem_finalize(void)
@@ -551,43 +529,14 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t expire,
 }
 
 /* Reset and start the timer associated with the timer handle tim */
-int __vsym
-rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
-		    enum rte_timer_type type, unsigned int tim_lcore,
-		    rte_timer_cb_t fct, void *arg)
-{
-	uint64_t cur_time = rte_get_timer_cycles();
-	uint64_t period;
-
-	if (unlikely((tim_lcore != (unsigned)LCORE_ID_ANY) &&
-			!(rte_lcore_is_enabled(tim_lcore) ||
-			  rte_lcore_has_role(tim_lcore, ROLE_SERVICE))))
-		return -1;
-
-	if (type == PERIODICAL)
-		period = ticks;
-	else
-		period = 0;
-
-	return __rte_timer_reset(tim,  cur_time + ticks, period, tim_lcore,
-			  fct, arg, 0, &default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_reset, _v20, 2.0);
-
-int __vsym
-rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
+int
+rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		      enum rte_timer_type type, unsigned int tim_lcore,
 		      rte_timer_cb_t fct, void *arg)
 {
 	return rte_timer_alt_reset(default_data_id, tim, ticks, type,
 				   tim_lcore, fct, arg);
 }
-MAP_STATIC_SYMBOL(int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
-				      enum rte_timer_type type,
-				      unsigned int tim_lcore,
-				      rte_timer_cb_t fct, void *arg),
-		  rte_timer_reset_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_reset, _v1905, 19.05);
 
 int
 rte_timer_alt_reset(uint32_t timer_data_id, struct rte_timer *tim,
@@ -657,21 +606,11 @@ __rte_timer_stop(struct rte_timer *tim, int local_is_locked,
 }
 
 /* Stop the timer associated with the timer handle tim */
-int __vsym
-rte_timer_stop_v20(struct rte_timer *tim)
-{
-	return __rte_timer_stop(tim, 0, &default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_stop, _v20, 2.0);
-
-int __vsym
-rte_timer_stop_v1905(struct rte_timer *tim)
+int
+rte_timer_stop(struct rte_timer *tim)
 {
 	return rte_timer_alt_stop(default_data_id, tim);
 }
-MAP_STATIC_SYMBOL(int rte_timer_stop(struct rte_timer *tim),
-		  rte_timer_stop_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_stop, _v1905, 19.05);
 
 int
 rte_timer_alt_stop(uint32_t timer_data_id, struct rte_timer *tim)
@@ -817,15 +756,8 @@ __rte_timer_manage(struct rte_timer_data *timer_data)
 	priv_timer[lcore_id].running_tim = NULL;
 }
 
-void __vsym
-rte_timer_manage_v20(void)
-{
-	__rte_timer_manage(&default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_manage, _v20, 2.0);
-
-int __vsym
-rte_timer_manage_v1905(void)
+int
+rte_timer_manage(void)
 {
 	struct rte_timer_data *timer_data;
 
@@ -835,8 +767,6 @@ rte_timer_manage_v1905(void)
 
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_timer_manage(void), rte_timer_manage_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_manage, _v1905, 19.05);
 
 int
 rte_timer_alt_manage(uint32_t timer_data_id,
@@ -1074,21 +1004,11 @@ __rte_timer_dump_stats(struct rte_timer_data *timer_data __rte_unused, FILE *f)
 #endif
 }
 
-void __vsym
-rte_timer_dump_stats_v20(FILE *f)
-{
-	__rte_timer_dump_stats(&default_timer_data, f);
-}
-VERSION_SYMBOL(rte_timer_dump_stats, _v20, 2.0);
-
-int __vsym
-rte_timer_dump_stats_v1905(FILE *f)
+int
+rte_timer_dump_stats(FILE *f)
 {
 	return rte_timer_alt_dump_stats(default_data_id, f);
 }
-MAP_STATIC_SYMBOL(int rte_timer_dump_stats(FILE *f),
-		  rte_timer_dump_stats_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_dump_stats, _v1905, 19.05);
 
 int
 rte_timer_alt_dump_stats(uint32_t timer_data_id __rte_unused, FILE *f)
diff --git a/lib/librte_timer/rte_timer.h b/lib/librte_timer/rte_timer.h
index 05d287d8f2..9dc5fc3092 100644
--- a/lib/librte_timer/rte_timer.h
+++ b/lib/librte_timer/rte_timer.h
@@ -181,8 +181,6 @@ int rte_timer_data_dealloc(uint32_t id);
  *      subsystem
  */
 int rte_timer_subsystem_init(void);
-int rte_timer_subsystem_init_v1905(void);
-void rte_timer_subsystem_init_v20(void);
 
 /**
  * @warning
@@ -250,13 +248,6 @@ void rte_timer_init(struct rte_timer *tim);
 int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		    enum rte_timer_type type, unsigned tim_lcore,
 		    rte_timer_cb_t fct, void *arg);
-int rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
-			  enum rte_timer_type type, unsigned int tim_lcore,
-			  rte_timer_cb_t fct, void *arg);
-int rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
-			enum rte_timer_type type, unsigned int tim_lcore,
-			rte_timer_cb_t fct, void *arg);
-
 
 /**
  * Loop until rte_timer_reset() succeeds.
@@ -313,8 +304,6 @@ rte_timer_reset_sync(struct rte_timer *tim, uint64_t ticks,
  *   - (-1): The timer is in the RUNNING or CONFIG state.
  */
 int rte_timer_stop(struct rte_timer *tim);
-int rte_timer_stop_v1905(struct rte_timer *tim);
-int rte_timer_stop_v20(struct rte_timer *tim);
 
 /**
  * Loop until rte_timer_stop() succeeds.
@@ -358,8 +347,6 @@ int rte_timer_pending(struct rte_timer *tim);
  *   - -EINVAL: timer subsystem not yet initialized
  */
 int rte_timer_manage(void);
-int rte_timer_manage_v1905(void);
-void rte_timer_manage_v20(void);
 
 /**
  * Dump statistics about timers.
@@ -371,8 +358,6 @@ void rte_timer_manage_v20(void);
  *   - -EINVAL: timer subsystem not yet initialized
  */
 int rte_timer_dump_stats(FILE *f);
-int rte_timer_dump_stats_v1905(FILE *f);
-void rte_timer_dump_stats_v20(FILE *f);
 
 /**
  * @warning
-- 
2.17.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
                       ` (2 preceding siblings ...)
  2019-11-08 16:25 15%     ` [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
@ 2019-11-08 16:25 23%     ` Anatoly Burakov
  2019-11-19 17:38  4%       ` Thomas Monjalon
  2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 04/10] timer: remove deprecated code Anatoly Burakov
                       ` (6 subsequent siblings)
  10 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, ray.kinsella, bruce.richardson, thomas, david.marchand

In order to facilitate mass updating of version files, add a shell
script that recurses into lib/ and drivers/ directories and calls
the ABI version update script.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v3:
    - Switch to sh rather than bash, and remove bash-isms
    - Address review comments
    
    v2:
    - Add this patch to split the shell script from previous commit
    - Fixup miscellaneous bugs

 buildtools/update-abi.sh | 42 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100755 buildtools/update-abi.sh

diff --git a/buildtools/update-abi.sh b/buildtools/update-abi.sh
new file mode 100755
index 0000000000..89ba5804a6
--- /dev/null
+++ b/buildtools/update-abi.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+abi_version=$1
+abi_version_file="./config/ABI_VERSION"
+update_path="lib drivers"
+
+if [ -z "$1" ]; then
+      # output to stderr
+      >&2 echo "Please provide ABI version"
+      exit 1
+fi
+
+# check version string format
+echo $abi_version | grep -q -e "^[[:digit:]]\{1,2\}\.[[:digit:]]\{1,2\}$"
+if [ "$?" -ne 0 ]; then
+      # output to stderr
+      >&2 echo "ABI version must be formatted as MAJOR.MINOR version"
+      exit 1
+fi
+
+if [ -n "$2" ]; then
+      abi_version_file=$2
+fi
+
+if [ -n "$3" ]; then
+      # drop $1 and $2
+      shift 2
+      # assign all other arguments as update paths
+      update_path=$@
+fi
+
+echo "New ABI version:" $abi_version
+echo "ABI_VERSION path:" $abi_version_file
+echo "Path to update:" $update_path
+
+echo $abi_version > $abi_version_file
+
+find $update_path -name  \*version.map -exec \
+      ./buildtools/update_version_map_abi.py {} \
+      $abi_version \; -print
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
  2019-11-08 16:25  7%     ` [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global Anatoly Burakov
@ 2019-11-08 16:25 15%     ` Anatoly Burakov
  2019-11-19 14:01  4%       ` Thomas Monjalon
  2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script Anatoly Burakov
                       ` (7 subsequent siblings)
  10 siblings, 1 reply; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Pawel Modrak, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand

From: Pawel Modrak <pawelx.modrak@intel.com>

Add a script that automatically merges all stable ABI's under one
ABI section with the new version, while leaving experimental
section exactly as it is.

Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v7:
    - Do not remove stable ABI if it was empty
    
    v6:
    - Split map file generation function in two
    - Do not print stable ABI if it wasn't present
    
    v3:
    - Add comments to regex patterns
    
    v2:
    - Reworked script to be pep8-compliant and more reliable

 buildtools/update_version_map_abi.py | 173 +++++++++++++++++++++++++++
 1 file changed, 173 insertions(+)
 create mode 100755 buildtools/update_version_map_abi.py

diff --git a/buildtools/update_version_map_abi.py b/buildtools/update_version_map_abi.py
new file mode 100755
index 0000000000..0f6196140e
--- /dev/null
+++ b/buildtools/update_version_map_abi.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+"""
+A Python program to update the ABI version and function names in a DPDK
+lib_*_version.map file. Called from the buildtools/update_abi.sh utility.
+"""
+
+from __future__ import print_function
+import argparse
+import sys
+import re
+
+
+def __parse_map_file(f_in):
+    # match function name, followed by semicolon, followed by EOL, optionally
+    # with whitespace inbetween each item
+    func_line_regex = re.compile(r"\s*"
+                                 r"(?P<func>[a-zA-Z_0-9]+)"
+                                 r"\s*"
+                                 r";"
+                                 r"\s*"
+                                 r"$")
+    # match section name, followed by opening bracked, followed by EOL,
+    # optionally with whitespace inbetween each item
+    section_begin_regex = re.compile(r"\s*"
+                                     r"(?P<version>[a-zA-Z0-9_\.]+)"
+                                     r"\s*"
+                                     r"{"
+                                     r"\s*"
+                                     r"$")
+    # match closing bracket, optionally followed by section name (for when we
+    # inherit from another ABI version), followed by semicolon, followed by
+    # EOL, optionally with whitespace inbetween each item
+    section_end_regex = re.compile(r"\s*"
+                                   r"}"
+                                   r"\s*"
+                                   r"(?P<parent>[a-zA-Z0-9_\.]+)?"
+                                   r"\s*"
+                                   r";"
+                                   r"\s*"
+                                   r"$")
+
+    # for stable ABI, we don't care about which version introduced which
+    # function, we just flatten the list. there are dupes in certain files, so
+    # use a set instead of a list
+    stable_lines = set()
+    # copy experimental section as is
+    experimental_lines = []
+    in_experimental = False
+    has_stable = False
+
+    # gather all functions
+    for line in f_in:
+        # clean up the line
+        line = line.strip('\n').strip()
+
+        # is this an end of section?
+        match = section_end_regex.match(line)
+        if match:
+            # whatever section this was, it's not active any more
+            in_experimental = False
+            continue
+
+        # if we're in the middle of experimental section, we need to copy
+        # the section verbatim, so just add the line
+        if in_experimental:
+            experimental_lines += [line]
+            continue
+
+        # skip empty lines
+        if not line:
+            continue
+
+        # is this a beginning of a new section?
+        match = section_begin_regex.match(line)
+        if match:
+            cur_section = match.group("version")
+            # is it experimental?
+            in_experimental = cur_section == "EXPERIMENTAL"
+            if not in_experimental:
+                has_stable = True
+            continue
+
+        # is this a function?
+        match = func_line_regex.match(line)
+        if match:
+            stable_lines.add(match.group("func"))
+
+    return has_stable, stable_lines, experimental_lines
+
+
+def __generate_stable_abi(f_out, abi_version, lines):
+    # print ABI version header
+    print("DPDK_{} {{".format(abi_version), file=f_out)
+
+    # print global section if it exists
+    if lines:
+        print("\tglobal:", file=f_out)
+        # blank line
+        print(file=f_out)
+
+        # print all stable lines, alphabetically sorted
+        for line in sorted(lines):
+            print("\t{};".format(line), file=f_out)
+
+        # another blank line
+        print(file=f_out)
+
+    # print local section
+    print("\tlocal: *;", file=f_out)
+
+    # end stable version
+    print("};", file=f_out)
+
+
+def __generate_experimental_abi(f_out, lines):
+    # start experimental section
+    print("EXPERIMENTAL {", file=f_out)
+
+    # print all experimental lines as they were
+    for line in lines:
+        # don't print empty whitespace
+        if not line:
+            print("", file=f_out)
+        else:
+            print("\t{}".format(line), file=f_out)
+
+    # end section
+    print("};", file=f_out)
+
+
+def __main():
+    arg_parser = argparse.ArgumentParser(
+        description='Merge versions in linker version script.')
+
+    arg_parser.add_argument("map_file", type=str,
+                            help='path to linker version script file '
+                                 '(pattern: *version.map)')
+    arg_parser.add_argument("abi_version", type=str,
+                            help='target ABI version (pattern: MAJOR.MINOR)')
+
+    parsed = arg_parser.parse_args()
+
+    if not parsed.map_file.endswith('version.map'):
+        print("Invalid input file: {}".format(parsed.map_file),
+              file=sys.stderr)
+        arg_parser.print_help()
+        sys.exit(1)
+
+    if not re.match(r"\d{1,2}\.\d{1,2}", parsed.abi_version):
+        print("Invalid ABI version: {}".format(parsed.abi_version),
+              file=sys.stderr)
+        arg_parser.print_help()
+        sys.exit(1)
+
+    with open(parsed.map_file) as f_in:
+        has_stable, stable_lines, experimental_lines = __parse_map_file(f_in)
+
+    with open(parsed.map_file, 'w') as f_out:
+        need_newline = has_stable and experimental_lines
+        if has_stable:
+            __generate_stable_abi(f_out, parsed.abi_version, stable_lines)
+        if need_newline:
+            # separate sections with a newline
+            print(file=f_out)
+        if experimental_lines:
+            __generate_experimental_abi(f_out, experimental_lines)
+
+
+if __name__ == "__main__":
+    __main()
-- 
2.17.1

^ permalink raw reply	[relevance 15%]

* [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
@ 2019-11-08 16:25  7%     ` Anatoly Burakov
  2019-11-19 13:53  4%       ` Thomas Monjalon
  2019-11-20 12:10  4%       ` Kinsella, Ray
  2019-11-08 16:25 15%     ` [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
                       ` (8 subsequent siblings)
  10 siblings, 2 replies; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Thomas Monjalon, Bruce Richardson, john.mcnamara,
	ray.kinsella, david.marchand, Pawel Modrak

From: Marcin Baran <marcinx.baran@intel.com>

As per new ABI policy, all of the libraries are now versioned using
one global ABI version. Changes in this patch implement the
necessary steps to enable that.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v6:
    - Silenced grep error message on trying to grep a directory
    
    v3:
    - Removed Windows support from Makefile changes
    - Removed unneeded path conversions from meson files

 buildtools/meson.build |  2 ++
 config/ABI_VERSION     |  1 +
 config/meson.build     |  4 +++-
 drivers/meson.build    | 20 ++++++++++++--------
 lib/meson.build        | 18 ++++++++++++------
 meson_options.txt      |  2 --
 mk/rte.lib.mk          | 13 ++++---------
 7 files changed, 34 insertions(+), 26 deletions(-)
 create mode 100644 config/ABI_VERSION

diff --git a/buildtools/meson.build b/buildtools/meson.build
index 32c79c1308..78ce69977d 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -12,3 +12,5 @@ if python3.found()
 else
 	map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
 endif
+
+is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
diff --git a/config/ABI_VERSION b/config/ABI_VERSION
new file mode 100644
index 0000000000..9a7c1e503f
--- /dev/null
+++ b/config/ABI_VERSION
@@ -0,0 +1 @@
+20.0
diff --git a/config/meson.build b/config/meson.build
index 2b1cb92e7e..30aa2a5313 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -18,6 +18,8 @@ endforeach
 # depending on the configuration options
 pver = meson.project_version().split('.')
 major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+abi_version = run_command(find_program('cat', 'more'),
+	files('ABI_VERSION')).stdout().strip()
 
 # extract all version information into the build configuration
 dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
@@ -37,7 +39,7 @@ endif
 
 pmd_subdir_opt = get_option('drivers_install_subdir')
 if pmd_subdir_opt.contains('<VERSION>')
-	pmd_subdir_opt = major_version.join(pmd_subdir_opt.split('<VERSION>'))
+	pmd_subdir_opt = abi_version.join(pmd_subdir_opt.split('<VERSION>'))
 endif
 driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt)
 eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
diff --git a/drivers/meson.build b/drivers/meson.build
index 156d2dc717..b03e0c3159 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -124,12 +124,19 @@ foreach class:dpdk_driver_classes
 					output: out_filename,
 					depends: [pmdinfogen, tmp_lib])
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/@2@_version.map'.format(
+					meson.current_source_dir(),
+					drv_path, lib_name)
+
+			is_experimental = run_command(is_experimental_cmd,
+				files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = '0.1'
+				so_version = '0'
 			else
-				lib_version = major_version
-				so_version = major_version
+				lib_version = abi_version
+				so_version = abi_version
 			endif
 
 			# now build the static driver
@@ -142,9 +149,6 @@ foreach class:dpdk_driver_classes
 				install: true)
 
 			# now build the shared driver
-			version_map = '@0@/@1@/@2@_version.map'.format(
-					meson.current_source_dir(),
-					drv_path, lib_name)
 			shared_lib = shared_library(lib_name,
 				sources,
 				objects: objs,
diff --git a/lib/meson.build b/lib/meson.build
index b2ec9c09a9..3cff2482b1 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -106,12 +106,18 @@ foreach l:libraries
 				cflags += '-DRTE_USE_FUNCTION_VERSIONING'
 			endif
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/rte_@2@_version.map'.format(
+					meson.current_source_dir(), dir_name, name)
+
+			is_experimental = run_command(is_experimental_cmd,
+					files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = '0.1'
+				so_version = '0'
 			else
-				lib_version = major_version
-				so_version = major_version
+				lib_version = abi_version
+				so_version = abi_version
 			endif
 
 			# first build static lib
@@ -127,7 +133,7 @@ foreach l:libraries
 					dependencies: static_deps)
 
 			if not use_function_versioning
-				# use pre-build objects to build shared lib
+				# then use pre-build objects to build shared lib
 				sources = []
 				objs += static_lib.extract_all_objects(recursive: false)
 			else
diff --git a/meson_options.txt b/meson_options.txt
index 89650b0e9c..da6a7f0302 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -30,8 +30,6 @@ option('max_lcores', type: 'integer', value: 128,
 	description: 'maximum number of cores/threads supported by EAL')
 option('max_numa_nodes', type: 'integer', value: 4,
 	description: 'maximum number of NUMA nodes supported by EAL')
-option('per_library_versions', type: 'boolean', value: true,
-	description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
 option('tests', type: 'boolean', value: true,
 	description: 'build unit tests')
 option('use_hpet', type: 'boolean', value: false,
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 4df8849a08..b49af9192b 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -11,20 +11,15 @@ EXTLIB_BUILD ?= n
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
 
-ifneq ($(CONFIG_RTE_MAJOR_ABI),)
-ifneq ($(LIBABIVER),)
-LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
-endif
+ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
+LIBABIVER := $(shell cat $(RTE_SRCDIR)/config/ABI_VERSION)
+else
+LIBABIVER := 0
 endif
 
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 ifeq ($(EXTLIB_BUILD),n)
-ifeq ($(CONFIG_RTE_MAJOR_ABI),)
-ifeq ($(CONFIG_RTE_NEXT_ABI),y)
-LIB := $(LIB).1
-endif
-endif
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 endif
 endif
-- 
2.17.1

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v7 00/10] Implement the new ABI policy and add helper scripts
  2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
@ 2019-11-08 16:25  8%     ` Anatoly Burakov
  2019-11-20 17:23  7%       ` [dpdk-dev] [PATCH v8 00/12] " Anatoly Burakov
                         ` (12 more replies)
  2019-11-08 16:25  7%     ` [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global Anatoly Burakov
                       ` (9 subsequent siblings)
  10 siblings, 13 replies; 200+ results
From: Anatoly Burakov @ 2019-11-08 16:25 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, ray.kinsella, bruce.richardson, thomas, david.marchand

This patchset prepares the codebase for the new ABI policy and
adds a few helper scripts.

There are two new scripts for managing ABI versions added. The
first one is a Python script that will read in a .map file,
flatten it and update the ABI version to the ABI version
specified on the command-line.

The second one is a shell script that will run the above mentioned
Python script recursively over the source tree and set the ABI
version to either that which is defined in config/ABI_VERSION, or
a user-specified one.

Example of its usage: buildtools/update-abi.sh 20.0

This will recurse into lib/ and drivers/ directory and update
whatever .map files it can find.

The other shell script that's added is one that can take in a .so
file and ensure that its declared public ABI matches either
current ABI, next ABI, or EXPERIMENTAL. This was moved to the
last commit because it made no sense to have it beforehand.

The source tree was verified to follow the new ABI policy using
the following command (assuming built binaries are in build/):

find ./build/lib ./build/drivers -name  \*.so \
	-exec ./buildtools/check-abi-version.sh {} \; -print

This returns 0.

Changes since v6:
- Rebase on top of latest master
- Fixed map file generation to generate stable ABI if it was there,
  even if it was empty

Changes since v5:
- Addressed David's comments regarding libtool error messages
- Fixed map file generation to not generate empty stable ABI if
  it wasn't there before

Changes since v4:
- Fixed shared library build issue for distributor

Changes since v3:
- Put distributor code back and cleaned it up
- Rebased on latest master and regenerated commit 9

Changes since v2:
- Addressed Bruce's review comments
- Removed single distributor mode as per Dave's suggestion

Changes since v1:
- Reordered patchset to have removal of old ABI's before introducing
  the new one to avoid compile breakages between patches
- Added a new patch fixing missing symbol in octeontx common
- Split script commits into multiple commits and reordered them
- Re-generated the ABI bump commit
- Verified all scripts to work

Anatoly Burakov (2):
  buildtools: add ABI update shell script
  drivers/octeontx: add missing public symbol

Marcin Baran (6):
  config: change ABI versioning to global
  timer: remove deprecated code
  lpm: remove deprecated code
  distributor: remove deprecated code
  distributor: rename v2.0 ABI to _single suffix
  buildtools: add ABI versioning check script

Pawel Modrak (2):
  buildtools: add script for updating symbols abi version
  build: change ABI version to 20.0

 buildtools/check-abi-version.sh               |   54 +
 buildtools/meson.build                        |    2 +
 buildtools/update-abi.sh                      |   42 +
 buildtools/update_version_map_abi.py          |  173 +++
 config/ABI_VERSION                            |    1 +
 config/meson.build                            |    4 +-
 .../rte_pmd_bbdev_fpga_lte_fec_version.map    |    8 +-
 .../null/rte_pmd_bbdev_null_version.map       |    2 +-
 .../rte_pmd_bbdev_turbo_sw_version.map        |    2 +-
 drivers/bus/dpaa/rte_bus_dpaa_version.map     |  113 +-
 drivers/bus/fslmc/rte_bus_fslmc_version.map   |  154 +--
 drivers/bus/ifpga/rte_bus_ifpga_version.map   |   14 +-
 drivers/bus/pci/rte_bus_pci_version.map       |    2 +-
 drivers/bus/vdev/rte_bus_vdev_version.map     |   12 +-
 drivers/bus/vmbus/rte_bus_vmbus_version.map   |   12 +-
 drivers/common/cpt/rte_common_cpt_version.map |    9 +-
 .../common/dpaax/rte_common_dpaax_version.map |   14 +-
 .../common/mvep/rte_common_mvep_version.map   |    6 +-
 .../octeontx/rte_common_octeontx_version.map  |    7 +-
 .../rte_common_octeontx2_version.map          |   16 +-
 .../compress/isal/rte_pmd_isal_version.map    |    2 +-
 .../rte_pmd_octeontx_compress_version.map     |    2 +-
 drivers/compress/qat/rte_pmd_qat_version.map  |    2 +-
 .../compress/zlib/rte_pmd_zlib_version.map    |    2 +-
 .../aesni_gcm/rte_pmd_aesni_gcm_version.map   |    2 +-
 .../aesni_mb/rte_pmd_aesni_mb_version.map     |    2 +-
 .../crypto/armv8/rte_pmd_armv8_version.map    |    2 +-
 .../caam_jr/rte_pmd_caam_jr_version.map       |    3 +-
 drivers/crypto/ccp/rte_pmd_ccp_version.map    |    3 +-
 .../dpaa2_sec/rte_pmd_dpaa2_sec_version.map   |   10 +-
 .../dpaa_sec/rte_pmd_dpaa_sec_version.map     |   10 +-
 .../crypto/kasumi/rte_pmd_kasumi_version.map  |    2 +-
 .../crypto/mvsam/rte_pmd_mvsam_version.map    |    2 +-
 .../crypto/nitrox/rte_pmd_nitrox_version.map  |    2 +-
 .../null/rte_pmd_null_crypto_version.map      |    2 +-
 .../rte_pmd_octeontx_crypto_version.map       |    3 +-
 .../rte_pmd_octeontx2_crypto_version.map      |    3 +-
 .../openssl/rte_pmd_openssl_version.map       |    2 +-
 .../rte_pmd_crypto_scheduler_version.map      |   19 +-
 .../crypto/snow3g/rte_pmd_snow3g_version.map  |    2 +-
 .../virtio/rte_pmd_virtio_crypto_version.map  |    2 +-
 drivers/crypto/zuc/rte_pmd_zuc_version.map    |    2 +-
 .../event/dpaa/rte_pmd_dpaa_event_version.map |    3 +-
 .../dpaa2/rte_pmd_dpaa2_event_version.map     |    2 +-
 .../event/dsw/rte_pmd_dsw_event_version.map   |    2 +-
 .../rte_pmd_octeontx_event_version.map        |    2 +-
 .../rte_pmd_octeontx2_event_version.map       |    3 +-
 .../event/opdl/rte_pmd_opdl_event_version.map |    2 +-
 .../rte_pmd_skeleton_event_version.map        |    3 +-
 drivers/event/sw/rte_pmd_sw_event_version.map |    2 +-
 .../bucket/rte_mempool_bucket_version.map     |    3 +-
 .../mempool/dpaa/rte_mempool_dpaa_version.map |    2 +-
 .../dpaa2/rte_mempool_dpaa2_version.map       |   12 +-
 .../octeontx/rte_mempool_octeontx_version.map |    2 +-
 .../rte_mempool_octeontx2_version.map         |    4 +-
 .../mempool/ring/rte_mempool_ring_version.map |    3 +-
 .../stack/rte_mempool_stack_version.map       |    3 +-
 drivers/meson.build                           |   20 +-
 .../af_packet/rte_pmd_af_packet_version.map   |    3 +-
 drivers/net/af_xdp/rte_pmd_af_xdp_version.map |    2 +-
 drivers/net/ark/rte_pmd_ark_version.map       |    5 +-
 .../net/atlantic/rte_pmd_atlantic_version.map |    4 +-
 drivers/net/avp/rte_pmd_avp_version.map       |    2 +-
 drivers/net/axgbe/rte_pmd_axgbe_version.map   |    2 +-
 drivers/net/bnx2x/rte_pmd_bnx2x_version.map   |    3 +-
 drivers/net/bnxt/rte_pmd_bnxt_version.map     |    4 +-
 drivers/net/bonding/rte_pmd_bond_version.map  |   47 +-
 drivers/net/cxgbe/rte_pmd_cxgbe_version.map   |    3 +-
 drivers/net/dpaa/rte_pmd_dpaa_version.map     |   11 +-
 drivers/net/dpaa2/rte_pmd_dpaa2_version.map   |   12 +-
 drivers/net/e1000/rte_pmd_e1000_version.map   |    3 +-
 drivers/net/ena/rte_pmd_ena_version.map       |    3 +-
 drivers/net/enetc/rte_pmd_enetc_version.map   |    3 +-
 drivers/net/enic/rte_pmd_enic_version.map     |    3 +-
 .../net/failsafe/rte_pmd_failsafe_version.map |    3 +-
 drivers/net/fm10k/rte_pmd_fm10k_version.map   |    3 +-
 drivers/net/hinic/rte_pmd_hinic_version.map   |    3 +-
 drivers/net/hns3/rte_pmd_hns3_version.map     |    4 +-
 drivers/net/i40e/rte_pmd_i40e_version.map     |   65 +-
 drivers/net/iavf/rte_pmd_iavf_version.map     |    3 +-
 drivers/net/ice/rte_pmd_ice_version.map       |    3 +-
 drivers/net/ifc/rte_pmd_ifc_version.map       |    3 +-
 drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map |    3 +-
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map   |   62 +-
 drivers/net/kni/rte_pmd_kni_version.map       |    3 +-
 .../net/liquidio/rte_pmd_liquidio_version.map |    3 +-
 drivers/net/memif/rte_pmd_memif_version.map   |    5 +-
 drivers/net/mlx4/rte_pmd_mlx4_version.map     |    3 +-
 drivers/net/mlx5/rte_pmd_mlx5_version.map     |    2 +-
 drivers/net/mvneta/rte_pmd_mvneta_version.map |    2 +-
 drivers/net/mvpp2/rte_pmd_mvpp2_version.map   |    2 +-
 drivers/net/netvsc/rte_pmd_netvsc_version.map |    4 +-
 drivers/net/nfb/rte_pmd_nfb_version.map       |    3 +-
 drivers/net/nfp/rte_pmd_nfp_version.map       |    2 +-
 drivers/net/null/rte_pmd_null_version.map     |    3 +-
 .../net/octeontx/rte_pmd_octeontx_version.map |   10 +-
 .../octeontx2/rte_pmd_octeontx2_version.map   |    3 +-
 drivers/net/pcap/rte_pmd_pcap_version.map     |    3 +-
 drivers/net/pfe/rte_pmd_pfe_version.map       |    3 +-
 drivers/net/qede/rte_pmd_qede_version.map     |    3 +-
 drivers/net/ring/rte_pmd_ring_version.map     |   10 +-
 drivers/net/sfc/rte_pmd_sfc_version.map       |    3 +-
 .../net/softnic/rte_pmd_softnic_version.map   |    2 +-
 .../net/szedata2/rte_pmd_szedata2_version.map |    2 +-
 drivers/net/tap/rte_pmd_tap_version.map       |    3 +-
 .../net/thunderx/rte_pmd_thunderx_version.map |    3 +-
 .../rte_pmd_vdev_netvsc_version.map           |    3 +-
 drivers/net/vhost/rte_pmd_vhost_version.map   |   11 +-
 drivers/net/virtio/rte_pmd_virtio_version.map |    3 +-
 .../net/vmxnet3/rte_pmd_vmxnet3_version.map   |    3 +-
 .../rte_rawdev_dpaa2_cmdif_version.map        |    3 +-
 .../rte_rawdev_dpaa2_qdma_version.map         |    4 +-
 .../raw/ifpga/rte_rawdev_ifpga_version.map    |    3 +-
 drivers/raw/ioat/rte_rawdev_ioat_version.map  |    3 +-
 drivers/raw/ntb/rte_rawdev_ntb_version.map    |    5 +-
 .../rte_rawdev_octeontx2_dma_version.map      |    3 +-
 .../skeleton/rte_rawdev_skeleton_version.map  |    3 +-
 lib/librte_acl/rte_acl_version.map            |    2 +-
 .../rte_bitratestats_version.map              |    2 +-
 lib/librte_cfgfile/rte_cfgfile_version.map    |   34 +-
 lib/librte_cmdline/rte_cmdline_version.map    |   10 +-
 .../rte_cryptodev_version.map                 |  102 +-
 lib/librte_distributor/Makefile               |    2 +-
 lib/librte_distributor/distributor_private.h  |   10 +-
 lib/librte_distributor/meson.build            |    2 +-
 lib/librte_distributor/rte_distributor.c      |   98 +-
 ...ributor_v20.c => rte_distributor_single.c} |   73 +-
 ...ributor_v20.h => rte_distributor_single.h} |   26 +-
 .../rte_distributor_v1705.h                   |   61 -
 .../rte_distributor_version.map               |   16 +-
 lib/librte_eal/rte_eal_version.map            |  324 ++----
 lib/librte_efd/rte_efd_version.map            |    2 +-
 lib/librte_ethdev/rte_ethdev_version.map      |  160 +--
 lib/librte_eventdev/rte_eventdev_version.map  |  130 +--
 lib/librte_gro/rte_gro_version.map            |    2 +-
 lib/librte_gso/rte_gso_version.map            |    2 +-
 lib/librte_hash/rte_hash_version.map          |   43 +-
 lib/librte_ip_frag/rte_ip_frag_version.map    |   10 +-
 lib/librte_jobstats/rte_jobstats_version.map  |   10 +-
 lib/librte_kni/rte_kni_version.map            |    2 +-
 lib/librte_kvargs/rte_kvargs_version.map      |    4 +-
 .../rte_latencystats_version.map              |    2 +-
 lib/librte_lpm/rte_lpm.c                      | 1010 +----------------
 lib/librte_lpm/rte_lpm.h                      |   88 --
 lib/librte_lpm/rte_lpm6.c                     |  140 +--
 lib/librte_lpm/rte_lpm6.h                     |   25 -
 lib/librte_lpm/rte_lpm_version.map            |   39 +-
 lib/librte_mbuf/rte_mbuf_version.map          |   49 +-
 lib/librte_member/rte_member_version.map      |    2 +-
 lib/librte_mempool/rte_mempool_version.map    |   44 +-
 lib/librte_meter/rte_meter_version.map        |   13 +-
 lib/librte_metrics/rte_metrics_version.map    |    2 +-
 lib/librte_net/rte_net_version.map            |   23 +-
 lib/librte_pci/rte_pci_version.map            |    2 +-
 lib/librte_pdump/rte_pdump_version.map        |    2 +-
 lib/librte_pipeline/rte_pipeline_version.map  |   36 +-
 lib/librte_port/rte_port_version.map          |   64 +-
 lib/librte_power/rte_power_version.map        |   24 +-
 lib/librte_rawdev/rte_rawdev_version.map      |    4 +-
 lib/librte_reorder/rte_reorder_version.map    |    8 +-
 lib/librte_ring/rte_ring_version.map          |   10 +-
 lib/librte_sched/rte_sched_version.map        |   14 +-
 lib/librte_security/rte_security_version.map  |    2 +-
 lib/librte_table/rte_table_version.map        |    2 +-
 lib/librte_timer/rte_timer.c                  |  100 +-
 lib/librte_timer/rte_timer.h                  |   15 -
 lib/librte_timer/rte_timer_version.map        |   12 +-
 lib/librte_vhost/rte_vhost_version.map        |   52 +-
 lib/meson.build                               |   18 +-
 meson_options.txt                             |    2 -
 mk/rte.lib.mk                                 |   13 +-
 171 files changed, 1152 insertions(+), 2971 deletions(-)
 create mode 100755 buildtools/check-abi-version.sh
 create mode 100755 buildtools/update-abi.sh
 create mode 100755 buildtools/update_version_map_abi.py
 create mode 100644 config/ABI_VERSION
 rename lib/librte_distributor/{rte_distributor_v20.c => rte_distributor_single.c} (84%)
 rename lib/librte_distributor/{rte_distributor_v20.h => rte_distributor_single.h} (89%)
 delete mode 100644 lib/librte_distributor/rte_distributor_v1705.h

-- 
2.17.1

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps
      2019-11-06 21:53  0% ` David Marchand
@ 2019-11-07  6:35  0% ` Rajesh Ravi
  2019-11-07 15:35  0% ` David Marchand
  3 siblings, 0 replies; 200+ results
From: Rajesh Ravi @ 2019-11-07  6:35 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Bruce Richardson, Ajit Kumar Khaparde, Jonathan Richardson,
	Scott Branden, Vikram Prakash, Srinath Mannam, David Marchand,
	Thomas Monjalon

Tested-by:  Rajesh Ravi <rajesh.ravi@broadcom.com>

Tested  the patch modified for DPDK 19.02 along with SPDK 19.07

Regards,
Rajesh

On Tue, Nov 5, 2019 at 8:45 PM Anatoly Burakov <anatoly.burakov@intel.com>
wrote:

> Currently, externally created heaps are supposed to be automatically
> mapped for VFIO DMA by EAL, however they only do so if, at the time of
> heap creation, VFIO is initialized and has at least one device
> available. If no devices are available at the time of heap creation (or
> if devices were available, but were since hot-unplugged, thus dropping
> all VFIO container mappings), then VFIO mapping code would have skipped
> over externally allocated heaps.
>
> The fix is two-fold. First, we allow externally allocated memory
> segments to be marked as "heap" segments. This allows us to distinguish
> between external memory segments that were created via heap API, from
> those that were created via rte_extmem_register() API.
>
> Then, we fix the VFIO code to only skip non-heap external segments.
> Also, since external heaps are not guaranteed to have valid IOVA
> addresses, we will skip those which have invalid IOVA addresses as well.
>
> Fixes: 0f526d674f8e ("malloc: separate creating memseg list and malloc
> heap")
>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---
>
> Notes:
>     This cannot be backported to older releases as it breaks the
>     API and ABI. A separate fix is in the works for stable.
>
>  lib/librte_eal/common/include/rte_memory.h |  1 +
>  lib/librte_eal/common/rte_malloc.c         |  1 +
>  lib/librte_eal/freebsd/eal/eal_memory.c    |  1 +
>  lib/librte_eal/linux/eal/eal_memory.c      |  3 ++
>  lib/librte_eal/linux/eal/eal_vfio.c        | 46 +++++++++++++++++++---
>  5 files changed, 47 insertions(+), 5 deletions(-)
>
> diff --git a/lib/librte_eal/common/include/rte_memory.h
> b/lib/librte_eal/common/include/rte_memory.h
> index 38e00e382c..bf81a2faa8 100644
> --- a/lib/librte_eal/common/include/rte_memory.h
> +++ b/lib/librte_eal/common/include/rte_memory.h
> @@ -81,6 +81,7 @@ struct rte_memseg_list {
>         volatile uint32_t version; /**< version number for multiprocess
> sync. */
>         size_t len; /**< Length of memory area covered by this memseg
> list. */
>         unsigned int external; /**< 1 if this list points to external
> memory */
> +       unsigned int heap; /**< 1 if this list points to a heap */
>         struct rte_fbarray memseg_arr;
>  };
>
> diff --git a/lib/librte_eal/common/rte_malloc.c
> b/lib/librte_eal/common/rte_malloc.c
> index 044d3a9078..413e4aa004 100644
> --- a/lib/librte_eal/common/rte_malloc.c
> +++ b/lib/librte_eal/common/rte_malloc.c
> @@ -396,6 +396,7 @@ rte_malloc_heap_memory_add(const char *heap_name, void
> *va_addr, size_t len,
>
>         rte_spinlock_lock(&heap->lock);
>         ret = malloc_heap_add_external_memory(heap, msl);
> +       msl->heap = 1; /* mark it as heap segment */
>         rte_spinlock_unlock(&heap->lock);
>
>  unlock:
> diff --git a/lib/librte_eal/freebsd/eal/eal_memory.c
> b/lib/librte_eal/freebsd/eal/eal_memory.c
> index 7fe3178898..a97d8f0f0c 100644
> --- a/lib/librte_eal/freebsd/eal/eal_memory.c
> +++ b/lib/librte_eal/freebsd/eal/eal_memory.c
> @@ -93,6 +93,7 @@ rte_eal_hugepage_init(void)
>                 msl->page_sz = page_sz;
>                 msl->len = internal_config.memory;
>                 msl->socket_id = 0;
> +               msl->heap = 1;
>
>                 /* populate memsegs. each memseg is 1 page long */
>                 for (cur_seg = 0; cur_seg < n_segs; cur_seg++) {
> diff --git a/lib/librte_eal/linux/eal/eal_memory.c
> b/lib/librte_eal/linux/eal/eal_memory.c
> index accfd2e232..43e4ffc757 100644
> --- a/lib/librte_eal/linux/eal/eal_memory.c
> +++ b/lib/librte_eal/linux/eal/eal_memory.c
> @@ -831,6 +831,7 @@ alloc_memseg_list(struct rte_memseg_list *msl,
> uint64_t page_sz,
>         msl->page_sz = page_sz;
>         msl->socket_id = socket_id;
>         msl->base_va = NULL;
> +       msl->heap = 1; /* mark it as a heap segment */
>
>         RTE_LOG(DEBUG, EAL, "Memseg list allocated: 0x%zxkB at socket
> %i\n",
>                         (size_t)page_sz >> 10, socket_id);
> @@ -1405,6 +1406,7 @@ eal_legacy_hugepage_init(void)
>                 msl->page_sz = page_sz;
>                 msl->socket_id = 0;
>                 msl->len = internal_config.memory;
> +               msl->heap = 1;
>
>                 /* we're in single-file segments mode, so only the segment
> list
>                  * fd needs to be set up.
> @@ -1677,6 +1679,7 @@ eal_legacy_hugepage_init(void)
>                 mem_sz = msl->len;
>                 munmap(msl->base_va, mem_sz);
>                 msl->base_va = NULL;
> +               msl->heap = 0;
>
>                 /* destroy backing fbarray */
>                 rte_fbarray_destroy(&msl->memseg_arr);
> diff --git a/lib/librte_eal/linux/eal/eal_vfio.c
> b/lib/librte_eal/linux/eal/eal_vfio.c
> index d9541b1220..d5a2bbea0d 100644
> --- a/lib/librte_eal/linux/eal/eal_vfio.c
> +++ b/lib/librte_eal/linux/eal/eal_vfio.c
> @@ -1250,7 +1250,16 @@ type1_map(const struct rte_memseg_list *msl, const
> struct rte_memseg *ms,
>  {
>         int *vfio_container_fd = arg;
>
> -       if (msl->external)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
> +               return 0;
> +
> +       /* if IOVA mode is VA, we've already mapped the internal segments
> */
> +       if (!msl->external && rte_eal_iova_mode() == RTE_IOVA_VA)
>                 return 0;
>
>         return vfio_type1_dma_mem_map(*vfio_container_fd, ms->addr_64,
> ms->iova,
> @@ -1313,12 +1322,18 @@ vfio_type1_dma_mem_map(int vfio_container_fd,
> uint64_t vaddr, uint64_t iova,
>  static int
>  vfio_type1_dma_map(int vfio_container_fd)
>  {
> +       int ret;
>         if (rte_eal_iova_mode() == RTE_IOVA_VA) {
>                 /* with IOVA as VA mode, we can get away with mapping
> contiguous
>                  * chunks rather than going page-by-page.
>                  */
> -               return rte_memseg_contig_walk(type1_map_contig,
> +               ret = rte_memseg_contig_walk(type1_map_contig,
>                                 &vfio_container_fd);
> +               if (ret)
> +                       return ret;
> +               /* we have to continue the walk because we've skipped the
> +                * external segments during the config walk.
> +                */
>         }
>         return rte_memseg_walk(type1_map, &vfio_container_fd);
>  }
> @@ -1410,7 +1425,15 @@ vfio_spapr_map_walk(const struct rte_memseg_list
> *msl,
>  {
>         struct spapr_remap_walk_param *param = arg;
>
> -       if (msl->external || ms->addr_64 == param->addr_64)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
> +               return 0;
> +
> +       if (ms->addr_64 == param->addr_64)
>                 return 0;
>
>         return vfio_spapr_dma_do_map(param->vfio_container_fd,
> ms->addr_64, ms->iova,
> @@ -1423,7 +1446,15 @@ vfio_spapr_unmap_walk(const struct rte_memseg_list
> *msl,
>  {
>         struct spapr_remap_walk_param *param = arg;
>
> -       if (msl->external || ms->addr_64 == param->addr_64)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
> +               return 0;
> +
> +       if (ms->addr_64 == param->addr_64)
>                 return 0;
>
>         return vfio_spapr_dma_do_map(param->vfio_container_fd,
> ms->addr_64, ms->iova,
> @@ -1443,7 +1474,12 @@ vfio_spapr_window_size_walk(const struct
> rte_memseg_list *msl,
>         struct spapr_walk_param *param = arg;
>         uint64_t max = ms->iova + ms->len;
>
> -       if (msl->external)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
>                 return 0;
>
>         /* do not iterate ms we haven't mapped yet  */
> --
> 2.17.1
>


-- 
Regards,
Rajesh

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 12:51  0%                   ` Ferruh Yigit
@ 2019-11-08 16:11  0%                     ` Dekel Peled
  2019-11-08 16:53  0%                       ` Ferruh Yigit
  2019-11-09 18:20  3%                     ` Matan Azrad
  1 sibling, 1 reply; 200+ results
From: Dekel Peled @ 2019-11-08 16:11 UTC (permalink / raw)
  To: Ferruh Yigit, Matan Azrad, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

Thanks, PSB.

> -----Original Message-----
> From: Ferruh Yigit <ferruh.yigit@intel.com>
> Sent: Friday, November 8, 2019 2:52 PM
> To: Matan Azrad <matan@mellanox.com>; Dekel Peled
> <dekelp@mellanox.com>; john.mcnamara@intel.com;
> marko.kovacevic@intel.com; nhorman@tuxdriver.com;
> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com;
> anatoly.burakov@intel.com; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com;
> wenzhuo.lu@intel.com; konstantin.ananyev@intel.com; Shahaf Shuler
> <shahafs@mellanox.com>; Slava Ovsiienko <viacheslavo@mellanox.com>;
> rmody@marvell.com; shshaikh@marvell.com;
> maxime.coquelin@redhat.com; tiwei.bie@intel.com;
> zhihong.wang@intel.com; yongwang@vmware.com; Thomas Monjalon
> <thomas@monjalon.net>; arybchenko@solarflare.com;
> jingjing.wu@intel.com; bernard.iremonger@intel.com
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO
> packet size
> 
> On 11/8/2019 11:56 AM, Matan Azrad wrote:
> >
> >
> > From: Ferruh Yigit
> >> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> >>>
> >>>
> >>> From: Ferruh Yigit
> >>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> >>>>> Hi
> >>>>>
> >>>>> From: Ferruh Yigit
> >>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> >>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> >>>>>>>
> >>>>>> 	RTE_ETHER_MAX_LEN;
> >>>>>>>  	}
> >>>>>>>
> >>>>>>> +	/*
> >>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
> >> packet
> >>>>>>> +	 * size is supported by the configured device.
> >>>>>>> +	 */
> >>>>>>> +	if (dev_conf->rxmode.offloads &
> >> DEV_RX_OFFLOAD_TCP_LRO) {
> >>>>>>> +		ret = check_lro_pkt_size(
> >>>>>>> +				port_id, dev_conf-
> >>>>>>> rxmode.max_lro_pkt_size,
> >>>>>>> +				dev_info.max_lro_pkt_size);
> >>>>>>> +		if (ret != 0)
> >>>>>>> +			goto rollback;
> >>>>>>> +	}
> >>>>>>> +
> >>>>>>
> >>>>>> This check forces applications that enable LRO to provide
> >>>> 'max_lro_pkt_size'
> >>>>>> config value.
> >>>>>
> >>>>> Yes.(we can break an API, we noticed it)
> >>>>
> >>>> I am not talking about API/ABI breakage, that part is OK.
> >>>> With this check, if the application requested LRO offload but not
> >>>> provided 'max_lro_pkt_size' value, device configuration will fail.
> >>>>
> >>> Yes
> >>>> Can there be a case application is good with whatever the PMD can
> >>>> support as max?
> >>> Yes can be - you know, we can do everything we want but it is better
> >>> to be
> >> consistent:
> >>> Due to the fact of Max rx pkt len field is mandatory for JUMBO
> >>> offload, max
> >> lro pkt len should be mandatory for LRO offload.
> >>>
> >>> So your question is actually why both, non-lro packets and LRO
> >>> packets max
> >> size are mandatory...
> >>>
> >>>
> >>> I think it should be important values for net applications management.
> >>> Also good for mbuf size managements.
> >>>
> >>>>>
> >>>>>> - Why it is mandatory now, how it was working before if it is
> >>>>>> mandatory value?
> >>>>>
> >>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> >>>>> frame
> >>>> offload.
> >>>>> So now, when the user configures a LRO offload he must to set max
> >>>>> lro pkt
> >>>> len.
> >>>>> We don't want to confuse the user here with the max rx pkt len
> >>>> configurations and behaviors, they should be with same logic.
> >>>>>
> >>>>> This parameter defines well the LRO behavior.
> >>>>> Before this, each PMD took its own interpretation to what should
> >>>>> be the
> >>>> maximum size for LRO aggregated packets.
> >>>>> Now, the user must say what is his intension, and the ethdev can
> >>>>> limit it
> >>>> according to the device capability.
> >>>>> By this way, also, the PMD can organize\optimize its data-path more.
> >>>>> Also, the application can create different mempools for LRO queues
> >>>>> to
> >>>> allow bigger packet receiving for LRO traffic.
> >>>>>
> >>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
> '0'?
> >>>>> Yes, you can see the feature description Dekel added.
> >>>>> This patch also updates all the PMDs support an LRO for non-0 value.
> >>>>
> >>>> Of course I can see the updates Matan, my point is "What happens if
> >>>> PMD doesn't provide 'max_lro_pkt_size'",
> >>>> 1) There is no check for it right, so it is acceptable?
> >>>
> >>> There is check.
> >>> If the capability is 0, any non-zero configuration will fail.
> >>>
> >>>> 2) Are we making this filed mandatory to provide for PMDs, it is
> >>>> easy to make new fields mandatory for PMDs but is this really
> necessary?
> >>>
> >>> Yes, for consistence.
> >>>
> >>>>>
> >>>>> as same as max rx pkt len, no?
> >>>>>
> >>>>>> - What do you think setting 'max_lro_pkt_size' config value to
> >>>>>> what PMD provided if application doesn't provide it?
> >>>>> Same answers as above.
> >>>>>
> >>>>
> >>>> If application doesn't care the value, as it has been till now, and
> >>>> not provided explicit 'max_lro_pkt_size', why not ethdev level use
> >>>> the value provided by PMD instead of failing?
> >>>
> >>> Again, same question we can ask on max rx pkt len.
> >>>
> >>> Looks like the packet size is very important value which should be
> >>> set by
> >> the application.
> >>>
> >>> Previous applications have no option to configure it, so they
> >>> haven't
> >> configure it, (probably cover it somehow) I think it is our miss to
> >> supply this info.
> >>>
> >>> Let's do it in same way as we do max rx pkt len (as this patch main idea).
> >>> Later, we can change both to other meaning.
> >>>
> >>
> >> I think it is not a good reason to introduce a new mandatory config
> >> option for application because of 'max_rx_pkt_len' does it.
> >
> > It is mandatory only if LRO offload is configured.
> >
> >> Will it work, if:
> >> - If application doesn't provide this value, use the PMD max
> >
> > May cause a problem if the mbuf size is not enough for the PMD maximum.
> 
> OK, this is what I was missing, for this case I was thinking max_rx_pkt_len will
> be used but you already explained that application may want to use different
> mempools for LRO queues.
> 
> For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into
> account and program the device accordingly (of course in LRO enabled case)
> ?
> This part seems missing and should be highlighted to other PMD maintainers.
> 

All relevant PMDs were modified and maintainers are copied on this patch series.

> >
> >> - If both application and PMD doesn't provide this value, fail on
> configure()?
> >
> > It will work.
> > In my opinion - not ideal.
> >
> > Matan
> >
> >


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 14:52  0%                       ` Ananyev, Konstantin
@ 2019-11-08 16:08  0%                         ` Dekel Peled
  2019-11-08 16:28  0%                           ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Dekel Peled @ 2019-11-08 16:08 UTC (permalink / raw)
  To: Ananyev, Konstantin, Matan Azrad, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev

Thanks, PSB.

> -----Original Message-----
> From: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Sent: Friday, November 8, 2019 4:53 PM
> To: Dekel Peled <dekelp@mellanox.com>; Matan Azrad
> <matan@mellanox.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Mcnamara,
> John <john.mcnamara@intel.com>; Kovacevic, Marko
> <marko.kovacevic@intel.com>; nhorman@tuxdriver.com;
> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Burakov,
> Anatoly <anatoly.burakov@intel.com>; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Shahaf Shuler <shahafs@mellanox.com>; Slava
> Ovsiienko <viacheslavo@mellanox.com>; rmody@marvell.com;
> shshaikh@marvell.com; maxime.coquelin@redhat.com; Bie, Tiwei
> <tiwei.bie@intel.com>; Wang, Zhihong <zhihong.wang@intel.com>;
> yongwang@vmware.com; Thomas Monjalon <thomas@monjalon.net>;
> arybchenko@solarflare.com; Wu, Jingjing <jingjing.wu@intel.com>;
> Iremonger, Bernard <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO
> packet size
> 
> 
> > > > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > > >>>>>
> > > > > >>>> 	RTE_ETHER_MAX_LEN;
> > > > > >>>>>  	}
> > > > > >>>>>
> > > > > >>>>> +	/*
> > > > > >>>>> +	 * If LRO is enabled, check that the maximum
> aggregated
> > > > > packet
> > > > > >>>>> +	 * size is supported by the configured device.
> > > > > >>>>> +	 */
> > > > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > > > >>>>> +		ret = check_lro_pkt_size(
> > > > > >>>>> +				port_id, dev_conf-
> > > > > >>>>> rxmode.max_lro_pkt_size,
> > > > > >>>>> +				dev_info.max_lro_pkt_size);
> > > > > >>>>> +		if (ret != 0)
> > > > > >>>>> +			goto rollback;
> > > > > >>>>> +	}
> > > > > >>>>> +
> > > > > >>>>
> > > > > >>>> This check forces applications that enable LRO to provide
> > > > > >> 'max_lro_pkt_size'
> > > > > >>>> config value.
> > > > > >>>
> > > > > >>> Yes.(we can break an API, we noticed it)
> > > > > >>
> > > > > >> I am not talking about API/ABI breakage, that part is OK.
> > > > > >> With this check, if the application requested LRO offload but
> > > > > >> not provided 'max_lro_pkt_size' value, device configuration will
> fail.
> > > > > >>
> > > > > > Yes
> > > > > >> Can there be a case application is good with whatever the PMD
> > > > > >> can support as max?
> > > > > > Yes can be - you know, we can do everything we want but it is
> > > > > > better to be
> > > > > consistent:
> > > > > > Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > > > > > offload, max
> > > > > lro pkt len should be mandatory for LRO offload.
> > > > > >
> > > > > > So your question is actually why both, non-lro packets and LRO
> > > > > > packets max
> > > > > size are mandatory...
> > > > > >
> > > > > >
> > > > > > I think it should be important values for net applications
> management.
> > > > > > Also good for mbuf size managements.
> > > > > >
> > > > > >>>
> > > > > >>>> - Why it is mandatory now, how it was working before if it
> > > > > >>>> is mandatory value?
> > > > > >>>
> > > > > >>> It is the same as max_rx_pkt_len which is mandatory for
> > > > > >>> jumbo frame
> > > > > >> offload.
> > > > > >>> So now, when the user configures a LRO offload he must to
> > > > > >>> set max lro pkt
> > > > > >> len.
> > > > > >>> We don't want to confuse the user here with the max rx pkt
> > > > > >>> len
> > > > > >> configurations and behaviors, they should be with same logic.
> > > > > >>>
> > > > > >>> This parameter defines well the LRO behavior.
> > > > > >>> Before this, each PMD took its own interpretation to what
> > > > > >>> should be the
> > > > > >> maximum size for LRO aggregated packets.
> > > > > >>> Now, the user must say what is his intension, and the ethdev
> > > > > >>> can limit it
> > > > > >> according to the device capability.
> > > > > >>> By this way, also, the PMD can organize\optimize its data-path
> more.
> > > > > >>> Also, the application can create different mempools for LRO
> > > > > >>> queues to
> > > > > >> allow bigger packet receiving for LRO traffic.
> > > > > >>>
> > > > > >>>> - What happens if PMD doesn't provide 'max_lro_pkt_size',
> > > > > >>>> so it is
> > > '0'?
> > > > > >>> Yes, you can see the feature description Dekel added.
> > > > > >>> This patch also updates all the PMDs support an LRO for non-0
> value.
> > > > > >>
> > > > > >> Of course I can see the updates Matan, my point is "What
> > > > > >> happens if PMD doesn't provide 'max_lro_pkt_size'",
> > > > > >> 1) There is no check for it right, so it is acceptable?
> > > > > >
> > > > > > There is check.
> > > > > > If the capability is 0, any non-zero configuration will fail.
> > > > > >
> > > > > >> 2) Are we making this filed mandatory to provide for PMDs, it
> > > > > >> is easy to make new fields mandatory for PMDs but is this
> > > > > >> really
> > > necessary?
> > > > > >
> > > > > > Yes, for consistence.
> > > > > >
> > > > > >>>
> > > > > >>> as same as max rx pkt len, no?
> > > > > >>>
> > > > > >>>> - What do you think setting 'max_lro_pkt_size' config value
> > > > > >>>> to what PMD provided if application doesn't provide it?
> > > > > >>> Same answers as above.
> > > > > >>>
> > > > > >>
> > > > > >> If application doesn't care the value, as it has been till
> > > > > >> now, and not provided explicit 'max_lro_pkt_size', why not
> > > > > >> ethdev level use the value provided by PMD instead of failing?
> > > > > >
> > > > > > Again, same question we can ask on max rx pkt len.
> > > > > >
> > > > > > Looks like the packet size is very important value which
> > > > > > should be set by
> > > > > the application.
> > > > > >
> > > > > > Previous applications have no option to configure it, so they
> > > > > > haven't
> > > > > configure it, (probably cover it somehow) I think it is our miss
> > > > > to supply this info.
> > > > > >
> > > > > > Let's do it in same way as we do max rx pkt len (as this patch main
> idea).
> > > > > > Later, we can change both to other meaning.
> > > > > >
> > > > >
> > > > > I think it is not a good reason to introduce a new mandatory
> > > > > config option for application because of 'max_rx_pkt_len' does it.
> > > >
> > > > It is mandatory only if LRO offload is configured.
> > >
> > > So max_rx_pkt_len will remain max size of one packet, while
> > > max_lro_len will be max accumulate size for each LRO session?
> > >
> >
> > Yes.
> >
> > > BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
> >
> > Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
> > Change to RTE_IPV4_MAX_PKT_LEN?
> >
> > > ixgbe_vf, as I remember, doesn’t support LRO at all.
> >
> > Please see my change in drivers/net/ixgbe/ixgbe_vf_representor.c
> > Remove it?
> 
> Yes, please for both.

Will change in v5.

> 
> >
> > >
> > > >
> > > > > Will it work, if:
> > > > > - If application doesn't provide this value, use the PMD max
> > > >
> > > > May cause a problem if the mbuf size is not enough for the PMD
> maximum.
> > >
> > > Another question, what will happen if PMD will ignore that value and
> > > will generate packets bigger then requested?
> >
> > PMD should use this value and not ignore it.
> 
> Hmm, ok but this patch updates mxl driver only...
> I suppose you expect other PMD maintainers to do the job for their PMDs,
> right?
> If so, are they aware (and agree) for this new hard requirement and changes
> required?
> Again what PMD should do if it can't support exact value?
> Let say user asked max_lro_size=20KB but PMD can do only 16KB or 24KB?
> Should it fail, or round to smallest, or ...?
> 
> Actually I wonder, should it really be a hard requirement or more like a
> guidance to PMD?
> Why app needs and *exact* value for LRO size?

The exact value should be configured to HW as LRO session limit.

> 
> 
> > >
> > > >
> > > > > - If both application and PMD doesn't provide this value, fail
> > > > > on
> > > configure()?
> > > >
> > > > It will work.
> > > > In my opinion - not ideal.
> > > >
> > > > Matan
> > > >


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 14:10  0%                     ` Dekel Peled
@ 2019-11-08 14:52  0%                       ` Ananyev, Konstantin
  2019-11-08 16:08  0%                         ` Dekel Peled
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-08 14:52 UTC (permalink / raw)
  To: Dekel Peled, Matan Azrad, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev


> > > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > > >>>>>
> > > > >>>> 	RTE_ETHER_MAX_LEN;
> > > > >>>>>  	}
> > > > >>>>>
> > > > >>>>> +	/*
> > > > >>>>> +	 * If LRO is enabled, check that the maximum aggregated
> > > > packet
> > > > >>>>> +	 * size is supported by the configured device.
> > > > >>>>> +	 */
> > > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > > >>>>> +		ret = check_lro_pkt_size(
> > > > >>>>> +				port_id, dev_conf-
> > > > >>>>> rxmode.max_lro_pkt_size,
> > > > >>>>> +				dev_info.max_lro_pkt_size);
> > > > >>>>> +		if (ret != 0)
> > > > >>>>> +			goto rollback;
> > > > >>>>> +	}
> > > > >>>>> +
> > > > >>>>
> > > > >>>> This check forces applications that enable LRO to provide
> > > > >> 'max_lro_pkt_size'
> > > > >>>> config value.
> > > > >>>
> > > > >>> Yes.(we can break an API, we noticed it)
> > > > >>
> > > > >> I am not talking about API/ABI breakage, that part is OK.
> > > > >> With this check, if the application requested LRO offload but not
> > > > >> provided 'max_lro_pkt_size' value, device configuration will fail.
> > > > >>
> > > > > Yes
> > > > >> Can there be a case application is good with whatever the PMD can
> > > > >> support as max?
> > > > > Yes can be - you know, we can do everything we want but it is
> > > > > better to be
> > > > consistent:
> > > > > Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > > > > offload, max
> > > > lro pkt len should be mandatory for LRO offload.
> > > > >
> > > > > So your question is actually why both, non-lro packets and LRO
> > > > > packets max
> > > > size are mandatory...
> > > > >
> > > > >
> > > > > I think it should be important values for net applications management.
> > > > > Also good for mbuf size managements.
> > > > >
> > > > >>>
> > > > >>>> - Why it is mandatory now, how it was working before if it is
> > > > >>>> mandatory value?
> > > > >>>
> > > > >>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> > > > >>> frame
> > > > >> offload.
> > > > >>> So now, when the user configures a LRO offload he must to set
> > > > >>> max lro pkt
> > > > >> len.
> > > > >>> We don't want to confuse the user here with the max rx pkt len
> > > > >> configurations and behaviors, they should be with same logic.
> > > > >>>
> > > > >>> This parameter defines well the LRO behavior.
> > > > >>> Before this, each PMD took its own interpretation to what should
> > > > >>> be the
> > > > >> maximum size for LRO aggregated packets.
> > > > >>> Now, the user must say what is his intension, and the ethdev can
> > > > >>> limit it
> > > > >> according to the device capability.
> > > > >>> By this way, also, the PMD can organize\optimize its data-path more.
> > > > >>> Also, the application can create different mempools for LRO
> > > > >>> queues to
> > > > >> allow bigger packet receiving for LRO traffic.
> > > > >>>
> > > > >>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
> > '0'?
> > > > >>> Yes, you can see the feature description Dekel added.
> > > > >>> This patch also updates all the PMDs support an LRO for non-0 value.
> > > > >>
> > > > >> Of course I can see the updates Matan, my point is "What happens
> > > > >> if PMD doesn't provide 'max_lro_pkt_size'",
> > > > >> 1) There is no check for it right, so it is acceptable?
> > > > >
> > > > > There is check.
> > > > > If the capability is 0, any non-zero configuration will fail.
> > > > >
> > > > >> 2) Are we making this filed mandatory to provide for PMDs, it is
> > > > >> easy to make new fields mandatory for PMDs but is this really
> > necessary?
> > > > >
> > > > > Yes, for consistence.
> > > > >
> > > > >>>
> > > > >>> as same as max rx pkt len, no?
> > > > >>>
> > > > >>>> - What do you think setting 'max_lro_pkt_size' config value to
> > > > >>>> what PMD provided if application doesn't provide it?
> > > > >>> Same answers as above.
> > > > >>>
> > > > >>
> > > > >> If application doesn't care the value, as it has been till now,
> > > > >> and not provided explicit 'max_lro_pkt_size', why not ethdev
> > > > >> level use the value provided by PMD instead of failing?
> > > > >
> > > > > Again, same question we can ask on max rx pkt len.
> > > > >
> > > > > Looks like the packet size is very important value which should be
> > > > > set by
> > > > the application.
> > > > >
> > > > > Previous applications have no option to configure it, so they
> > > > > haven't
> > > > configure it, (probably cover it somehow) I think it is our miss to
> > > > supply this info.
> > > > >
> > > > > Let's do it in same way as we do max rx pkt len (as this patch main idea).
> > > > > Later, we can change both to other meaning.
> > > > >
> > > >
> > > > I think it is not a good reason to introduce a new mandatory config
> > > > option for application because of 'max_rx_pkt_len' does it.
> > >
> > > It is mandatory only if LRO offload is configured.
> >
> > So max_rx_pkt_len will remain max size of one packet, while max_lro_len
> > will be max accumulate size for each LRO session?
> >
> 
> Yes.
> 
> > BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
> 
> Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
> Change to RTE_IPV4_MAX_PKT_LEN?
> 
> > ixgbe_vf, as I remember, doesn’t support LRO at all.
> 
> Please see my change in drivers/net/ixgbe/ixgbe_vf_representor.c
> Remove it?

Yes, please for both.

> 
> >
> > >
> > > > Will it work, if:
> > > > - If application doesn't provide this value, use the PMD max
> > >
> > > May cause a problem if the mbuf size is not enough for the PMD maximum.
> >
> > Another question, what will happen if PMD will ignore that value and will
> > generate packets bigger then requested?
> 
> PMD should use this value and not ignore it.

Hmm, ok but this patch updates mxl driver only...
I suppose you expect other PMD maintainers to do the job for their PMDs, right?
If so, are they aware (and agree) for this new hard requirement and changes required?
Again what PMD should do if it can't support exact value?
Let say user asked max_lro_size=20KB but PMD can do only 16KB or 24KB?
Should it fail, or round to smallest, or ...?

Actually I wonder, should it really be a hard requirement or more like a guidance to PMD?
Why app needs and *exact* value for LRO size?
 

> >
> > >
> > > > - If both application and PMD doesn't provide this value, fail on
> > configure()?
> > >
> > > It will work.
> > > In my opinion - not ideal.
> > >
> > > Matan
> > >


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 13:11  0%                   ` Ananyev, Konstantin
@ 2019-11-08 14:10  0%                     ` Dekel Peled
  2019-11-08 14:52  0%                       ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Dekel Peled @ 2019-11-08 14:10 UTC (permalink / raw)
  To: Ananyev, Konstantin, Matan Azrad, Yigit, Ferruh, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev

Thanks, PSB.

> -----Original Message-----
> From: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Sent: Friday, November 8, 2019 3:11 PM
> To: Matan Azrad <matan@mellanox.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Dekel Peled <dekelp@mellanox.com>; Mcnamara,
> John <john.mcnamara@intel.com>; Kovacevic, Marko
> <marko.kovacevic@intel.com>; nhorman@tuxdriver.com;
> ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Burakov,
> Anatoly <anatoly.burakov@intel.com>; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Shahaf Shuler <shahafs@mellanox.com>; Slava
> Ovsiienko <viacheslavo@mellanox.com>; rmody@marvell.com;
> shshaikh@marvell.com; maxime.coquelin@redhat.com; Bie, Tiwei
> <tiwei.bie@intel.com>; Wang, Zhihong <zhihong.wang@intel.com>;
> yongwang@vmware.com; Thomas Monjalon <thomas@monjalon.net>;
> arybchenko@solarflare.com; Wu, Jingjing <jingjing.wu@intel.com>;
> Iremonger, Bernard <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO
> packet size
> 
> 
> 
> > -----Original Message-----
> > From: Matan Azrad <matan@mellanox.com>
> > Sent: Friday, November 8, 2019 11:56 AM
> > To: Yigit, Ferruh <ferruh.yigit@intel.com>; Dekel Peled
> > <dekelp@mellanox.com>; Mcnamara, John <john.mcnamara@intel.com>;
> > Kovacevic, Marko <marko.kovacevic@intel.com>;
> nhorman@tuxdriver.com;
> > ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Burakov,
> > Anatoly <anatoly.burakov@intel.com>; xuanziyang2@huawei.com;
> > cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu,
> Wenzhuo
> > <wenzhuo.lu@intel.com>; Ananyev, Konstantin
> > <konstantin.ananyev@intel.com>; Shahaf Shuler
> <shahafs@mellanox.com>;
> > Slava Ovsiienko <viacheslavo@mellanox.com>; rmody@marvell.com;
> > shshaikh@marvell.com; maxime.coquelin@redhat.com; Bie, Tiwei
> > <tiwei.bie@intel.com>; Wang, Zhihong <zhihong.wang@intel.com>;
> > yongwang@vmware.com; Thomas Monjalon <thomas@monjalon.net>;
> > arybchenko@solarflare.com; Wu, Jingjing <jingjing.wu@intel.com>;
> > Iremonger, Bernard <bernard.iremonger@intel.com>
> > Cc: dev@dpdk.org
> > Subject: RE: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max
> > LRO packet size
> >
> >
> >
> > From: Ferruh Yigit
> > > On 11/8/2019 10:10 AM, Matan Azrad wrote:
> > > >
> > > >
> > > > From: Ferruh Yigit
> > > >> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> > > >>> Hi
> > > >>>
> > > >>> From: Ferruh Yigit
> > > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > > >>>>>
> > > >>>> 	RTE_ETHER_MAX_LEN;
> > > >>>>>  	}
> > > >>>>>
> > > >>>>> +	/*
> > > >>>>> +	 * If LRO is enabled, check that the maximum aggregated
> > > packet
> > > >>>>> +	 * size is supported by the configured device.
> > > >>>>> +	 */
> > > >>>>> +	if (dev_conf->rxmode.offloads &
> > > DEV_RX_OFFLOAD_TCP_LRO) {
> > > >>>>> +		ret = check_lro_pkt_size(
> > > >>>>> +				port_id, dev_conf-
> > > >>>>> rxmode.max_lro_pkt_size,
> > > >>>>> +				dev_info.max_lro_pkt_size);
> > > >>>>> +		if (ret != 0)
> > > >>>>> +			goto rollback;
> > > >>>>> +	}
> > > >>>>> +
> > > >>>>
> > > >>>> This check forces applications that enable LRO to provide
> > > >> 'max_lro_pkt_size'
> > > >>>> config value.
> > > >>>
> > > >>> Yes.(we can break an API, we noticed it)
> > > >>
> > > >> I am not talking about API/ABI breakage, that part is OK.
> > > >> With this check, if the application requested LRO offload but not
> > > >> provided 'max_lro_pkt_size' value, device configuration will fail.
> > > >>
> > > > Yes
> > > >> Can there be a case application is good with whatever the PMD can
> > > >> support as max?
> > > > Yes can be - you know, we can do everything we want but it is
> > > > better to be
> > > consistent:
> > > > Due to the fact of Max rx pkt len field is mandatory for JUMBO
> > > > offload, max
> > > lro pkt len should be mandatory for LRO offload.
> > > >
> > > > So your question is actually why both, non-lro packets and LRO
> > > > packets max
> > > size are mandatory...
> > > >
> > > >
> > > > I think it should be important values for net applications management.
> > > > Also good for mbuf size managements.
> > > >
> > > >>>
> > > >>>> - Why it is mandatory now, how it was working before if it is
> > > >>>> mandatory value?
> > > >>>
> > > >>> It is the same as max_rx_pkt_len which is mandatory for jumbo
> > > >>> frame
> > > >> offload.
> > > >>> So now, when the user configures a LRO offload he must to set
> > > >>> max lro pkt
> > > >> len.
> > > >>> We don't want to confuse the user here with the max rx pkt len
> > > >> configurations and behaviors, they should be with same logic.
> > > >>>
> > > >>> This parameter defines well the LRO behavior.
> > > >>> Before this, each PMD took its own interpretation to what should
> > > >>> be the
> > > >> maximum size for LRO aggregated packets.
> > > >>> Now, the user must say what is his intension, and the ethdev can
> > > >>> limit it
> > > >> according to the device capability.
> > > >>> By this way, also, the PMD can organize\optimize its data-path more.
> > > >>> Also, the application can create different mempools for LRO
> > > >>> queues to
> > > >> allow bigger packet receiving for LRO traffic.
> > > >>>
> > > >>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is
> '0'?
> > > >>> Yes, you can see the feature description Dekel added.
> > > >>> This patch also updates all the PMDs support an LRO for non-0 value.
> > > >>
> > > >> Of course I can see the updates Matan, my point is "What happens
> > > >> if PMD doesn't provide 'max_lro_pkt_size'",
> > > >> 1) There is no check for it right, so it is acceptable?
> > > >
> > > > There is check.
> > > > If the capability is 0, any non-zero configuration will fail.
> > > >
> > > >> 2) Are we making this filed mandatory to provide for PMDs, it is
> > > >> easy to make new fields mandatory for PMDs but is this really
> necessary?
> > > >
> > > > Yes, for consistence.
> > > >
> > > >>>
> > > >>> as same as max rx pkt len, no?
> > > >>>
> > > >>>> - What do you think setting 'max_lro_pkt_size' config value to
> > > >>>> what PMD provided if application doesn't provide it?
> > > >>> Same answers as above.
> > > >>>
> > > >>
> > > >> If application doesn't care the value, as it has been till now,
> > > >> and not provided explicit 'max_lro_pkt_size', why not ethdev
> > > >> level use the value provided by PMD instead of failing?
> > > >
> > > > Again, same question we can ask on max rx pkt len.
> > > >
> > > > Looks like the packet size is very important value which should be
> > > > set by
> > > the application.
> > > >
> > > > Previous applications have no option to configure it, so they
> > > > haven't
> > > configure it, (probably cover it somehow) I think it is our miss to
> > > supply this info.
> > > >
> > > > Let's do it in same way as we do max rx pkt len (as this patch main idea).
> > > > Later, we can change both to other meaning.
> > > >
> > >
> > > I think it is not a good reason to introduce a new mandatory config
> > > option for application because of 'max_rx_pkt_len' does it.
> >
> > It is mandatory only if LRO offload is configured.
> 
> So max_rx_pkt_len will remain max size of one packet, while max_lro_len
> will be max accumulate size for each LRO session?
> 

Yes.

> BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.

Please see my change in drivers/net/ixgbe/ixgbe_ethdev.c.
Change to RTE_IPV4_MAX_PKT_LEN?

> ixgbe_vf, as I remember, doesn’t support LRO at all.

Please see my change in drivers/net/ixgbe/ixgbe_vf_representor.c
Remove it?

> 
> >
> > > Will it work, if:
> > > - If application doesn't provide this value, use the PMD max
> >
> > May cause a problem if the mbuf size is not enough for the PMD maximum.
> 
> Another question, what will happen if PMD will ignore that value and will
> generate packets bigger then requested?

PMD should use this value and not ignore it.

> 
> >
> > > - If both application and PMD doesn't provide this value, fail on
> configure()?
> >
> > It will work.
> > In my opinion - not ideal.
> >
> > Matan
> >


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 2/4] doc: changes to abi policy introducing major abi versions
  2019-11-06 21:07 10%     ` Thomas Monjalon
@ 2019-11-08 14:09  5%       ` Ray Kinsella
  0 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-08 14:09 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole



On 06/11/2019 21:07, Thomas Monjalon wrote:
> Hi,
> Please find the techboard comments below.
> 
> 06/11/2019 10:22, Ray Kinsella:
>> On 06/11/2019 09:06, Thomas Monjalon wrote:
>>> 06/11/2019 09:49, Ray Kinsella:
>>>> On 06/11/2019 00:11, Thomas Monjalon wrote:
>>>>> 05/11/2019 16:24, Ray Kinsella:
>>>>>> +#. Major ABI versions are declared every **year** and are then supported for one
>>>>>> +   year, typically aligned with the :ref:`LTS release <stable_lts_releases>`.
>>>>>
>>>>> As discussed earlier, a major ABI version can be declared less often
>>>>> than one year in the future.
>>>>> An ABI is supported more than one year, because of the LTS branches.
>>>>> That's why I propose to replace with this sentence:
>>>>> "
>>>>> Major ABI versions are declared regularly and are then supported for
>>>>> at least one year, typically aligned with the :ref:`LTS release <stable_lts_releases>`.
>>>>> "
>>>>
>>>> So look, this one was a decision of the technical board.
>>>
>>> The techboard didn't decide to change the ABI every year.
>>> We decided to review the duration after the first year, with a plan to extend.
>>>
>>>> My position is still what was agreed was, "declared every year, and supported for one year".
>>>> I like it, it's crystal clear what is the policy, until we change the policy.
>>>
>>> I think it gives a wrong message.
>>>
>>>> That said, I can make the change no problem, but I need some others to chime in to ok it. 
>>>> Perhaps at the head of the Techboard today?
>>>
>>> Yes I add it to the techboard meeting.
> 
> The techboard propose other rewords:
> "supported" may be replaced with "compatibility is enforced"
> "every year" may be replaced with "no more frequently than every year"
> "declared" may be replaced with "could be declared"
> 
> I think you got the idea. Please adjust wording to something more accurate.
> 
> ###

ACK - done in v9

> 
>>>>>> +A major ABI version is declared every year, aligned with that year's LTS
>>>>>> +release, e.g. v19.11. This ABI version is then supported for one year by all
>>>>>> +subsequent releases within that time period, until the next LTS release, e.g.
>>>>>> +v20.11.
>>>>>
>>>>> Let's reword like this:
>>>>> "
>>>>> A new major ABI version can be declared when a new LTS branch is started,
> 
> It has been suggested to replace "can" with "may".


ACK - I loosened the wording as described above "no more frequently than every year" etc in v9

> 
>>>>> e.g. ABI 19 for DPDK 19.11.0.
>>>>> This major ABI version is then supported until the next one,
>>>>> e.g. ABI 20 for DPDK 20.11.0.
>>>>> All ABI changes must be detailed in the release notes.
>>>>> "
> 
> My reword is wrong because ABI versions should be 20 and 21 respectively.

ACK - fixed

> 
>>>> This is more ambiguous, although what I said above stands.
>>>
>>> What you said is wrong because of 2 reasons:
>>> - it is not always one year for an major ABI
>>
>> Well that is a point of disagreement.
> 
> The techboard agreed to remove "every year".

ACK - loosened the wording. 

>>
>>> - it is always longer because of LTS branch
>>
>> Well I was pretty careful to qualify the ABI policy applies to releases over the year.
>> To distinguish it from LTS branch. 
> 
> As above, we may replace "ABI is supported" with
> "ABI compatibility is enforced".
> 
>>>> If there is general agreement with changing this part of the policy, I am ok to make 
>>>> the change.
>>>
>>> Yes let's review with the techboard.
> 
> Please try to reflect techboard comments while keeping something understandable :)
> 
> ###

ACK - yes, it is readable.

> 
>>>>>> +   ABI breakages due to changes such as reorganizing public
>>>>>> +   structure fields for aesthetic or readability purposes should be avoided.
>>>>>
>>>>> Why it should be avoided?
>>>>> If the ABI is broken anyway, I don't see any reason to not break it more.
>>>>
>>>> This is text from the original ABI Policy - I think the general sentiment still stands.
>>>> Just because you have an ABI Breakage window doesn't mean you should feel free to break
>>>> the ABI. The 3 ACKs required from Technical Board member to change the ABI, are another
>>>> reflection of this. 
>>>>
>>>> As a general rule.
>>>> Unnecessary changes should still be avoided, to reduce ABI churn between ABI versions.
>>>
>>> I agree we must avoid unnecessary API changes because it requires apps to adapt.
>>> But if the change is only ABI, and we are in an ABI-change window,
>>> I don't see any issue
> 
> The techboard agrees that the ABI changes are unlimited but API changes must be avoided.
> It is suggested to replace "ABI" with "API". I think this reword is better:
> "
> API changes such as reorganizing public structure fields
> for aesthetic or readability purposes should be avoided.
> "
> 
> ###

ACK - done

> 
>>>>>> +Libraries marked as ``experimental`` are entirely not considered part of an ABI
>>>>>> +version, and may change without warning at any time. Experimental libraries
>>>>>> +always have a major version of ``0`` to indicate they exist outside of
>>>>>> +ABI Versioning, with the minor version incremented with each ABI change
>>>>>> +to library.
>>>>>
>>>>> It means not all libraries will have the same ABI version.
>>>>> It is contrary of "ABI version is managed at a project level",
>>>>> and I don't see a real benefit of a different version number.
>>>>
>>>> There is a benefit, major version 0 is a very clear indication that 
>>>> the library exists outside of ABI management. 
>>>> A library isn't in the ABI, until it is in the ABI - an then it gets
>>>> added to the major version number. 
>>>>
>>>>> Anyway, some experimental functions can live inside a library
>>>>> with a stable ABI version number
>>>>
>>>> True, but if an entire library is experimental - let's be crystal 
>>>> clear about that. 
>>>
>>> I would like to see what others think.
> 
> The techboard decided to keep this policy: .0 for pure experimental libs.
> 
> 

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 11:56  0%                 ` Matan Azrad
  2019-11-08 12:51  0%                   ` Ferruh Yigit
@ 2019-11-08 13:11  0%                   ` Ananyev, Konstantin
  2019-11-08 14:10  0%                     ` Dekel Peled
  1 sibling, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-08 13:11 UTC (permalink / raw)
  To: Matan Azrad, Yigit, Ferruh, Dekel Peled, Mcnamara, John,
	Kovacevic, Marko, nhorman, ajit.khaparde, somnath.kotur, Burakov,
	Anatoly, xuanziyang2, cloud.wangxiaoyun, zhouguoyang, Lu,
	Wenzhuo, Shahaf Shuler, Slava Ovsiienko, rmody, shshaikh,
	maxime.coquelin, Bie, Tiwei, Wang, Zhihong, yongwang,
	Thomas Monjalon, arybchenko, Wu, Jingjing, Iremonger, Bernard
  Cc: dev



> -----Original Message-----
> From: Matan Azrad <matan@mellanox.com>
> Sent: Friday, November 8, 2019 11:56 AM
> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Dekel Peled <dekelp@mellanox.com>; Mcnamara, John <john.mcnamara@intel.com>;
> Kovacevic, Marko <marko.kovacevic@intel.com>; nhorman@tuxdriver.com; ajit.khaparde@broadcom.com;
> somnath.kotur@broadcom.com; Burakov, Anatoly <anatoly.burakov@intel.com>; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Shahaf Shuler <shahafs@mellanox.com>; Slava Ovsiienko <viacheslavo@mellanox.com>;
> rmody@marvell.com; shshaikh@marvell.com; maxime.coquelin@redhat.com; Bie, Tiwei <tiwei.bie@intel.com>; Wang, Zhihong
> <zhihong.wang@intel.com>; yongwang@vmware.com; Thomas Monjalon <thomas@monjalon.net>; arybchenko@solarflare.com; Wu,
> Jingjing <jingjing.wu@intel.com>; Iremonger, Bernard <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
> 
> 
> 
> From: Ferruh Yigit
> > On 11/8/2019 10:10 AM, Matan Azrad wrote:
> > >
> > >
> > > From: Ferruh Yigit
> > >> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> > >>> Hi
> > >>>
> > >>> From: Ferruh Yigit
> > >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> > >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> > >>>>>
> > >>>> 	RTE_ETHER_MAX_LEN;
> > >>>>>  	}
> > >>>>>
> > >>>>> +	/*
> > >>>>> +	 * If LRO is enabled, check that the maximum aggregated
> > packet
> > >>>>> +	 * size is supported by the configured device.
> > >>>>> +	 */
> > >>>>> +	if (dev_conf->rxmode.offloads &
> > DEV_RX_OFFLOAD_TCP_LRO) {
> > >>>>> +		ret = check_lro_pkt_size(
> > >>>>> +				port_id, dev_conf-
> > >>>>> rxmode.max_lro_pkt_size,
> > >>>>> +				dev_info.max_lro_pkt_size);
> > >>>>> +		if (ret != 0)
> > >>>>> +			goto rollback;
> > >>>>> +	}
> > >>>>> +
> > >>>>
> > >>>> This check forces applications that enable LRO to provide
> > >> 'max_lro_pkt_size'
> > >>>> config value.
> > >>>
> > >>> Yes.(we can break an API, we noticed it)
> > >>
> > >> I am not talking about API/ABI breakage, that part is OK.
> > >> With this check, if the application requested LRO offload but not
> > >> provided 'max_lro_pkt_size' value, device configuration will fail.
> > >>
> > > Yes
> > >> Can there be a case application is good with whatever the PMD can
> > >> support as max?
> > > Yes can be - you know, we can do everything we want but it is better to be
> > consistent:
> > > Due to the fact of Max rx pkt len field is mandatory for JUMBO offload, max
> > lro pkt len should be mandatory for LRO offload.
> > >
> > > So your question is actually why both, non-lro packets and LRO packets max
> > size are mandatory...
> > >
> > >
> > > I think it should be important values for net applications management.
> > > Also good for mbuf size managements.
> > >
> > >>>
> > >>>> - Why it is mandatory now, how it was working before if it is
> > >>>> mandatory value?
> > >>>
> > >>> It is the same as max_rx_pkt_len which is mandatory for jumbo frame
> > >> offload.
> > >>> So now, when the user configures a LRO offload he must to set max
> > >>> lro pkt
> > >> len.
> > >>> We don't want to confuse the user here with the max rx pkt len
> > >> configurations and behaviors, they should be with same logic.
> > >>>
> > >>> This parameter defines well the LRO behavior.
> > >>> Before this, each PMD took its own interpretation to what should be
> > >>> the
> > >> maximum size for LRO aggregated packets.
> > >>> Now, the user must say what is his intension, and the ethdev can
> > >>> limit it
> > >> according to the device capability.
> > >>> By this way, also, the PMD can organize\optimize its data-path more.
> > >>> Also, the application can create different mempools for LRO queues
> > >>> to
> > >> allow bigger packet receiving for LRO traffic.
> > >>>
> > >>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is '0'?
> > >>> Yes, you can see the feature description Dekel added.
> > >>> This patch also updates all the PMDs support an LRO for non-0 value.
> > >>
> > >> Of course I can see the updates Matan, my point is "What happens if
> > >> PMD doesn't provide 'max_lro_pkt_size'",
> > >> 1) There is no check for it right, so it is acceptable?
> > >
> > > There is check.
> > > If the capability is 0, any non-zero configuration will fail.
> > >
> > >> 2) Are we making this filed mandatory to provide for PMDs, it is easy
> > >> to make new fields mandatory for PMDs but is this really necessary?
> > >
> > > Yes, for consistence.
> > >
> > >>>
> > >>> as same as max rx pkt len, no?
> > >>>
> > >>>> - What do you think setting 'max_lro_pkt_size' config value to what
> > >>>> PMD provided if application doesn't provide it?
> > >>> Same answers as above.
> > >>>
> > >>
> > >> If application doesn't care the value, as it has been till now, and
> > >> not provided explicit 'max_lro_pkt_size', why not ethdev level use
> > >> the value provided by PMD instead of failing?
> > >
> > > Again, same question we can ask on max rx pkt len.
> > >
> > > Looks like the packet size is very important value which should be set by
> > the application.
> > >
> > > Previous applications have no option to configure it, so they haven't
> > configure it, (probably cover it somehow) I think it is our miss to supply this
> > info.
> > >
> > > Let's do it in same way as we do max rx pkt len (as this patch main idea).
> > > Later, we can change both to other meaning.
> > >
> >
> > I think it is not a good reason to introduce a new mandatory config option for
> > application because of 'max_rx_pkt_len' does it.
> 
> It is mandatory only if LRO offload is configured.

So max_rx_pkt_len will remain max size of one packet,
while max_lro_len will be max accumulate size for each LRO session?

BTW, I think that for ixgbe max lro is RTE_IPV4_MAX_PKT_LEN.
ixgbe_vf, as I remember, doesn’t support LRO at all.

> 
> > Will it work, if:
> > - If application doesn't provide this value, use the PMD max
> 
> May cause a problem if the mbuf size is not enough for the PMD maximum.

Another question, what will happen if PMD will ignore that value and will
generate packets bigger then requested?

> 
> > - If both application and PMD doesn't provide this value, fail on configure()?
> 
> It will work.
> In my opinion - not ideal.
> 
> Matan
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 11:56  0%                 ` Matan Azrad
@ 2019-11-08 12:51  0%                   ` Ferruh Yigit
  2019-11-08 16:11  0%                     ` Dekel Peled
  2019-11-09 18:20  3%                     ` Matan Azrad
  2019-11-08 13:11  0%                   ` Ananyev, Konstantin
  1 sibling, 2 replies; 200+ results
From: Ferruh Yigit @ 2019-11-08 12:51 UTC (permalink / raw)
  To: Matan Azrad, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

On 11/8/2019 11:56 AM, Matan Azrad wrote:
> 
> 
> From: Ferruh Yigit
>> On 11/8/2019 10:10 AM, Matan Azrad wrote:
>>>
>>>
>>> From: Ferruh Yigit
>>>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
>>>>> Hi
>>>>>
>>>>> From: Ferruh Yigit
>>>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
>>>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>>>>>>>
>>>>>> 	RTE_ETHER_MAX_LEN;
>>>>>>>  	}
>>>>>>>
>>>>>>> +	/*
>>>>>>> +	 * If LRO is enabled, check that the maximum aggregated
>> packet
>>>>>>> +	 * size is supported by the configured device.
>>>>>>> +	 */
>>>>>>> +	if (dev_conf->rxmode.offloads &
>> DEV_RX_OFFLOAD_TCP_LRO) {
>>>>>>> +		ret = check_lro_pkt_size(
>>>>>>> +				port_id, dev_conf-
>>>>>>> rxmode.max_lro_pkt_size,
>>>>>>> +				dev_info.max_lro_pkt_size);
>>>>>>> +		if (ret != 0)
>>>>>>> +			goto rollback;
>>>>>>> +	}
>>>>>>> +
>>>>>>
>>>>>> This check forces applications that enable LRO to provide
>>>> 'max_lro_pkt_size'
>>>>>> config value.
>>>>>
>>>>> Yes.(we can break an API, we noticed it)
>>>>
>>>> I am not talking about API/ABI breakage, that part is OK.
>>>> With this check, if the application requested LRO offload but not
>>>> provided 'max_lro_pkt_size' value, device configuration will fail.
>>>>
>>> Yes
>>>> Can there be a case application is good with whatever the PMD can
>>>> support as max?
>>> Yes can be - you know, we can do everything we want but it is better to be
>> consistent:
>>> Due to the fact of Max rx pkt len field is mandatory for JUMBO offload, max
>> lro pkt len should be mandatory for LRO offload.
>>>
>>> So your question is actually why both, non-lro packets and LRO packets max
>> size are mandatory...
>>>
>>>
>>> I think it should be important values for net applications management.
>>> Also good for mbuf size managements.
>>>
>>>>>
>>>>>> - Why it is mandatory now, how it was working before if it is
>>>>>> mandatory value?
>>>>>
>>>>> It is the same as max_rx_pkt_len which is mandatory for jumbo frame
>>>> offload.
>>>>> So now, when the user configures a LRO offload he must to set max
>>>>> lro pkt
>>>> len.
>>>>> We don't want to confuse the user here with the max rx pkt len
>>>> configurations and behaviors, they should be with same logic.
>>>>>
>>>>> This parameter defines well the LRO behavior.
>>>>> Before this, each PMD took its own interpretation to what should be
>>>>> the
>>>> maximum size for LRO aggregated packets.
>>>>> Now, the user must say what is his intension, and the ethdev can
>>>>> limit it
>>>> according to the device capability.
>>>>> By this way, also, the PMD can organize\optimize its data-path more.
>>>>> Also, the application can create different mempools for LRO queues
>>>>> to
>>>> allow bigger packet receiving for LRO traffic.
>>>>>
>>>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is '0'?
>>>>> Yes, you can see the feature description Dekel added.
>>>>> This patch also updates all the PMDs support an LRO for non-0 value.
>>>>
>>>> Of course I can see the updates Matan, my point is "What happens if
>>>> PMD doesn't provide 'max_lro_pkt_size'",
>>>> 1) There is no check for it right, so it is acceptable?
>>>
>>> There is check.
>>> If the capability is 0, any non-zero configuration will fail.
>>>
>>>> 2) Are we making this filed mandatory to provide for PMDs, it is easy
>>>> to make new fields mandatory for PMDs but is this really necessary?
>>>
>>> Yes, for consistence.
>>>
>>>>>
>>>>> as same as max rx pkt len, no?
>>>>>
>>>>>> - What do you think setting 'max_lro_pkt_size' config value to what
>>>>>> PMD provided if application doesn't provide it?
>>>>> Same answers as above.
>>>>>
>>>>
>>>> If application doesn't care the value, as it has been till now, and
>>>> not provided explicit 'max_lro_pkt_size', why not ethdev level use
>>>> the value provided by PMD instead of failing?
>>>
>>> Again, same question we can ask on max rx pkt len.
>>>
>>> Looks like the packet size is very important value which should be set by
>> the application.
>>>
>>> Previous applications have no option to configure it, so they haven't
>> configure it, (probably cover it somehow) I think it is our miss to supply this
>> info.
>>>
>>> Let's do it in same way as we do max rx pkt len (as this patch main idea).
>>> Later, we can change both to other meaning.
>>>
>>
>> I think it is not a good reason to introduce a new mandatory config option for
>> application because of 'max_rx_pkt_len' does it.
> 
> It is mandatory only if LRO offload is configured.
> 
>> Will it work, if:
>> - If application doesn't provide this value, use the PMD max
> 
> May cause a problem if the mbuf size is not enough for the PMD maximum.

OK, this is what I was missing, for this case I was thinking max_rx_pkt_len will
be used but you already explained that application may want to use different
mempools for LRO queues.

For this case shouldn't PMDs take the 'rxmode.max_lro_pkt_size' into account and
program the device accordingly (of course in LRO enabled case) ?
This part seems missing and should be highlighted to other PMD maintainers.

>  
>> - If both application and PMD doesn't provide this value, fail on configure()?
> 
> It will work.
> In my opinion - not ideal.
> 
> Matan
> 
> 


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v9 4/4] doc: add maintainer for abi policy
  2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
                   ` (2 preceding siblings ...)
  2019-11-08 12:46 35% ` [dpdk-dev] [PATCH v9 3/4] doc: updates to versioning guide for " Ray Kinsella
@ 2019-11-08 12:46 13% ` Ray Kinsella
  2019-11-08 17:18  4%   ` Thomas Monjalon
  2019-11-11 10:37 10% ` [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
  2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
  5 siblings, 1 reply; 200+ results
From: Ray Kinsella @ 2019-11-08 12:46 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Add an entry to the maintainer file for the abi policy.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
---
 MAINTAINERS | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 717c318..d5bb806 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -84,6 +84,10 @@ M: Marko Kovacevic <marko.kovacevic@intel.com>
 F: README
 F: doc/
 
+ABI Policy
+M: Ray Kinsella <mdr@ashroe.eu>
+F: doc/guides/contributing/abi_*.rst
+
 Developers and Maintainers Tools
 M: Thomas Monjalon <thomas@monjalon.net>
 F: MAINTAINERS
-- 
2.7.4


^ permalink raw reply	[relevance 13%]

* [dpdk-dev] [PATCH v9 3/4] doc: updates to versioning guide for abi versions
  2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
  2019-11-08 12:46 18% ` [dpdk-dev] [PATCH v9 1/4] doc: separate versioning.rst into version and policy Ray Kinsella
  2019-11-08 12:46 23% ` [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-08 12:46 35% ` Ray Kinsella
  2019-11-08 12:46 13% ` [dpdk-dev] [PATCH v9 4/4] doc: add maintainer for abi policy Ray Kinsella
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-08 12:46 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Updates to the ABI versioning guide, to account for the changes to the DPDK
ABI/API policy. Fixes for references to abi versioning and policy guides.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/contributing/abi_policy.rst     |  15 +-
 doc/guides/contributing/abi_versioning.rst | 250 +++++++++++++++++++----------
 doc/guides/contributing/patches.rst        |   6 +-
 doc/guides/rel_notes/deprecation.rst       |   6 +-
 4 files changed, 183 insertions(+), 94 deletions(-)

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index 0965bcc..6ebdd83 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -19,11 +19,11 @@ General Guidelines
 #. Major ABI version are usually but not always declared aligned with a
    :ref:`LTS release <stable_lts_releases>`.
 #. The ABI version is managed at a project level in DPDK, with the ABI version
-   reflected in all library's soname.
+   reflected in all :ref:`library's soname <what_is_soname>`.
 #. The ABI should be preserved and not changed lightly. ABI changes must follow
    the outlined :ref:`deprecation process <abi_changes>`.
 #. The addition of symbols is generally not problematic. The modification of
-   symbols is managed with ABI Versioning.
+   symbols is managed with :ref:`ABI Versioning <abi_versioning>`.
 #. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
    once approved these will form part of the next ABI version.
 #. Libraries or APIs marked as :ref:`Experimental <experimental_apis>` are not
@@ -67,13 +67,14 @@ An ABI version is an instance of a library's ABI at a specific release. Certain
 releases are considered to be milestone releases, the yearly LTS release for
 example. The ABI of a milestone release may be declared as a 'major ABI
 version', where this ABI version is then supported for some number of subsequent
-releases and is annotated in the library's soname.
+releases and is annotated in the library's :ref:`soname<what_is_soname>`.
 
 ABI version support in subsequent releases facilitates application upgrades, by
 enabling applications built against the milestone release to upgrade to
 subsequent releases of a library without a rebuild.
 
-More details on major ABI version can be found in the ABI Versioning guide.
+More details on major ABI version can be found in the :ref:`ABI versioning
+<major_abi_versions>` guide.
 
 The DPDK ABI policy
 -------------------
@@ -146,7 +147,7 @@ The requirements for changing the ABI are:
      CPU vendors, end-users, etc.
 
 #. Backward compatibility with the major ABI version must be maintained through
-   ABI Versioning, with :ref:`forward-only <forward-only>` compatibility
+   :ref:`abi_versioning`, with :ref:`forward-only <forward-only>` compatibility
    offered for any ABI changes that are indicated to be part of the next ABI
    version.
 
@@ -223,7 +224,7 @@ declarations of major ABI versions.
 
 * DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
   this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
-  preserved through ABI Versioning.
+  preserved through :ref:`abi_versioning`.
 
   - The new function may be marked with the ``__rte_experimental`` tag for a
     number of releases, as described in the section :ref:`experimental_apis`.
@@ -321,5 +322,5 @@ Libraries
 Libraries marked as ``experimental`` are entirely not considered part of an ABI
 version, and may change without warning at any time. Experimental libraries
 always have a major version of ``0`` to indicate they exist outside of
-ABI Versioning, with the minor version incremented with each ABI change
+:ref:`abi_versioning` , with the minor version incremented with each ABI change
 to library.
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
index 1c5612c..a3d5479 100644
--- a/doc/guides/contributing/abi_versioning.rst
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -1,44 +1,134 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2018 The DPDK contributors
 
-.. library_versioning:
+.. _abi_versioning:
 
-Library versioning
+ABI Versioning
+==============
+
+This document details the mechanics of ABI version management in DPDK.
+
+.. _what_is_soname:
+
+What is a library's soname?
+---------------------------
+
+System libraries usually adopt the familiar major and minor version naming
+convention, where major versions (e.g. ``librte_eal 20.x, 21.x``) are presumed
+to be ABI incompatible with each other and minor versions (e.g. ``librte_eal
+20.1, 20.2``) are presumed to be ABI compatible. A library's `soname
+<https://en.wikipedia.org/wiki/Soname>`_. is typically used to provide backward
+compatibility information about a given library, describing the lowest common
+denominator ABI supported by the library. The soname or logical name for the
+library, is typically comprised of the library's name and major version e.g.
+``librte_eal.so.20``.
+
+During an application's build process, a library's soname is noted as a runtime
+dependency of the application. This information is then used by the `dynamic
+linker <https://en.wikipedia.org/wiki/Dynamic_linker>`_ when resolving the
+applications dependencies at runtime, to load a library supporting the correct
+ABI version. The library loaded at runtime therefore, may be a minor revision
+supporting the same major ABI version (e.g. ``librte_eal.20.2``), as the library
+used to link the application (e.g ``librte_eal.20.0``).
+
+.. _major_abi_versions:
+
+Major ABI versions
 ------------------
 
-Downstreams might want to provide different DPDK releases at the same time to
-support multiple consumers of DPDK linked against older and newer sonames.
+An ABI version change to a given library, especially in core libraries such as
+``librte_mbuf``, may cause an implicit ripple effect on the ABI of it's
+consuming libraries, causing ABI breakages. There may however be no explicit
+reason to bump a dependent library's ABI version, as there may have been no
+obvious change to the dependent library's API, even though the library's ABI
+compatibility will have been broken.
+
+This interdependence of DPDK libraries, means that ABI versioning of libraries
+is more manageable at a project level, with all project libraries sharing a
+**single ABI version**. In addition, the need to maintain a stable ABI for some
+number of releases as described in the section :doc:`abi_policy`, means
+that ABI version increments need to carefully planned and managed at a project
+level.
+
+Major ABI versions are therefore declared typically aligned with an LTS release
+and is then supported some number of subsequent releases, shared across all
+libraries. This means that a single project level ABI version, reflected in all
+individual library's soname, library filenames and associated version maps
+persists over multiple releases.
+
+.. code-block:: none
+
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_20 {
+        global:
+ ...
 
-Also due to the interdependencies that DPDK libraries can have applications
-might end up with an executable space in which multiple versions of a library
-are mapped by ld.so.
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_20 {
+        global:
+ ...
 
-Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
-depending on LibA.
+When an ABI change is made between major ABI versions to a given library, a new
+section is added to that library's version map describing the impending new ABI
+version, as described in the section :ref:`example_abi_macro_usage`. The
+library's soname and filename however do not change, e.g. ``libacl.so.20``, as
+ABI compatibility with the last major ABI version continues to be preserved for
+that library.
 
-.. note::
+.. code-block:: none
 
-    Application
-    \-> LibA.old
-    \-> LibB.new -> LibA.new
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_20 {
+        global:
+ ...
 
-That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
-If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
-library - versions defined in the libraries ``LIBABIVER``.
-An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
-``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
+ DPDK_21 {
+        global:
+
+ } DPDK_20;
+ ...
 
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_20 {
+        global:
+ ...
+
+However when a new ABI version is declared, for example DPDK ``21``, old
+depreciated functions may be safely removed at this point and the entire old
+major ABI version removed, see the section :ref:`deprecating_entire_abi` on
+how this may be done.
+
+.. code-block:: none
+
+ $ head ./lib/librte_acl/rte_acl_version.map
+ DPDK_21 {
+        global:
+ ...
+
+ $ head ./lib/librte_eal/rte_eal_version.map
+ DPDK_21 {
+        global:
+ ...
+
+At the same time, the major ABI version is changed atomically across all
+libraries by incrementing the major version in individual library's soname, e.g.
+``libacl.so.21``. This is done by bumping the LIBABIVER number in the libraries
+Makefile to indicate to dynamic linking applications that this is a later, and
+possibly incompatible library version:
+
+.. code-block:: c
+
+   -LIBABIVER := 20
+   +LIBABIVER := 21
 
-ABI versioning
---------------
 
 Versioning Macros
-~~~~~~~~~~~~~~~~~
+-----------------
 
 When a symbol is exported from a library to provide an API, it also provides a
 calling convention (ABI) that is embodied in its name, return type and
 arguments. Occasionally that function may need to change to accommodate new
-functionality or behavior. When that occurs, it is desirable to allow for
+functionality or behavior. When that occurs, it is may be required to allow for
 backward compatibility for a time with older binaries that are dynamically
 linked to the DPDK.
 
@@ -61,8 +151,10 @@ The macros exported are:
   fully qualified function ``p``, so that if a symbol becomes versioned, it
   can still be mapped back to the public symbol name.
 
+.. _example_abi_macro_usage:
+
 Examples of ABI Macro use
-^^^^^^^^^^^^^^^^^^^^^^^^^
+~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Updating a public API
 _____________________
@@ -106,16 +198,16 @@ maintain previous ABI versions that are accessible only to previously compiled
 binaries
 
 The addition of a parameter to the function is ABI breaking as the function is
-public, and existing application may use it in its current form.  However, the
+public, and existing application may use it in its current form. However, the
 compatibility macros in DPDK allow a developer to use symbol versioning so that
 multiple functions can be mapped to the same public symbol based on when an
-application was linked to it.  To see how this is done, we start with the
-requisite libraries version map file.  Initially the version map file for the
-acl library looks like this
+application was linked to it. To see how this is done, we start with the
+requisite libraries version map file. Initially the version map file for the acl
+library looks like this
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -141,7 +233,7 @@ This file needs to be modified as follows
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -163,16 +255,16 @@ This file needs to be modified as follows
         local: *;
    };
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
         rte_acl_create;
 
-   } DPDK_2.0;
+   } DPDK_20;
 
 The addition of the new block tells the linker that a new version node is
-available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
-symbols from the DPDK_2.0 node.  This list is directly translated into a list of
-exported symbols when DPDK is compiled as a shared library
+available (DPDK_21), which contains the symbol rte_acl_create, and inherits
+the symbols from the DPDK_20 node. This list is directly translated into a
+list of exported symbols when DPDK is compiled as a shared library
 
 Next, we need to specify in the code which function map to the rte_acl_create
 symbol at which versions.  First, at the site of the initial symbol definition,
@@ -191,22 +283,22 @@ with the public symbol name
 
 Note that the base name of the symbol was kept intact, as this is conducive to
 the macros used for versioning symbols.  That is our next step, mapping this new
-symbol name to the initial symbol name at version node 2.0.  Immediately after
+symbol name to the initial symbol name at version node 20.  Immediately after
 the function, we add this line of code
 
 .. code-block:: c
 
-   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+   VERSION_SYMBOL(rte_acl_create, _v20, 20);
 
-Remembering to also add the rte_function_versioning.h header to the requisite c file where
-these changes are being made.  The above macro instructs the linker to create a
-new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
-builds, but now points to the above newly named function.  We have now mapped
-the original rte_acl_create symbol to the original function (but with a new
-name)
+Remembering to also add the rte_function_versioning.h header to the requisite c
+file where these changes are being made. The above macro instructs the linker to
+create a new symbol ``rte_acl_create@DPDK_20``, which matches the symbol created
+in older builds, but now points to the above newly named function. We have now
+mapped the original rte_acl_create symbol to the original function (but with a
+new name).
 
-Next, we need to create the 2.1 version of the symbol.  We create a new function
-name, with a different suffix, and  implement it appropriately
+Next, we need to create the 21 version of the symbol. We create a new function
+name, with a different suffix, and implement it appropriately
 
 .. code-block:: c
 
@@ -220,12 +312,12 @@ name, with a different suffix, and  implement it appropriately
         return ctx;
    }
 
-This code serves as our new API call.  Its the same as our old call, but adds
-the new parameter in place.  Next we need to map this function to the symbol
-``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
-in the header file, adding the macro there to inform all including applications,
-that on re-link, the default rte_acl_create symbol should point to this
-function.  Note that we could do this by simply naming the function above
+This code serves as our new API call. Its the same as our old call, but adds the
+new parameter in place. Next we need to map this function to the symbol
+``rte_acl_create@DPDK_21``. To do this, we modify the public prototype of the
+call in the header file, adding the macro there to inform all including
+applications, that on re-link, the default rte_acl_create symbol should point to
+this function. Note that we could do this by simply naming the function above
 rte_acl_create, and the linker would chose the most recent version tag to apply
 in the version script, but we can also do this in the header file
 
@@ -233,11 +325,11 @@ in the version script, but we can also do this in the header file
 
    struct rte_acl_ctx *
    -rte_acl_create(const struct rte_acl_param *param);
-   +rte_acl_create(const struct rte_acl_param *param, int debug);
-   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+   +rte_acl_create_v21(const struct rte_acl_param *param, int debug);
+   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 21);
 
 The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
-header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
+header, to link to the rte_acl_create_v21 function and apply the DPDK_21
 version node to it.  This method is more explicit and flexible than just
 re-implementing the exact symbol name, and allows for other features (such as
 linking to the old symbol version by default, when the new ABI is to be opt-in
@@ -257,6 +349,7 @@ assumption is that the most recent version of the symbol is the one you want to
 map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
 defined, we add this
 
+
 .. code-block:: c
 
    struct rte_acl_ctx *
@@ -270,21 +363,22 @@ That tells the compiler that, when building a static library, any calls to the
 symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
 
 That's it, on the next shared library rebuild, there will be two versions of
-rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
-and a new DPDK_2.1 version, used by future built applications.
+rte_acl_create, an old DPDK_20 version, used by previously built applications,
+and a new DPDK_21 version, used by future built applications.
 
 
 Deprecating part of a public API
 ________________________________
 
-Lets assume that you've done the above update, and after a few releases have
-passed you decide you would like to retire the old version of the function.
-After having gone through the ABI deprecation announcement process, removal is
-easy.  Start by removing the symbol from the requisite version map file:
+Lets assume that you've done the above update, and in preparation for the next
+major ABI version you decide you would like to retire the old version of the
+function. After having gone through the ABI deprecation announcement process,
+removal is easy. Start by removing the symbol from the requisite version map
+file:
 
 .. code-block:: none
 
-   DPDK_2.0 {
+   DPDK_20 {
         global:
 
         rte_acl_add_rules;
@@ -306,48 +400,42 @@ easy.  Start by removing the symbol from the requisite version map file:
         local: *;
    };
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
         rte_acl_create;
-   } DPDK_2.0;
+   } DPDK_20;
 
 
 Next remove the corresponding versioned export.
 
 .. code-block:: c
 
- -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+ -VERSION_SYMBOL(rte_acl_create, _v20, 20);
 
 
 Note that the internal function definition could also be removed, but its used
-in our example by the newer version _v21, so we leave it in place.  This is a
-coding style choice.
-
-Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
-indicate to applications doing dynamic linking that this is a later, and
-possibly incompatible library version:
-
-.. code-block:: c
+in our example by the newer version v21, so we leave it in place and declare it
+as static. This is a coding style choice.
 
-   -LIBABIVER := 1
-   +LIBABIVER := 2
+.. _deprecating_entire_abi:
 
 Deprecating an entire ABI version
 _________________________________
 
-While removing a symbol from and ABI may be useful, it is often more practical
-to remove an entire version node at once.  If a version node completely
-specifies an API, then removing part of it, typically makes it incomplete.  In
-those cases it is better to remove the entire node
+While removing a symbol from an ABI may be useful, it is more practical to
+remove an entire version node at once, as is typically done at the declaration
+of a major ABI version. If a version node completely specifies an API, then
+removing part of it, typically makes it incomplete. In those cases it is better
+to remove the entire node.
 
 To do this, start by modifying the version map file, such that all symbols from
-the node to be removed are merged into the next node in the map
+the node to be removed are merged into the next node in the map.
 
 In the case of our map above, it would transform to look as follows
 
 .. code-block:: none
 
-   DPDK_2.1 {
+   DPDK_21 {
         global:
 
         rte_acl_add_rules;
@@ -375,8 +463,8 @@ symbols.
 
 .. code-block:: c
 
- -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
- +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+ -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 20);
+ +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 21);
 
 Lastly, any VERSION_SYMBOL macros that point to the old version node should be
 removed, taking care to keep, where need old code in place to support newer
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index c9ec529..2140303 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -156,9 +156,9 @@ Make your planned changes in the cloned ``dpdk`` repo. Here are some guidelines
 
   * For other PMDs and more info, refer to the ``MAINTAINERS`` file.
 
-* New external functions should be added to the local ``version.map`` file.
-  See the :doc:`Guidelines for ABI policy and versioning </contributing/abi_versioning>`.
-  New external functions should also be added in alphabetical order.
+* New external functions should be added to the local ``version.map`` file. See
+  the :doc:`ABI policy <abi_policy>` and :ref:`ABI versioning <abi_versioning>`
+  guides. New external functions should also be added in alphabetical order.
 
 * Important changes will require an addition to the release notes in ``doc/guides/rel_notes/``.
   See the :ref:`Release Notes section of the Documentation Guidelines <doc_guidelines>` for details.
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index cf37d80..d454915 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,9 +4,9 @@
 ABI and API Deprecation
 =======================
 
-See the :doc:`guidelines document for details of the ABI policy </contributing/abi_versioning>`.
-API and ABI deprecation notices are to be posted here.
-
+See the guidelines document for details of the :doc:`ABI policy
+<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
+here.
 
 Deprecation Notices
 -------------------
-- 
2.7.4


^ permalink raw reply	[relevance 35%]

* [dpdk-dev] [PATCH v9 1/4] doc: separate versioning.rst into version and policy
  2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
@ 2019-11-08 12:46 18% ` Ray Kinsella
  2019-11-08 12:46 23% ` [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 200+ results
From: Ray Kinsella @ 2019-11-08 12:46 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

Separate versioning.rst into abi versioning and abi policy guidance, in
preparation for adding more detail to the abi policy.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/contributing/abi_policy.rst     | 167 ++++++++
 doc/guides/contributing/abi_versioning.rst | 427 +++++++++++++++++++++
 doc/guides/contributing/index.rst          |   3 +-
 doc/guides/contributing/patches.rst        |   2 +-
 doc/guides/contributing/versioning.rst     | 591 -----------------------------
 doc/guides/rel_notes/deprecation.rst       |   2 +-
 6 files changed, 598 insertions(+), 594 deletions(-)
 create mode 100644 doc/guides/contributing/abi_policy.rst
 create mode 100644 doc/guides/contributing/abi_versioning.rst
 delete mode 100644 doc/guides/contributing/versioning.rst

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
new file mode 100644
index 0000000..d4f4e9f
--- /dev/null
+++ b/doc/guides/contributing/abi_policy.rst
@@ -0,0 +1,167 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright 2018 The DPDK contributors
+
+DPDK ABI/API policy
+===================
+
+Description
+-----------
+
+This document details some methods for handling ABI management in the DPDK.
+
+General Guidelines
+------------------
+
+#. Whenever possible, ABI should be preserved
+#. ABI/API may be changed with a deprecation process
+#. The modification of symbols can generally be managed with versioning
+#. Libraries or APIs marked in ``experimental`` state may change without constraint
+#. New APIs will be marked as ``experimental`` for at least one release to allow
+   any issues found by users of the new API to be fixed quickly
+#. The addition of symbols is generally not problematic
+#. The removal of symbols generally is an ABI break and requires bumping of the
+   LIBABIVER macro
+#. Updates to the minimum hardware requirements, which drop support for hardware which
+   was previously supported, should be treated as an ABI change.
+
+What is an ABI
+~~~~~~~~~~~~~~
+
+An ABI (Application Binary Interface) is the set of runtime interfaces exposed
+by a library. It is similar to an API (Application Programming Interface) but
+is the result of compilation.  It is also effectively cloned when applications
+link to dynamic libraries.  That is to say when an application is compiled to
+link against dynamic libraries, it is assumed that the ABI remains constant
+between the time the application is compiled/linked, and the time that it runs.
+Therefore, in the case of dynamic linking, it is critical that an ABI is
+preserved, or (when modified), done in such a way that the application is unable
+to behave improperly or in an unexpected fashion.
+
+
+ABI/API Deprecation
+-------------------
+
+The DPDK ABI policy
+~~~~~~~~~~~~~~~~~~~
+
+ABI versions are set at the time of major release labeling, and the ABI may
+change multiple times, without warning, between the last release label and the
+HEAD label of the git tree.
+
+ABI versions, once released, are available until such time as their
+deprecation has been noted in the Release Notes for at least one major release
+cycle. For example consider the case where the ABI for DPDK 2.0 has been
+shipped and then a decision is made to modify it during the development of
+DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
+release and the modification will be made available in the DPDK 2.2 release.
+
+ABI versions may be deprecated in whole or in part as needed by a given
+update.
+
+Some ABI changes may be too significant to reasonably maintain multiple
+versions. In those cases ABI's may be updated without backward compatibility
+being provided. The requirements for doing so are:
+
+#. At least 3 acknowledgments of the need to do so must be made on the
+   dpdk.org mailing list.
+
+   - The acknowledgment of the maintainer of the component is mandatory, or if
+     no maintainer is available for the component, the tree/sub-tree maintainer
+     for that component must acknowledge the ABI change instead.
+
+   - It is also recommended that acknowledgments from different "areas of
+     interest" be sought for each deprecation, for example: from NIC vendors,
+     CPU vendors, end-users, etc.
+
+#. The changes (including an alternative map file) can be included with
+   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
+   to provide more details about oncoming changes.
+   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
+   More preferred way to provide this information is sending the feature
+   as a separate patch and reference it in deprecation notice.
+
+#. A full deprecation cycle, as explained above, must be made to offer
+   downstream consumers sufficient warning of the change.
+
+Note that the above process for ABI deprecation should not be undertaken
+lightly. ABI stability is extremely important for downstream consumers of the
+DPDK, especially when distributed in shared object form. Every effort should
+be made to preserve the ABI whenever possible. The ABI should only be changed
+for significant reasons, such as performance enhancements. ABI breakage due to
+changes such as reorganizing public structure fields for aesthetic or
+readability purposes should be avoided.
+
+.. note::
+
+   Updates to the minimum hardware requirements, which drop support for hardware
+   which was previously supported, should be treated as an ABI change, and
+   follow the relevant deprecation policy procedures as above: 3 acks and
+   announcement at least one release in advance.
+
+Examples of Deprecation Notices
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following are some examples of ABI deprecation notices which would be
+added to the Release Notes:
+
+* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
+  to be replaced with the inline function ``rte_foo()``.
+
+* The function ``rte_mbuf_grok()`` has been updated to include a new parameter
+  in version 2.0. Backwards compatibility will be maintained for this function
+  until the release of version 2.1
+
+* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
+  performance reasons. Existing binary applications will have backwards
+  compatibility in release 2.0, while newly built binaries will need to
+  reference the new structure variant ``struct rte_foo2``. Compatibility will
+  be removed in release 2.2, and all applications will require updating and
+  rebuilding to the new structure at that time, which will be renamed to the
+  original ``struct rte_foo``.
+
+* Significant ABI changes are planned for the ``librte_dostuff`` library. The
+  upcoming release 2.0 will not contain these changes, but release 2.1 will,
+  and no backwards compatibility is planned due to the extensive nature of
+  these changes. Binaries using this library built prior to version 2.1 will
+  require updating and recompilation.
+
+New API replacing previous one
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a new API proposed functionally replaces an existing one, when the new API
+becomes non-experimental then the old one is marked with ``__rte_deprecated``.
+Deprecated APIs are removed completely just after the next LTS.
+
+Reminder that old API should follow deprecation process to be removed.
+
+
+Experimental APIs
+-----------------
+
+APIs marked as ``experimental`` are not considered part of the ABI and may
+change without warning at any time.  Since changes to APIs are most likely
+immediately after their introduction, as users begin to take advantage of
+those new APIs and start finding issues with them, new DPDK APIs will be
+automatically marked as ``experimental`` to allow for a period of stabilization
+before they become part of a tracked ABI.
+
+Note that marking an API as experimental is a multi step process.
+To mark an API as experimental, the symbols which are desired to be exported
+must be placed in an EXPERIMENTAL version block in the corresponding libraries'
+version map script.
+Secondly, the corresponding prototypes of those exported functions (in the
+development header files), must be marked with the ``__rte_experimental`` tag
+(see ``rte_compat.h``).
+The DPDK build makefiles perform a check to ensure that the map file and the
+C code reflect the same list of symbols.
+This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
+during compilation in the corresponding library Makefile.
+
+In addition to tagging the code with ``__rte_experimental``,
+the doxygen markup must also contain the EXPERIMENTAL string,
+and the MAINTAINERS file should note the EXPERIMENTAL libraries.
+
+For removing the experimental tag associated with an API, deprecation notice
+is not required. Though, an API should remain in experimental state for at least
+one release. Thereafter, normal process of posting patch for review to mailing
+list can be followed.
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
new file mode 100644
index 0000000..1c5612c
--- /dev/null
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -0,0 +1,427 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright 2018 The DPDK contributors
+
+.. library_versioning:
+
+Library versioning
+------------------
+
+Downstreams might want to provide different DPDK releases at the same time to
+support multiple consumers of DPDK linked against older and newer sonames.
+
+Also due to the interdependencies that DPDK libraries can have applications
+might end up with an executable space in which multiple versions of a library
+are mapped by ld.so.
+
+Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
+depending on LibA.
+
+.. note::
+
+    Application
+    \-> LibA.old
+    \-> LibB.new -> LibA.new
+
+That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
+If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
+library - versions defined in the libraries ``LIBABIVER``.
+An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
+``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
+
+
+ABI versioning
+--------------
+
+Versioning Macros
+~~~~~~~~~~~~~~~~~
+
+When a symbol is exported from a library to provide an API, it also provides a
+calling convention (ABI) that is embodied in its name, return type and
+arguments. Occasionally that function may need to change to accommodate new
+functionality or behavior. When that occurs, it is desirable to allow for
+backward compatibility for a time with older binaries that are dynamically
+linked to the DPDK.
+
+To support backward compatibility the ``rte_function_versioning.h``
+header file provides macros to use when updating exported functions. These
+macros are used in conjunction with the ``rte_<library>_version.map`` file for
+a given library to allow multiple versions of a symbol to exist in a shared
+library so that older binaries need not be immediately recompiled.
+
+The macros exported are:
+
+* ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
+  versioned symbol ``b@DPDK_n`` to the internal function ``b_e``.
+
+* ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
+  the linker to bind references to symbol ``b`` to the internal symbol
+  ``b_e``.
+
+* ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
+  fully qualified function ``p``, so that if a symbol becomes versioned, it
+  can still be mapped back to the public symbol name.
+
+Examples of ABI Macro use
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Updating a public API
+_____________________
+
+Assume we have a function as follows
+
+.. code-block:: c
+
+ /*
+  * Create an acl context object for apps to
+  * manipulate
+  */
+ struct rte_acl_ctx *
+ rte_acl_create(const struct rte_acl_param *param)
+ {
+        ...
+ }
+
+
+Assume that struct rte_acl_ctx is a private structure, and that a developer
+wishes to enhance the acl api so that a debugging flag can be enabled on a
+per-context basis.  This requires an addition to the structure (which, being
+private, is safe), but it also requires modifying the code as follows
+
+.. code-block:: c
+
+ /*
+  * Create an acl context object for apps to
+  * manipulate
+  */
+ struct rte_acl_ctx *
+ rte_acl_create(const struct rte_acl_param *param, int debug)
+ {
+        ...
+ }
+
+
+Note also that, being a public function, the header file prototype must also be
+changed, as must all the call sites, to reflect the new ABI footprint.  We will
+maintain previous ABI versions that are accessible only to previously compiled
+binaries
+
+The addition of a parameter to the function is ABI breaking as the function is
+public, and existing application may use it in its current form.  However, the
+compatibility macros in DPDK allow a developer to use symbol versioning so that
+multiple functions can be mapped to the same public symbol based on when an
+application was linked to it.  To see how this is done, we start with the
+requisite libraries version map file.  Initially the version map file for the
+acl library looks like this
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_create;
+        rte_acl_dump;
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+This file needs to be modified as follows
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_create;
+        rte_acl_dump;
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+   DPDK_2.1 {
+        global:
+        rte_acl_create;
+
+   } DPDK_2.0;
+
+The addition of the new block tells the linker that a new version node is
+available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
+symbols from the DPDK_2.0 node.  This list is directly translated into a list of
+exported symbols when DPDK is compiled as a shared library
+
+Next, we need to specify in the code which function map to the rte_acl_create
+symbol at which versions.  First, at the site of the initial symbol definition,
+we need to update the function so that it is uniquely named, and not in conflict
+with the public symbol name
+
+.. code-block:: c
+
+  struct rte_acl_ctx *
+ -rte_acl_create(const struct rte_acl_param *param)
+ +rte_acl_create_v20(const struct rte_acl_param *param)
+ {
+        size_t sz;
+        struct rte_acl_ctx *ctx;
+        ...
+
+Note that the base name of the symbol was kept intact, as this is conducive to
+the macros used for versioning symbols.  That is our next step, mapping this new
+symbol name to the initial symbol name at version node 2.0.  Immediately after
+the function, we add this line of code
+
+.. code-block:: c
+
+   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+
+Remembering to also add the rte_function_versioning.h header to the requisite c file where
+these changes are being made.  The above macro instructs the linker to create a
+new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
+builds, but now points to the above newly named function.  We have now mapped
+the original rte_acl_create symbol to the original function (but with a new
+name)
+
+Next, we need to create the 2.1 version of the symbol.  We create a new function
+name, with a different suffix, and  implement it appropriately
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   rte_acl_create_v21(const struct rte_acl_param *param, int debug);
+   {
+        struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
+
+        ctx->debug = debug;
+
+        return ctx;
+   }
+
+This code serves as our new API call.  Its the same as our old call, but adds
+the new parameter in place.  Next we need to map this function to the symbol
+``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
+in the header file, adding the macro there to inform all including applications,
+that on re-link, the default rte_acl_create symbol should point to this
+function.  Note that we could do this by simply naming the function above
+rte_acl_create, and the linker would chose the most recent version tag to apply
+in the version script, but we can also do this in the header file
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   -rte_acl_create(const struct rte_acl_param *param);
+   +rte_acl_create(const struct rte_acl_param *param, int debug);
+   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+
+The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
+header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
+version node to it.  This method is more explicit and flexible than just
+re-implementing the exact symbol name, and allows for other features (such as
+linking to the old symbol version by default, when the new ABI is to be opt-in
+for a period.
+
+One last thing we need to do.  Note that we've taken what was a public symbol,
+and duplicated it into two uniquely and differently named symbols.  We've then
+mapped each of those back to the public symbol ``rte_acl_create`` with different
+version tags.  This only applies to dynamic linking, as static linking has no
+notion of versioning.  That leaves this code in a position of no longer having a
+symbol simply named ``rte_acl_create`` and a static build will fail on that
+missing symbol.
+
+To correct this, we can simply map a function of our choosing back to the public
+symbol in the static build with the ``MAP_STATIC_SYMBOL`` macro.  Generally the
+assumption is that the most recent version of the symbol is the one you want to
+map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
+defined, we add this
+
+.. code-block:: c
+
+   struct rte_acl_ctx *
+   rte_acl_create_v21(const struct rte_acl_param *param, int debug)
+   {
+        ...
+   }
+   MAP_STATIC_SYMBOL(struct rte_acl_ctx *rte_acl_create(const struct rte_acl_param *param, int debug), rte_acl_create_v21);
+
+That tells the compiler that, when building a static library, any calls to the
+symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
+
+That's it, on the next shared library rebuild, there will be two versions of
+rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
+and a new DPDK_2.1 version, used by future built applications.
+
+
+Deprecating part of a public API
+________________________________
+
+Lets assume that you've done the above update, and after a few releases have
+passed you decide you would like to retire the old version of the function.
+After having gone through the ABI deprecation announcement process, removal is
+easy.  Start by removing the symbol from the requisite version map file:
+
+.. code-block:: none
+
+   DPDK_2.0 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_dump;
+ -      rte_acl_create
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+   };
+
+   DPDK_2.1 {
+        global:
+        rte_acl_create;
+   } DPDK_2.0;
+
+
+Next remove the corresponding versioned export.
+
+.. code-block:: c
+
+ -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
+
+
+Note that the internal function definition could also be removed, but its used
+in our example by the newer version _v21, so we leave it in place.  This is a
+coding style choice.
+
+Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
+indicate to applications doing dynamic linking that this is a later, and
+possibly incompatible library version:
+
+.. code-block:: c
+
+   -LIBABIVER := 1
+   +LIBABIVER := 2
+
+Deprecating an entire ABI version
+_________________________________
+
+While removing a symbol from and ABI may be useful, it is often more practical
+to remove an entire version node at once.  If a version node completely
+specifies an API, then removing part of it, typically makes it incomplete.  In
+those cases it is better to remove the entire node
+
+To do this, start by modifying the version map file, such that all symbols from
+the node to be removed are merged into the next node in the map
+
+In the case of our map above, it would transform to look as follows
+
+.. code-block:: none
+
+   DPDK_2.1 {
+        global:
+
+        rte_acl_add_rules;
+        rte_acl_build;
+        rte_acl_classify;
+        rte_acl_classify_alg;
+        rte_acl_classify_scalar;
+        rte_acl_dump;
+        rte_acl_create
+        rte_acl_find_existing;
+        rte_acl_free;
+        rte_acl_ipv4vlan_add_rules;
+        rte_acl_ipv4vlan_build;
+        rte_acl_list_dump;
+        rte_acl_reset;
+        rte_acl_reset_rules;
+        rte_acl_set_ctx_classify;
+
+        local: *;
+ };
+
+Then any uses of BIND_DEFAULT_SYMBOL that pointed to the old node should be
+updated to point to the new version node in any header files for all affected
+symbols.
+
+.. code-block:: c
+
+ -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
+ +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
+
+Lastly, any VERSION_SYMBOL macros that point to the old version node should be
+removed, taking care to keep, where need old code in place to support newer
+versions of the symbol.
+
+
+Running the ABI Validator
+-------------------------
+
+The ``devtools`` directory in the DPDK source tree contains a utility program,
+``validate-abi.sh``, for validating the DPDK ABI based on the Linux `ABI
+Compliance Checker
+<http://ispras.linuxbase.org/index.php/ABI_compliance_checker>`_.
+
+This has a dependency on the ``abi-compliance-checker`` and ``and abi-dumper``
+utilities which can be installed via a package manager. For example::
+
+   sudo yum install abi-compliance-checker
+   sudo yum install abi-dumper
+
+The syntax of the ``validate-abi.sh`` utility is::
+
+   ./devtools/validate-abi.sh <REV1> <REV2>
+
+Where ``REV1`` and ``REV2`` are valid gitrevisions(7)
+https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
+on the local repo.
+
+For example::
+
+   # Check between the previous and latest commit:
+   ./devtools/validate-abi.sh HEAD~1 HEAD
+
+   # Check on a specific compilation target:
+   ./devtools/validate-abi.sh -t x86_64-native-linux-gcc HEAD~1 HEAD
+
+   # Check between two tags:
+   ./devtools/validate-abi.sh v2.0.0 v2.1.0
+
+   # Check between git master and local topic-branch "vhost-hacking":
+   ./devtools/validate-abi.sh master vhost-hacking
+
+After the validation script completes (it can take a while since it need to
+compile both tags) it will create compatibility reports in the
+``./abi-check/compat_report`` directory. Listed incompatibilities can be found
+as follows::
+
+  grep -lr Incompatible abi-check/compat_reports/
diff --git a/doc/guides/contributing/index.rst b/doc/guides/contributing/index.rst
index e2608d3..2fefd91 100644
--- a/doc/guides/contributing/index.rst
+++ b/doc/guides/contributing/index.rst
@@ -10,7 +10,8 @@ Contributor's Guidelines
 
     coding_style
     design
-    versioning
+    abi_policy
+    abi_versioning
     documentation
     patches
     vulnerability
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index 9e1013b..c9ec529 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -157,7 +157,7 @@ Make your planned changes in the cloned ``dpdk`` repo. Here are some guidelines
   * For other PMDs and more info, refer to the ``MAINTAINERS`` file.
 
 * New external functions should be added to the local ``version.map`` file.
-  See the :doc:`Guidelines for ABI policy and versioning </contributing/versioning>`.
+  See the :doc:`Guidelines for ABI policy and versioning </contributing/abi_versioning>`.
   New external functions should also be added in alphabetical order.
 
 * Important changes will require an addition to the release notes in ``doc/guides/rel_notes/``.
diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
deleted file mode 100644
index 64984c5..0000000
--- a/doc/guides/contributing/versioning.rst
+++ /dev/null
@@ -1,591 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright 2018 The DPDK contributors
-
-DPDK ABI/API policy
-===================
-
-Description
------------
-
-This document details some methods for handling ABI management in the DPDK.
-
-General Guidelines
-------------------
-
-#. Whenever possible, ABI should be preserved
-#. ABI/API may be changed with a deprecation process
-#. The modification of symbols can generally be managed with versioning
-#. Libraries or APIs marked in ``experimental`` state may change without constraint
-#. New APIs will be marked as ``experimental`` for at least one release to allow
-   any issues found by users of the new API to be fixed quickly
-#. The addition of symbols is generally not problematic
-#. The removal of symbols generally is an ABI break and requires bumping of the
-   LIBABIVER macro
-#. Updates to the minimum hardware requirements, which drop support for hardware which
-   was previously supported, should be treated as an ABI change.
-
-What is an ABI
-~~~~~~~~~~~~~~
-
-An ABI (Application Binary Interface) is the set of runtime interfaces exposed
-by a library. It is similar to an API (Application Programming Interface) but
-is the result of compilation.  It is also effectively cloned when applications
-link to dynamic libraries.  That is to say when an application is compiled to
-link against dynamic libraries, it is assumed that the ABI remains constant
-between the time the application is compiled/linked, and the time that it runs.
-Therefore, in the case of dynamic linking, it is critical that an ABI is
-preserved, or (when modified), done in such a way that the application is unable
-to behave improperly or in an unexpected fashion.
-
-
-ABI/API Deprecation
--------------------
-
-The DPDK ABI policy
-~~~~~~~~~~~~~~~~~~~
-
-ABI versions are set at the time of major release labeling, and the ABI may
-change multiple times, without warning, between the last release label and the
-HEAD label of the git tree.
-
-ABI versions, once released, are available until such time as their
-deprecation has been noted in the Release Notes for at least one major release
-cycle. For example consider the case where the ABI for DPDK 2.0 has been
-shipped and then a decision is made to modify it during the development of
-DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
-release and the modification will be made available in the DPDK 2.2 release.
-
-ABI versions may be deprecated in whole or in part as needed by a given
-update.
-
-Some ABI changes may be too significant to reasonably maintain multiple
-versions. In those cases ABI's may be updated without backward compatibility
-being provided. The requirements for doing so are:
-
-#. At least 3 acknowledgments of the need to do so must be made on the
-   dpdk.org mailing list.
-
-   - The acknowledgment of the maintainer of the component is mandatory, or if
-     no maintainer is available for the component, the tree/sub-tree maintainer
-     for that component must acknowledge the ABI change instead.
-
-   - It is also recommended that acknowledgments from different "areas of
-     interest" be sought for each deprecation, for example: from NIC vendors,
-     CPU vendors, end-users, etc.
-
-#. The changes (including an alternative map file) can be included with
-   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
-   to provide more details about oncoming changes.
-   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
-   More preferred way to provide this information is sending the feature
-   as a separate patch and reference it in deprecation notice.
-
-#. A full deprecation cycle, as explained above, must be made to offer
-   downstream consumers sufficient warning of the change.
-
-Note that the above process for ABI deprecation should not be undertaken
-lightly. ABI stability is extremely important for downstream consumers of the
-DPDK, especially when distributed in shared object form. Every effort should
-be made to preserve the ABI whenever possible. The ABI should only be changed
-for significant reasons, such as performance enhancements. ABI breakage due to
-changes such as reorganizing public structure fields for aesthetic or
-readability purposes should be avoided.
-
-.. note::
-
-   Updates to the minimum hardware requirements, which drop support for hardware
-   which was previously supported, should be treated as an ABI change, and
-   follow the relevant deprecation policy procedures as above: 3 acks and
-   announcement at least one release in advance.
-
-Examples of Deprecation Notices
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The following are some examples of ABI deprecation notices which would be
-added to the Release Notes:
-
-* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
-  to be replaced with the inline function ``rte_foo()``.
-
-* The function ``rte_mbuf_grok()`` has been updated to include a new parameter
-  in version 2.0. Backwards compatibility will be maintained for this function
-  until the release of version 2.1
-
-* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
-  performance reasons. Existing binary applications will have backwards
-  compatibility in release 2.0, while newly built binaries will need to
-  reference the new structure variant ``struct rte_foo2``. Compatibility will
-  be removed in release 2.2, and all applications will require updating and
-  rebuilding to the new structure at that time, which will be renamed to the
-  original ``struct rte_foo``.
-
-* Significant ABI changes are planned for the ``librte_dostuff`` library. The
-  upcoming release 2.0 will not contain these changes, but release 2.1 will,
-  and no backwards compatibility is planned due to the extensive nature of
-  these changes. Binaries using this library built prior to version 2.1 will
-  require updating and recompilation.
-
-New API replacing previous one
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If a new API proposed functionally replaces an existing one, when the new API
-becomes non-experimental then the old one is marked with ``__rte_deprecated``.
-Deprecated APIs are removed completely just after the next LTS.
-
-Reminder that old API should follow deprecation process to be removed.
-
-
-Experimental APIs
------------------
-
-APIs marked as ``experimental`` are not considered part of the ABI and may
-change without warning at any time.  Since changes to APIs are most likely
-immediately after their introduction, as users begin to take advantage of
-those new APIs and start finding issues with them, new DPDK APIs will be
-automatically marked as ``experimental`` to allow for a period of stabilization
-before they become part of a tracked ABI.
-
-Note that marking an API as experimental is a multi step process.
-To mark an API as experimental, the symbols which are desired to be exported
-must be placed in an EXPERIMENTAL version block in the corresponding libraries'
-version map script.
-Secondly, the corresponding prototypes of those exported functions (in the
-development header files), must be marked with the ``__rte_experimental`` tag
-(see ``rte_compat.h``).
-The DPDK build makefiles perform a check to ensure that the map file and the
-C code reflect the same list of symbols.
-This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
-during compilation in the corresponding library Makefile.
-
-In addition to tagging the code with ``__rte_experimental``,
-the doxygen markup must also contain the EXPERIMENTAL string,
-and the MAINTAINERS file should note the EXPERIMENTAL libraries.
-
-For removing the experimental tag associated with an API, deprecation notice
-is not required. Though, an API should remain in experimental state for at least
-one release. Thereafter, normal process of posting patch for review to mailing
-list can be followed.
-
-
-Library versioning
-------------------
-
-Downstreams might want to provide different DPDK releases at the same time to
-support multiple consumers of DPDK linked against older and newer sonames.
-
-Also due to the interdependencies that DPDK libraries can have applications
-might end up with an executable space in which multiple versions of a library
-are mapped by ld.so.
-
-Think of LibA that got an ABI bump and LibB that did not get an ABI bump but is
-depending on LibA.
-
-.. note::
-
-    Application
-    \-> LibA.old
-    \-> LibB.new -> LibA.new
-
-That is a conflict which can be avoided by setting ``CONFIG_RTE_MAJOR_ABI``.
-If set, the value of ``CONFIG_RTE_MAJOR_ABI`` overwrites all - otherwise per
-library - versions defined in the libraries ``LIBABIVER``.
-An example might be ``CONFIG_RTE_MAJOR_ABI=16.11`` which will make all libraries
-``librte<?>.so.16.11`` instead of ``librte<?>.so.<LIBABIVER>``.
-
-
-ABI versioning
---------------
-
-Versioning Macros
-~~~~~~~~~~~~~~~~~
-
-When a symbol is exported from a library to provide an API, it also provides a
-calling convention (ABI) that is embodied in its name, return type and
-arguments. Occasionally that function may need to change to accommodate new
-functionality or behavior. When that occurs, it is desirable to allow for
-backward compatibility for a time with older binaries that are dynamically
-linked to the DPDK.
-
-To support backward compatibility the ``rte_function_versioning.h``
-header file provides macros to use when updating exported functions. These
-macros are used in conjunction with the ``rte_<library>_version.map`` file for
-a given library to allow multiple versions of a symbol to exist in a shared
-library so that older binaries need not be immediately recompiled.
-
-The macros exported are:
-
-* ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
-  versioned symbol ``b@DPDK_n`` to the internal function ``b_e``.
-
-* ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
-  the linker to bind references to symbol ``b`` to the internal symbol
-  ``b_e``.
-
-* ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
-  fully qualified function ``p``, so that if a symbol becomes versioned, it
-  can still be mapped back to the public symbol name.
-
-Examples of ABI Macro use
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Updating a public API
-_____________________
-
-Assume we have a function as follows
-
-.. code-block:: c
-
- /*
-  * Create an acl context object for apps to
-  * manipulate
-  */
- struct rte_acl_ctx *
- rte_acl_create(const struct rte_acl_param *param)
- {
-        ...
- }
-
-
-Assume that struct rte_acl_ctx is a private structure, and that a developer
-wishes to enhance the acl api so that a debugging flag can be enabled on a
-per-context basis.  This requires an addition to the structure (which, being
-private, is safe), but it also requires modifying the code as follows
-
-.. code-block:: c
-
- /*
-  * Create an acl context object for apps to
-  * manipulate
-  */
- struct rte_acl_ctx *
- rte_acl_create(const struct rte_acl_param *param, int debug)
- {
-        ...
- }
-
-
-Note also that, being a public function, the header file prototype must also be
-changed, as must all the call sites, to reflect the new ABI footprint.  We will
-maintain previous ABI versions that are accessible only to previously compiled
-binaries
-
-The addition of a parameter to the function is ABI breaking as the function is
-public, and existing application may use it in its current form.  However, the
-compatibility macros in DPDK allow a developer to use symbol versioning so that
-multiple functions can be mapped to the same public symbol based on when an
-application was linked to it.  To see how this is done, we start with the
-requisite libraries version map file.  Initially the version map file for the
-acl library looks like this
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_create;
-        rte_acl_dump;
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-This file needs to be modified as follows
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_create;
-        rte_acl_dump;
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-   DPDK_2.1 {
-        global:
-        rte_acl_create;
-
-   } DPDK_2.0;
-
-The addition of the new block tells the linker that a new version node is
-available (DPDK_2.1), which contains the symbol rte_acl_create, and inherits the
-symbols from the DPDK_2.0 node.  This list is directly translated into a list of
-exported symbols when DPDK is compiled as a shared library
-
-Next, we need to specify in the code which function map to the rte_acl_create
-symbol at which versions.  First, at the site of the initial symbol definition,
-we need to update the function so that it is uniquely named, and not in conflict
-with the public symbol name
-
-.. code-block:: c
-
-  struct rte_acl_ctx *
- -rte_acl_create(const struct rte_acl_param *param)
- +rte_acl_create_v20(const struct rte_acl_param *param)
- {
-        size_t sz;
-        struct rte_acl_ctx *ctx;
-        ...
-
-Note that the base name of the symbol was kept intact, as this is conducive to
-the macros used for versioning symbols.  That is our next step, mapping this new
-symbol name to the initial symbol name at version node 2.0.  Immediately after
-the function, we add this line of code
-
-.. code-block:: c
-
-   VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
-
-Remembering to also add the rte_function_versioning.h header to the requisite c file where
-these changes are being made.  The above macro instructs the linker to create a
-new symbol ``rte_acl_create@DPDK_2.0``, which matches the symbol created in older
-builds, but now points to the above newly named function.  We have now mapped
-the original rte_acl_create symbol to the original function (but with a new
-name)
-
-Next, we need to create the 2.1 version of the symbol.  We create a new function
-name, with a different suffix, and  implement it appropriately
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   rte_acl_create_v21(const struct rte_acl_param *param, int debug);
-   {
-        struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
-
-        ctx->debug = debug;
-
-        return ctx;
-   }
-
-This code serves as our new API call.  Its the same as our old call, but adds
-the new parameter in place.  Next we need to map this function to the symbol
-``rte_acl_create@DPDK_2.1``.  To do this, we modify the public prototype of the call
-in the header file, adding the macro there to inform all including applications,
-that on re-link, the default rte_acl_create symbol should point to this
-function.  Note that we could do this by simply naming the function above
-rte_acl_create, and the linker would chose the most recent version tag to apply
-in the version script, but we can also do this in the header file
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   -rte_acl_create(const struct rte_acl_param *param);
-   +rte_acl_create(const struct rte_acl_param *param, int debug);
-   +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
-
-The BIND_DEFAULT_SYMBOL macro explicitly tells applications that include this
-header, to link to the rte_acl_create_v21 function and apply the DPDK_2.1
-version node to it.  This method is more explicit and flexible than just
-re-implementing the exact symbol name, and allows for other features (such as
-linking to the old symbol version by default, when the new ABI is to be opt-in
-for a period.
-
-One last thing we need to do.  Note that we've taken what was a public symbol,
-and duplicated it into two uniquely and differently named symbols.  We've then
-mapped each of those back to the public symbol ``rte_acl_create`` with different
-version tags.  This only applies to dynamic linking, as static linking has no
-notion of versioning.  That leaves this code in a position of no longer having a
-symbol simply named ``rte_acl_create`` and a static build will fail on that
-missing symbol.
-
-To correct this, we can simply map a function of our choosing back to the public
-symbol in the static build with the ``MAP_STATIC_SYMBOL`` macro.  Generally the
-assumption is that the most recent version of the symbol is the one you want to
-map.  So, back in the C file where, immediately after ``rte_acl_create_v21`` is
-defined, we add this
-
-.. code-block:: c
-
-   struct rte_acl_ctx *
-   rte_acl_create_v21(const struct rte_acl_param *param, int debug)
-   {
-        ...
-   }
-   MAP_STATIC_SYMBOL(struct rte_acl_ctx *rte_acl_create(const struct rte_acl_param *param, int debug), rte_acl_create_v21);
-
-That tells the compiler that, when building a static library, any calls to the
-symbol ``rte_acl_create`` should be linked to ``rte_acl_create_v21``
-
-That's it, on the next shared library rebuild, there will be two versions of
-rte_acl_create, an old DPDK_2.0 version, used by previously built applications,
-and a new DPDK_2.1 version, used by future built applications.
-
-
-Deprecating part of a public API
-________________________________
-
-Lets assume that you've done the above update, and after a few releases have
-passed you decide you would like to retire the old version of the function.
-After having gone through the ABI deprecation announcement process, removal is
-easy.  Start by removing the symbol from the requisite version map file:
-
-.. code-block:: none
-
-   DPDK_2.0 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_dump;
- -      rte_acl_create
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
-   };
-
-   DPDK_2.1 {
-        global:
-        rte_acl_create;
-   } DPDK_2.0;
-
-
-Next remove the corresponding versioned export.
-
-.. code-block:: c
-
- -VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
-
-
-Note that the internal function definition could also be removed, but its used
-in our example by the newer version _v21, so we leave it in place.  This is a
-coding style choice.
-
-Lastly, we need to bump the LIBABIVER number for this library in the Makefile to
-indicate to applications doing dynamic linking that this is a later, and
-possibly incompatible library version:
-
-.. code-block:: c
-
-   -LIBABIVER := 1
-   +LIBABIVER := 2
-
-Deprecating an entire ABI version
-_________________________________
-
-While removing a symbol from and ABI may be useful, it is often more practical
-to remove an entire version node at once.  If a version node completely
-specifies an API, then removing part of it, typically makes it incomplete.  In
-those cases it is better to remove the entire node
-
-To do this, start by modifying the version map file, such that all symbols from
-the node to be removed are merged into the next node in the map
-
-In the case of our map above, it would transform to look as follows
-
-.. code-block:: none
-
-   DPDK_2.1 {
-        global:
-
-        rte_acl_add_rules;
-        rte_acl_build;
-        rte_acl_classify;
-        rte_acl_classify_alg;
-        rte_acl_classify_scalar;
-        rte_acl_dump;
-        rte_acl_create
-        rte_acl_find_existing;
-        rte_acl_free;
-        rte_acl_ipv4vlan_add_rules;
-        rte_acl_ipv4vlan_build;
-        rte_acl_list_dump;
-        rte_acl_reset;
-        rte_acl_reset_rules;
-        rte_acl_set_ctx_classify;
-
-        local: *;
- };
-
-Then any uses of BIND_DEFAULT_SYMBOL that pointed to the old node should be
-updated to point to the new version node in any header files for all affected
-symbols.
-
-.. code-block:: c
-
- -BIND_DEFAULT_SYMBOL(rte_acl_create, _v20, 2.0);
- +BIND_DEFAULT_SYMBOL(rte_acl_create, _v21, 2.1);
-
-Lastly, any VERSION_SYMBOL macros that point to the old version node should be
-removed, taking care to keep, where need old code in place to support newer
-versions of the symbol.
-
-
-Running the ABI Validator
--------------------------
-
-The ``devtools`` directory in the DPDK source tree contains a utility program,
-``validate-abi.sh``, for validating the DPDK ABI based on the Linux `ABI
-Compliance Checker
-<http://ispras.linuxbase.org/index.php/ABI_compliance_checker>`_.
-
-This has a dependency on the ``abi-compliance-checker`` and ``and abi-dumper``
-utilities which can be installed via a package manager. For example::
-
-   sudo yum install abi-compliance-checker
-   sudo yum install abi-dumper
-
-The syntax of the ``validate-abi.sh`` utility is::
-
-   ./devtools/validate-abi.sh <REV1> <REV2>
-
-Where ``REV1`` and ``REV2`` are valid gitrevisions(7)
-https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
-on the local repo.
-
-For example::
-
-   # Check between the previous and latest commit:
-   ./devtools/validate-abi.sh HEAD~1 HEAD
-
-   # Check on a specific compilation target:
-   ./devtools/validate-abi.sh -t x86_64-native-linux-gcc HEAD~1 HEAD
-
-   # Check between two tags:
-   ./devtools/validate-abi.sh v2.0.0 v2.1.0
-
-   # Check between git master and local topic-branch "vhost-hacking":
-   ./devtools/validate-abi.sh master vhost-hacking
-
-After the validation script completes (it can take a while since it need to
-compile both tags) it will create compatibility reports in the
-``./abi-check/compat_report`` directory. Listed incompatibilities can be found
-as follows::
-
-  grep -lr Incompatible abi-check/compat_reports/
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 4249aab..cf37d80 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,7 +4,7 @@
 ABI and API Deprecation
 =======================
 
-See the :doc:`guidelines document for details of the ABI policy </contributing/versioning>`.
+See the :doc:`guidelines document for details of the ABI policy </contributing/abi_versioning>`.
 API and ABI deprecation notices are to be posted here.
 
 
-- 
2.7.4


^ permalink raw reply	[relevance 18%]

* [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions
  2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
  2019-11-08 12:46 18% ` [dpdk-dev] [PATCH v9 1/4] doc: separate versioning.rst into version and policy Ray Kinsella
@ 2019-11-08 12:46 23% ` Ray Kinsella
  2019-11-08 17:11  5%   ` Thomas Monjalon
  2019-11-08 12:46 35% ` [dpdk-dev] [PATCH v9 3/4] doc: updates to versioning guide for " Ray Kinsella
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 200+ results
From: Ray Kinsella @ 2019-11-08 12:46 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

This policy change introduces major ABI versions, these are
declared every year, typically aligned with the LTS release
and are supported by subsequent releases in the following year.
This change is intended to improve ABI stabilty for those projects
consuming DPDK.

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Acked-by: John Mcnamara <john.mcnamara@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/contributing/abi_policy.rst             |  324 ++++--
 .../contributing/img/abi_stability_policy.svg      | 1059 ++++++++++++++++++++
 doc/guides/contributing/img/what_is_an_abi.svg     |  382 +++++++
 doc/guides/contributing/stable.rst                 |   12 +-
 4 files changed, 1686 insertions(+), 91 deletions(-)
 create mode 100644 doc/guides/contributing/img/abi_stability_policy.svg
 create mode 100644 doc/guides/contributing/img/what_is_an_abi.svg

diff --git a/doc/guides/contributing/abi_policy.rst b/doc/guides/contributing/abi_policy.rst
index d4f4e9f..0965bcc 100644
--- a/doc/guides/contributing/abi_policy.rst
+++ b/doc/guides/contributing/abi_policy.rst
@@ -1,31 +1,47 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright 2018 The DPDK contributors
+    Copyright 2019 The DPDK contributors
 
-DPDK ABI/API policy
-===================
+ABI Policy
+==========
 
 Description
 -----------
 
-This document details some methods for handling ABI management in the DPDK.
+This document details the management policy that ensures the long-term stability
+of the DPDK ABI and API.
 
 General Guidelines
 ------------------
 
-#. Whenever possible, ABI should be preserved
-#. ABI/API may be changed with a deprecation process
-#. The modification of symbols can generally be managed with versioning
-#. Libraries or APIs marked in ``experimental`` state may change without constraint
-#. New APIs will be marked as ``experimental`` for at least one release to allow
-   any issues found by users of the new API to be fixed quickly
-#. The addition of symbols is generally not problematic
-#. The removal of symbols generally is an ABI break and requires bumping of the
-   LIBABIVER macro
-#. Updates to the minimum hardware requirements, which drop support for hardware which
-   was previously supported, should be treated as an ABI change.
-
-What is an ABI
-~~~~~~~~~~~~~~
+#. Major ABI versions are declared no more frequently than yearly. Compatibility
+   with the major ABI version is mandatory in subsequent releases until a new
+   major ABI version is declared.
+#. Major ABI version are usually but not always declared aligned with a
+   :ref:`LTS release <stable_lts_releases>`.
+#. The ABI version is managed at a project level in DPDK, with the ABI version
+   reflected in all library's soname.
+#. The ABI should be preserved and not changed lightly. ABI changes must follow
+   the outlined :ref:`deprecation process <abi_changes>`.
+#. The addition of symbols is generally not problematic. The modification of
+   symbols is managed with ABI Versioning.
+#. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
+   once approved these will form part of the next ABI version.
+#. Libraries or APIs marked as :ref:`Experimental <experimental_apis>` are not
+   considered part of an ABI version and may change without constraint.
+#. Updates to the :ref:`minimum hardware requirements <hw_rqmts>`, which drop
+   support for hardware which was previously supported, should be treated as an
+   ABI change.
+
+.. note::
+
+   In 2019, the DPDK community stated its intention to move to ABI stable
+   releases, over a number of release cycles. This change begins with
+   maintaining ABI stability through one year of DPDK releases starting from
+   DPDK 19.11. This policy will be reviewed in 2020, with intention of
+   lengthening the stability period.
+
+What is an ABI?
+~~~~~~~~~~~~~~~
 
 An ABI (Application Binary Interface) is the set of runtime interfaces exposed
 by a library. It is similar to an API (Application Programming Interface) but
@@ -37,30 +53,82 @@ Therefore, in the case of dynamic linking, it is critical that an ABI is
 preserved, or (when modified), done in such a way that the application is unable
 to behave improperly or in an unexpected fashion.
 
+.. _figure_what_is_an_abi:
+
+.. figure:: img/what_is_an_abi.*
+
+	    Illustration of DPDK API and ABI.
 
-ABI/API Deprecation
--------------------
+
+What is an ABI version?
+~~~~~~~~~~~~~~~~~~~~~~~
+
+An ABI version is an instance of a library's ABI at a specific release. Certain
+releases are considered to be milestone releases, the yearly LTS release for
+example. The ABI of a milestone release may be declared as a 'major ABI
+version', where this ABI version is then supported for some number of subsequent
+releases and is annotated in the library's soname.
+
+ABI version support in subsequent releases facilitates application upgrades, by
+enabling applications built against the milestone release to upgrade to
+subsequent releases of a library without a rebuild.
+
+More details on major ABI version can be found in the ABI Versioning guide.
 
 The DPDK ABI policy
-~~~~~~~~~~~~~~~~~~~
+-------------------
+
+A new major ABI version is declared no more frequently than yearly, with
+declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
+Compatibility with the major ABI version is then mandatory in subsequent
+releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
+20.11.
 
-ABI versions are set at the time of major release labeling, and the ABI may
-change multiple times, without warning, between the last release label and the
-HEAD label of the git tree.
+At the declaration of a major ABI version, major version numbers encoded in
+libraries' sonames are bumped to indicate the new version, with the minor
+version reset to ``0``. An example would be ``librte_eal.so.20.3`` would become
+``librte_eal.so.21.0``.
 
-ABI versions, once released, are available until such time as their
-deprecation has been noted in the Release Notes for at least one major release
-cycle. For example consider the case where the ABI for DPDK 2.0 has been
-shipped and then a decision is made to modify it during the development of
-DPDK 2.1. The decision will be recorded in the Release Notes for the DPDK 2.1
-release and the modification will be made available in the DPDK 2.2 release.
+The ABI may then change multiple times, without warning, between the last major
+ABI version increment and the HEAD label of the git tree, with the condition
+that ABI compatibility with the major ABI version is preserved and therefore
+sonames do not change.
 
-ABI versions may be deprecated in whole or in part as needed by a given
-update.
+Minor versions are incremented to indicate the release of a new ABI compatible
+DPDK release, typically the DPDK quarterly releases. An example of this, might
+be that ``librte_eal.so.20.1`` would indicate the first ABI compatible DPDK
+release, following the declaration of the new major ABI version ``20``.
 
-Some ABI changes may be too significant to reasonably maintain multiple
-versions. In those cases ABI's may be updated without backward compatibility
-being provided. The requirements for doing so are:
+An ABI version is supported in all new releases until the next major ABI version
+is declared. When changing the major ABI version, the release notes will detail
+all ABI changes.
+
+.. _figure_abi_stability_policy:
+
+.. figure:: img/abi_stability_policy.*
+
+	    Mapping of new ABI versions and ABI version compatibility to DPDK
+	    releases.
+
+.. _abi_changes:
+
+ABI Changes
+~~~~~~~~~~~
+
+The ABI may still change after the declaration of a major ABI version, that is
+new APIs may be still added or existing APIs may be modified.
+
+.. Warning::
+
+   Note that, this policy details the method by which the ABI may be changed,
+   with due regard to preserving compatibility and observing deprecation
+   notices. This process however should not be undertaken lightly, as a general
+   rule ABI stability is extremely important for downstream consumers of DPDK.
+   The API should only be changed for significant reasons, such as performance
+   enhancements. API breakages due to changes such as reorganizing public
+   structure fields for aesthetic or readability purposes should be avoided.
+
+The requirements for changing the ABI are:
 
 #. At least 3 acknowledgments of the need to do so must be made on the
    dpdk.org mailing list.
@@ -69,34 +137,119 @@ being provided. The requirements for doing so are:
      no maintainer is available for the component, the tree/sub-tree maintainer
      for that component must acknowledge the ABI change instead.
 
+   - The acknowledgment of three members of the technical board, as delegates
+     of the `technical board <https://core.dpdk.org/techboard/>`_ acknowledging
+     the need for the ABI change, is also mandatory.
+
    - It is also recommended that acknowledgments from different "areas of
      interest" be sought for each deprecation, for example: from NIC vendors,
      CPU vendors, end-users, etc.
 
-#. The changes (including an alternative map file) can be included with
-   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option,
-   to provide more details about oncoming changes.
-   ``RTE_NEXT_ABI`` wrapper will be removed when it become the default ABI.
-   More preferred way to provide this information is sending the feature
-   as a separate patch and reference it in deprecation notice.
+#. Backward compatibility with the major ABI version must be maintained through
+   ABI Versioning, with :ref:`forward-only <forward-only>` compatibility
+   offered for any ABI changes that are indicated to be part of the next ABI
+   version.
 
-#. A full deprecation cycle, as explained above, must be made to offer
-   downstream consumers sufficient warning of the change.
+   - In situations where backward compatibility is not possible, read the
+     section on :ref:`abi_breakages`.
 
-Note that the above process for ABI deprecation should not be undertaken
-lightly. ABI stability is extremely important for downstream consumers of the
-DPDK, especially when distributed in shared object form. Every effort should
-be made to preserve the ABI whenever possible. The ABI should only be changed
-for significant reasons, such as performance enhancements. ABI breakage due to
-changes such as reorganizing public structure fields for aesthetic or
-readability purposes should be avoided.
+   - No backward or forward compatibility is offered for API changes marked as
+     ``experimental``, as described in the section on :ref:`Experimental APIs
+     and Libraries <experimental_apis>`.
 
-.. note::
+#. If a newly proposed API functionally replaces an existing one, when the new
+   API becomes non-experimental, then the old one is marked with
+   ``__rte_deprecated``.
+
+    - The depreciated API should follow the notification process to be removed,
+      see  :ref:`deprecation_notices`.
+
+    - At the declaration of the next major ABI version, those ABI changes then
+      become a formal part of the new ABI and the requirement to preserve ABI
+      compatibility with the last major ABI version is then dropped.
+
+    - The responsibility for removing redundant ABI compatibility code rests
+      with the original contributor of the ABI changes, failing that, then with
+      the contributor's company and then finally with the maintainer.
+
+.. _forward-only:
+
+.. Note::
+
+   Note that forward-only compatibility is offered for those changes made
+   between major ABI versions. As a library's soname can only describe
+   compatibility with the last major ABI version, until the next major ABI
+   version is declared, these changes therefore cannot be resolved as a runtime
+   dependency through the soname. Therefore any application wishing to make use
+   of these ABI changes can only ensure that its runtime dependencies are met
+   through Operating System package versioning.
+
+.. _hw_rqmts:
+
+.. Note::
 
    Updates to the minimum hardware requirements, which drop support for hardware
    which was previously supported, should be treated as an ABI change, and
-   follow the relevant deprecation policy procedures as above: 3 acks and
-   announcement at least one release in advance.
+   follow the relevant deprecation policy procedures as above: 3 acks, technical
+   board approval and announcement at least one release in advance.
+
+.. _abi_breakages:
+
+ABI Breakages
+~~~~~~~~~~~~~
+
+For those ABI changes that are too significant to reasonably maintain multiple
+symbol versions, there is an amended process. In these cases, ABIs may be
+updated without the requirement of backward compatibility being provided. These
+changes must follow the same process :ref:`described above <abi_changes>` as non-breaking
+changes, however with the following additional requirements:
+
+#. ABI breaking changes (including an alternative map file) can be included with
+   deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option, to provide
+   more details about oncoming changes. ``RTE_NEXT_ABI`` wrapper will be removed
+   at the declaration of the next major ABI version.
+
+#. Once approved, and after the deprecation notice has been observed these
+   changes will form part of the next declared major ABI version.
+
+Examples of ABI Changes
+~~~~~~~~~~~~~~~~~~~~~~~
+
+The following are examples of allowable ABI changes occurring between
+declarations of major ABI versions.
+
+* DPDK 19.11 release, defines the function ``rte_foo()``, and ``rte_foo()``
+  as part of the major ABI version ``20``.
+
+* DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
+  this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
+  preserved through ABI Versioning.
+
+  - The new function may be marked with the ``__rte_experimental`` tag for a
+    number of releases, as described in the section :ref:`experimental_apis`.
+
+  - Once ``rte_foo(uint8_t bar)`` becomes non-experimental ``rte_foo()`` is then
+    declared as ``__rte_depreciated``, with an associated deprecation notice
+    provided.
+
+* DPDK 19.11 is not re-released to include ``rte_foo(uint8_t bar)``, the new
+  version of ``rte_foo`` only exists from DPDK 20.02 onwards as described in the
+  :ref:`note on forward-only compatibility<forward-only>`.
+
+* DPDK 20.02 release defines the experimental function ``__rte_experimental
+  rte_baz()``. This function may or may not exist in the DPDK 20.05 release.
+
+* An application ``dPacket`` wishes to use ``rte_foo(uint8_t bar)``, before the
+  declaration of the DPDK ``21`` major API version. The application can only
+  ensure its runtime dependencies are met by specifying ``DPDK (>= 20.2)`` as
+  an explicit package dependency, as the soname only may only indicate the
+  supported major ABI version.
+
+* At the release of DPDK 20.11, the function ``rte_foo(uint8_t bar)`` becomes
+  formally part of then new major ABI version DPDK 21.0 and ``rte_foo()`` may be
+  removed.
+
+.. _deprecation_notices:
 
 Examples of Deprecation Notices
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -104,46 +257,42 @@ Examples of Deprecation Notices
 The following are some examples of ABI deprecation notices which would be
 added to the Release Notes:
 
-* The Macro ``#RTE_FOO`` is deprecated and will be removed with version 2.0,
-  to be replaced with the inline function ``rte_foo()``.
+* The Macro ``#RTE_FOO`` is deprecated and will be removed with ABI version
+  21, to be replaced with the inline function ``rte_foo()``.
 
 * The function ``rte_mbuf_grok()`` has been updated to include a new parameter
-  in version 2.0. Backwards compatibility will be maintained for this function
-  until the release of version 2.1
+  in version 20.2. Backwards compatibility will be maintained for this function
+  until the release of the new DPDK major ABI version 21, in DPDK version
+  20.11.
 
-* The members of ``struct rte_foo`` have been reorganized in release 2.0 for
+* The members of ``struct rte_foo`` have been reorganized in DPDK 20.02 for
   performance reasons. Existing binary applications will have backwards
-  compatibility in release 2.0, while newly built binaries will need to
-  reference the new structure variant ``struct rte_foo2``. Compatibility will
-  be removed in release 2.2, and all applications will require updating and
+  compatibility in release 20.02, while newly built binaries will need to
+  reference the new structure variant ``struct rte_foo2``. Compatibility will be
+  removed in release 20.11, and all applications will require updating and
   rebuilding to the new structure at that time, which will be renamed to the
   original ``struct rte_foo``.
 
 * Significant ABI changes are planned for the ``librte_dostuff`` library. The
-  upcoming release 2.0 will not contain these changes, but release 2.1 will,
+  upcoming release 20.02 will not contain these changes, but release 20.11 will,
   and no backwards compatibility is planned due to the extensive nature of
-  these changes. Binaries using this library built prior to version 2.1 will
+  these changes. Binaries using this library built prior to ABI version 21 will
   require updating and recompilation.
 
-New API replacing previous one
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If a new API proposed functionally replaces an existing one, when the new API
-becomes non-experimental then the old one is marked with ``__rte_deprecated``.
-Deprecated APIs are removed completely just after the next LTS.
+.. _experimental_apis:
 
-Reminder that old API should follow deprecation process to be removed.
+Experimental
+------------
 
+APIs
+~~~~
 
-Experimental APIs
------------------
-
-APIs marked as ``experimental`` are not considered part of the ABI and may
-change without warning at any time.  Since changes to APIs are most likely
-immediately after their introduction, as users begin to take advantage of
-those new APIs and start finding issues with them, new DPDK APIs will be
-automatically marked as ``experimental`` to allow for a period of stabilization
-before they become part of a tracked ABI.
+APIs marked as ``experimental`` are not considered part of an ABI version and
+may change without warning at any time. Since changes to APIs are most likely
+immediately after their introduction, as users begin to take advantage of those
+new APIs and start finding issues with them, new DPDK APIs will be automatically
+marked as ``experimental`` to allow for a period of stabilization before they
+become part of a tracked ABI version.
 
 Note that marking an API as experimental is a multi step process.
 To mark an API as experimental, the symbols which are desired to be exported
@@ -161,7 +310,16 @@ In addition to tagging the code with ``__rte_experimental``,
 the doxygen markup must also contain the EXPERIMENTAL string,
 and the MAINTAINERS file should note the EXPERIMENTAL libraries.
 
-For removing the experimental tag associated with an API, deprecation notice
-is not required. Though, an API should remain in experimental state for at least
-one release. Thereafter, normal process of posting patch for review to mailing
-list can be followed.
+For removing the experimental tag associated with an API, deprecation notice is
+not required. Though, an API should remain in experimental state for at least
+one release. Thereafter, the normal process of posting patch for review to
+mailing list can be followed.
+
+Libraries
+~~~~~~~~~
+
+Libraries marked as ``experimental`` are entirely not considered part of an ABI
+version, and may change without warning at any time. Experimental libraries
+always have a major version of ``0`` to indicate they exist outside of
+ABI Versioning, with the minor version incremented with each ABI change
+to library.
diff --git a/doc/guides/contributing/img/abi_stability_policy.svg b/doc/guides/contributing/img/abi_stability_policy.svg
new file mode 100644
index 0000000..4fd4007
--- /dev/null
+++ b/doc/guides/contributing/img/abi_stability_policy.svg
@@ -0,0 +1,1059 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1237.4869"
+   height="481.37463"
+   version="1.1"
+   viewBox="0 0 1237.4869 481.37463"
+   xml:space="preserve"
+   id="svg7800"
+   sodipodi:docname="abi_stability_policy.svg"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
+     id="metadata7804"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview7802"
+     showgrid="false"
+     inkscape:zoom="0.8875"
+     inkscape:cx="840.50495"
+     inkscape:cy="179.36692"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg7800" /><defs
+     id="defs7394"><clipPath
+       id="clipPath3975"><path
+         d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
+         id="path7226"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4003"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7229"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4025"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7232"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4037"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7235"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4049"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7238"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4061"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7241"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4073"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7244"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4085"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7247"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4097"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7250"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4109"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7253"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4121"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7256"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4133"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7259"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4145"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7262"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4157"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7265"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4169"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7268"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4181"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7271"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4193"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7274"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4205"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7277"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4217"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7280"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4229"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7283"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4241"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7286"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4253"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7289"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4265"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7292"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4277"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7295"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4289"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7298"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4301"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7301"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4313"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7304"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4327"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7307"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4339"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7310"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4351"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7313"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4363"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7316"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4375"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7319"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4389"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7322"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4403"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7325"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4417"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7328"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4429"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7331"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4441"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7334"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4453"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7337"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4477"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7340"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4489"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7343"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4501"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7346"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4513"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7349"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4525"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7352"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4537"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7355"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4549"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7358"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4561"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7361"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4573"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7364"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4589"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7367"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4601"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7370"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4615"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7373"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4629"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7376"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4641"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7379"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4653"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7382"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4673"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7385"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4685"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7388"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath4699"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path7391"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath></defs><g
+     id="g7406"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       style="fill:#44546a"
+       inkscape:connector-curvature="0"
+       id="path7400"
+       d="m 161.83,180.57 773.79,4.78 c 0.82,0.01 1.49,0.68 1.49,1.51 -0.01,0.83 -0.68,1.5 -1.51,1.49 l -773.79,-4.78 c -0.83,-0.01 -1.5,-0.68 -1.49,-1.51 0.01,-0.83 0.68,-1.5 1.51,-1.49 z m 772.3,1.77 8.97,4.56 -9.03,4.44 z" /><path
+       style="fill:#00b050;fill-rule:evenodd"
+       inkscape:connector-curvature="0"
+       id="path7402"
+       d="m 173.28,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       style="fill:#00b050;fill-rule:evenodd"
+       inkscape:connector-curvature="0"
+       id="path7404"
+       d="m 612.24,183.78 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /></g><g
+     style="fill:#ff0000;fill-rule:evenodd"
+     id="g7420"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       inkscape:connector-curvature="0"
+       id="path7408"
+       d="m 228.12,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7410"
+       d="m 282.96,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7412"
+       d="m 337.8,182.22 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7414"
+       d="m 447.6,182.22 c 0,4.67 3.36,8.46 7.5,8.46 4.14,0 7.5,-3.79 7.5,-8.46 0,-4.67 -3.36,-8.46 -7.5,-8.46 -4.14,0 -7.5,3.79 -7.5,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7416"
+       d="m 502.44,182.34 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7418"
+       d="m 557.28,182.34 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /></g><g
+     id="g7426"
+     clip-path="url(#clipPath4003)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7424"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,152.98,149.45)"><tspan
+         id="tspan7422"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v19.11</tspan></text>
+</g><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7428"
+     d="m 499.42541,379.9105 c 0,-6.22651 4.47989,-11.27972 9.99975,-11.27972 5.51986,0 9.99975,5.05321 9.99975,11.27972 0,6.22651 -4.47989,11.27972 -9.99975,11.27972 -5.51986,0 -9.99975,-5.05321 -9.99975,-11.27972 z" /><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7430"
+     d="m 1084.6908,373.67065 c 0,-6.22651 4.4799,-11.27971 9.9997,-11.27971 5.5199,0 9.9998,5.0532 9.9998,11.27971 0,6.22652 -4.4799,11.27972 -9.9998,11.27972 -5.5198,0 -9.9997,-5.0532 -9.9997,-11.27972 z" /><g
+     style="fill:#ff0000;fill-rule:evenodd"
+     id="g7438"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><path
+       inkscape:connector-curvature="0"
+       id="path7432"
+       d="m 667.08,185.4 c 0,4.64 3.36,8.4 7.5,8.4 4.14,0 7.5,-3.76 7.5,-8.4 0,-4.64 -3.36,-8.4 -7.5,-8.4 -4.14,0 -7.5,3.76 -7.5,8.4 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7434"
+       d="m 721.92,185.58 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /><path
+       inkscape:connector-curvature="0"
+       id="path7436"
+       d="m 776.76,185.58 c 0,4.67 3.38,8.46 7.56,8.46 4.18,0 7.56,-3.79 7.56,-8.46 0,-4.67 -3.38,-8.46 -7.56,-8.46 -4.18,0 -7.56,3.79 -7.56,8.46 z" /></g><g
+     id="g7444"
+     clip-path="url(#clipPath4025)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7442"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,210.14,150.1)"><tspan
+         id="tspan7440"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.02</tspan></text>
+</g><g
+     id="g7450"
+     clip-path="url(#clipPath4037)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7448"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,265.01,150.1)"><tspan
+         id="tspan7446"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.05</tspan></text>
+</g><g
+     id="g7456"
+     clip-path="url(#clipPath4049)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7454"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,319.9,150.77)"><tspan
+         id="tspan7452"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v20.08</tspan></text>
+</g><g
+     id="g7462"
+     clip-path="url(#clipPath4061)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7460"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,375,150.94)"><tspan
+         id="tspan7458"
+         y="0"
+         x="0 7.9180322 14.992224 22.066416 25.652737 32.726929">V20.11</tspan></text>
+</g><g
+     id="g7468"
+     clip-path="url(#clipPath4073)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7466"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,429.17,150.94)"><tspan
+         id="tspan7464"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.02</tspan></text>
+</g><g
+     id="g7474"
+     clip-path="url(#clipPath4085)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7472"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,483,150.55)"><tspan
+         id="tspan7470"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v21.05</tspan></text>
+</g><g
+     id="g7480"
+     clip-path="url(#clipPath4097)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7478"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,537.38,150.82)"><tspan
+         id="tspan7476"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.08</tspan></text>
+</g><g
+     id="g7486"
+     clip-path="url(#clipPath4109)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7484"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,592.27,150.82)"><tspan
+         id="tspan7482"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 24.105696 31.179888">v21.11</tspan></text>
+</g><g
+     id="g7492"
+     clip-path="url(#clipPath4121)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7490"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,647.14,151.46)"><tspan
+         id="tspan7488"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 24.10668 31.22496">v22.02</tspan></text>
+</g><g
+     id="g7498"
+     clip-path="url(#clipPath4133)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7496"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,702.24,151.63)"><tspan
+         id="tspan7494"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.05</tspan></text>
+</g><g
+     id="g7504"
+     clip-path="url(#clipPath4145)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7502"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,756.43,151.63)"><tspan
+         id="tspan7500"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.08</tspan></text>
+</g><g
+     id="g7510"
+     clip-path="url(#clipPath4157)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7508"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,811.99,151.63)"><tspan
+         id="tspan7506"
+         y="0"
+         x="0 7.96068 14.99472 22.113001 25.651079 32.76936">V22.11</tspan></text>
+</g><g
+     id="g7516"
+     clip-path="url(#clipPath4169)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7514"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,105.82,214.18)"><tspan
+         id="tspan7512"
+         y="0"
+         x="0 6.3460798 13.46436">v20</tspan></text>
+</g><g
+     id="g7522"
+     clip-path="url(#clipPath4181)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7520"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,105.5,247.68)"><tspan
+         id="tspan7518"
+         y="0"
+         x="0 6.3569279 13.445184">v21</tspan></text>
+</g><g
+     id="g7528"
+     clip-path="url(#clipPath4193)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7526"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,228.79,214.51)"><tspan
+         id="tspan7524"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7534"
+     clip-path="url(#clipPath4205)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7532"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,283.8,214.51)"><tspan
+         id="tspan7530"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7540"
+     clip-path="url(#clipPath4217)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7538"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,337.68,214.51)"><tspan
+         id="tspan7536"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7546"
+     clip-path="url(#clipPath4229)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7544"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,611.66,285.79)"><tspan
+         id="tspan7542"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7552"
+     clip-path="url(#clipPath4241)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7550"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,666.65,285.79)"><tspan
+         id="tspan7548"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7558"
+     clip-path="url(#clipPath4253)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7556"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,719.4,285.79)"><tspan
+         id="tspan7554"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7564"
+     clip-path="url(#clipPath4265)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7562"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,775.56,285.79)"><tspan
+         id="tspan7560"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7570"
+     clip-path="url(#clipPath4277)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7568"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,398.54,249.22)"><tspan
+         id="tspan7566"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7576"
+     clip-path="url(#clipPath4289)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7574"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,453.53,249.22)"><tspan
+         id="tspan7572"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7582"
+     clip-path="url(#clipPath4301)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7580"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,507.43,249.22)"><tspan
+         id="tspan7578"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7588"
+     clip-path="url(#clipPath4313)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7586"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,561.05,249.22)"><tspan
+         id="tspan7584"
+         y="0"
+         x="0">√</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7590"
+     d="m 217.67245,474.73479 v -25.14603 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14603 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14608 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7596"
+     clip-path="url(#clipPath4327)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7594"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,170.83,214.51)"><tspan
+         id="tspan7592"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7602"
+     clip-path="url(#clipPath4339)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7600"
+       font-weight="bold"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,23.4,272.33)"><tspan
+         id="tspan7598"
+         y="0"
+         x="0 8.5227842 16.412687 20.167776">ABI </tspan></text>
+</g><g
+     id="g7608"
+     clip-path="url(#clipPath4351)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7606"
+       font-weight="bold"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,46.68,272.33)"><tspan
+         id="tspan7604"
+         y="0"
+         x="0 7.566432 14.640624 19.563025 25.174561 28.662432 36.228863">Version</tspan></text>
+</g><g
+     id="g7614"
+     clip-path="url(#clipPath4363)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7612"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,17.64,255.5)"><tspan
+         id="tspan7610"
+         y="0"
+         x="0 7.4271598 14.98068 26.395201 33.934681 40.80024 45.700199 49.154041 56.7216 60.175442 63.671398 67.125237 72.053284">Compatibility</tspan></text>
+</g><g
+     id="g7620"
+     clip-path="url(#clipPath4375)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7618"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,191.28,116.86)"><tspan
+         id="tspan7616"
+         y="0"
+         x="0 6.3460798 13.46436">v20</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7622"
+     d="m 511.7451,474.89479 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7628"
+     clip-path="url(#clipPath4389)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7626"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,407.06,115.63)"><tspan
+         id="tspan7624"
+         y="0"
+         x="0 6.3460798 13.46436">v21</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7630"
+     d="m 804.53778,476.01476 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7636"
+     clip-path="url(#clipPath4403)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7634"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,626.66,114.74)"><tspan
+         id="tspan7632"
+         y="0"
+         x="0 6.3460798 13.46436">v22</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7638"
+     d="m 1098.2904,479.37468 v -25.14604 c 0,-1.10664 -0.8933,-1.99995 -1.9999,-1.99995 -1.1067,0 -2,0.89331 -2,1.99995 v 25.14604 c 0,1.0933 0.8933,1.99995 2,1.99995 1.1066,0 1.9999,-0.90665 1.9999,-1.99995 z m 3.9999,-23.14609 -5.9998,-11.9997 -5.9999,11.9997 z" /><g
+     id="g7644"
+     clip-path="url(#clipPath4417)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7642"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,846.96,112.22)"><tspan
+         id="tspan7640"
+         y="0"
+         x="0 6.3569279 13.445184">v23</tspan></text>
+</g><g
+     id="g7650"
+     clip-path="url(#clipPath4429)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7648"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,832.87,318.46)"><tspan
+         id="tspan7646"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7656"
+     clip-path="url(#clipPath4441)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7654"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,105.5,285.67)"><tspan
+         id="tspan7652"
+         y="0"
+         x="0 6.3460798 13.46436">v22</tspan></text>
+</g><g
+     id="g7662"
+     clip-path="url(#clipPath4453)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7660"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,104.93,319.87)"><tspan
+         id="tspan7658"
+         y="0"
+         x="0 6.3460798 13.46436">v23</tspan></text>
+</g><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7664"
+     stroke-miterlimit="10"
+     d="m 1104.7569,213.75465 -934.60326,0.39999" /><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7666"
+     stroke-miterlimit="10"
+     d="M 1105.3969,255.35361 170.79362,255.7536" /><path
+     style="fill:none;stroke:#5b9bd5;stroke-width:0.63998401;stroke-miterlimit:10;stroke-dasharray:2.559936, 1.919952"
+     inkscape:connector-curvature="0"
+     id="path7668"
+     stroke-miterlimit="10"
+     d="M 1105.3969,299.35251 170.79362,299.7525" /><g
+     id="g7674"
+     clip-path="url(#clipPath4477)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#8497b0"
+       id="text7672"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,283.8,251.38)"><tspan
+         id="tspan7670"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7680"
+     clip-path="url(#clipPath4489)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7678"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,339.5,251.95)"><tspan
+         id="tspan7676"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7686"
+     clip-path="url(#clipPath4501)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7684"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,229.8,250.63)"><tspan
+         id="tspan7682"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7692"
+     clip-path="url(#clipPath4513)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7690"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,453.53,286.63)"><tspan
+         id="tspan7688"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7698"
+     clip-path="url(#clipPath4525)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7696"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,507.43,286.63)"><tspan
+         id="tspan7694"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7704"
+     clip-path="url(#clipPath4537)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7702"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,561.05,286.63)"><tspan
+         id="tspan7700"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7710"
+     clip-path="url(#clipPath4549)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#d0cece"
+       id="text7708"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,667.39,318.89)"><tspan
+         id="tspan7706"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7716"
+     clip-path="url(#clipPath4561)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7714"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,720.14,318.89)"><tspan
+         id="tspan7712"
+         y="0"
+         x="0">√</tspan></text>
+</g><g
+     id="g7722"
+     clip-path="url(#clipPath4573)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#8497b0"
+       id="text7720"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,776.3,318.89)"><tspan
+         id="tspan7718"
+         y="0"
+         x="0">√</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7724"
+     d="m 211.36594,305.0057 2.18661,-227.154316 c 0.0133,-1.0933 -0.87997,-1.99995 -1.98661,-2.01328 -1.09331,-0.0133 -1.99995,0.87998 -2.01329,1.98662 l -2.18661,227.140986 c -0.0133,1.10663 0.87998,2.01328 1.98662,2.02661 1.10664,0.0133 1.99995,-0.87998 2.01328,-1.98662 z m -7.97313,-2.07994 5.87985,12.06636 6.11985,-11.94637 z" /><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7726"
+     d="M 289.03067,238.94069 V 107.43731 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 131.50338 c 0,1.09331 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90664 1.99995,-1.99995 z m -7.9998,-1.99995 5.99985,11.9997 5.99985,-11.9997 z" /><g
+     id="g7732"
+     clip-path="url(#clipPath4589)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7730"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,164.59,422.74)"><tspan
+         id="tspan7728"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 31.88484 39.578758 43.06068 46.065239 49.294441 54.784081 57.957119 65.271957 72.263878 78.118561 81.347763 88.072922 92.762283 99.754204 107.04096 110.38248 117.10764 120.33684 123.56604 130.17888 137.50777 144.49968 151.78644 155.12796 165.16656 168.43788 173.14128 180.44208 183.67128 190.01736 197.13564 204.19775 207.77795 214.89624 221.94432 225.17352 229.9752 236.70036">v20 ABI is declared aligned with v19.11 LTS</tspan></text>
+</g><g
+     id="g7738"
+     clip-path="url(#clipPath4601)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.06400013px;font-family:Calibri;fill:#000000"
+       id="text7736"
+       font-size="14.064px"
+       transform="matrix(1,0,0,-1,222.12,398.3)"><tspan
+         id="tspan7734"
+         y="0"
+         x="0 6.3569279 13.445184 20.519377 23.740032 29.014032 35.385025 46.537777 53.851055 61.262783 64.497505 70.038719 73.034355 79.771011 84.440254 91.401939 94.622589 101.35925 108.65846 115.97174 122.93343 130.2467 133.59393 140.3306 147.62981 154.94308 158.16374 164.52068 171.60893 178.68312 181.90378 187.17778 193.54877 204.70152 212.0148 219.42653 222.66125 228.20247 231.32468 238.06133 242.73058 249.69226 252.81447 263.98129 271.39301 278.77661 282.01132 286.30084 289.53555 296.53943 303.82458 307.34061 310.51904 316.0462 323.3595 330.67276 337.98605 345.39777 350.30612 355.01755 358.13977 362.21832 369.63004 374.53839 377.5762 383.93314 391.02139 398.09558 401.2178 409.36084 417.03979 420.51361 423.6358 429.40204 436.81378 444.04266 448.75412 451.98883 459.28806 466.60132 473.56302 479.06204">v21 symbols are added and v20 symbols are modified, support for v20 ABI continues.</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7740"
+     d="m 510.78512,258.56686 -0.31999,-126.17017 c 0,-1.09331 0.89331,-1.99995 1.99995,-1.99995 1.09331,0 1.99995,0.89331 1.99995,1.99995 l 0.31999,126.15684 c 0,1.10664 -0.89331,2.01328 -1.99995,2.01328 -1.0933,0 -1.99995,-0.89331 -1.99995,-1.99995 z m 7.9998,-2.01328 -5.97318,12.01303 -6.02652,-11.98636 z" /><g
+     id="g7746"
+     clip-path="url(#clipPath4615)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7744"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,388.51,373.39)"><tspan
+         id="tspan7742"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 31.88484 39.578758 43.06068 46.065239 49.294441 54.784081 57.957119 65.271957 72.263878 78.118561 81.347763 88.072922 92.762283 99.754204 107.04096 110.38248 117.10764 120.33684 123.56604 130.17888 137.50777 144.49968 151.78644 155.12796 165.16656 168.43788 173.14128 180.44208 183.67128 190.01736 197.13564 204.19775 207.77795 214.89624 221.94432 225.17352 229.9752 236.70036 243.14471 246.65472 249.78564 254.46095 261.45288 272.58661 279.31177 282.54095 289.86984 293.09903 300.47003 307.02673 310.36823 316.71432 323.83261 330.89471 334.12393 339.40295 345.76309 356.92487 364.23972 371.63879 374.91013 380.39975 383.4324 390.15756 394.83289 401.8248 404.99783 409.71527 416.70721 427.84091 435.23999 441.51587 448.50781 455.79456">v21 ABI is declared aligned with v20.11 LTS, remaining v20 symbols are removed.</tspan></text>
+</g><path
+     style="fill:none;stroke:#7030a0;stroke-width:2.07994795;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7748"
+     stroke-miterlimit="10"
+     d="M 278.23094,342.95142 H 449.58665 V 261.03347 H 278.23094 Z" /><g
+     id="g7754"
+     clip-path="url(#clipPath4629)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7752"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,23.616,114.74)"><tspan
+         id="tspan7750"
+         y="0"
+         x="0 8.5082397 16.4268 20.17548 23.26428 30.817801 37.879921 42.821999 48.423962 51.93396 59.48748 67.026962">ABI Versions</tspan></text>
+</g><g
+     id="g7760"
+     clip-path="url(#clipPath4641)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-weight:bold;font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7758"
+       font-weight="bold"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,20.064,150.17)"><tspan
+         id="tspan7756"
+         y="0"
+         x="0 8.8451996 16.31448 25.159679 32.839561 36.0126 43.67844 50.740559 54.222481 61.284599 68.248444 73.850403 80.954643">DPDK Releases</tspan></text>
+</g><g
+     id="g7766"
+     clip-path="url(#clipPath4653)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7764"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,444,346.1)"><tspan
+         id="tspan7762"
+         y="0"
+         x="0 6.3460798 13.46436 20.52648 23.75568 29.034719 35.39484 46.556641 53.871479 61.270561 64.541878 70.031517 73.064163 79.789322 84.464638 91.456558 94.629601 101.35476 108.72576 116.02656 123.01848 130.30524 133.64676 140.37192 147.68677 155.0016 158.2308 164.57687 171.69516 178.75728 181.98648 187.26552 193.62564 204.78745 212.10228 219.50136 222.77267 228.26231 231.43536 238.16052 242.80775 249.79968 252.88847 264.05029 271.44937 278.82037 282.04956 286.33176 289.60309 296.595 303.88177 307.39175 310.56479 316.1106 323.42545 330.74026 338.05511 345.45419 350.39627 355.09967 358.20251 362.28815 369.68723 374.62933 377.63388 383.97995 391.09824 398.16037 401.27725 409.4064 417.10031 420.58224 423.69913 429.45551 436.85461 444.09924 448.80264 452.03183 459.33264 466.64749 473.6394 479.12903 488.81665 492.43896">v22 symbols are added and v21 symbols are modified, support for v21 ABI continues…..</tspan></text>
+</g><path
+     style="fill:#7030a0;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7768"
+     d="m 583.39664,198.26171 -0.13333,-30.49257 c 0,-1.10664 0.89331,-2.01329 1.98662,-2.01329 1.10664,0 2.01328,0.89331 2.01328,1.98662 l 0.13333,30.49257 c 0,1.10664 -0.89331,2.01328 -1.99995,2.01328 -1.0933,0 -1.99995,-0.89331 -1.99995,-1.98661 z m 7.98647,-2.03995 -5.94652,12.02636 -6.05318,-11.97303 z" /><path
+     style="fill:none;stroke:#7030a0;stroke-width:2.07994795;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7770"
+     stroke-miterlimit="10"
+     d="M 571.18361,299.43251 H 742.37933 V 212.87467 H 571.18361 Z" /><path
+     style="fill:#00b050;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7772"
+     d="m 933.01457,30.959224 c 0,-6.22651 4.50655,-11.27972 10.07975,-11.27972 5.57319,0 10.07974,5.05321 10.07974,11.27972 0,6.22651 -4.50655,11.27972 -10.07974,11.27972 -5.5732,0 -10.07975,-5.05321 -10.07975,-11.27972 z" /><path
+     style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7774"
+     d="m 1081.3309,29.759254 c 0,-6.18651 4.4798,-11.19972 9.9997,-11.19972 5.5199,0 9.9998,5.01321 9.9998,11.19972 0,6.18651 -4.4799,11.19972 -9.9998,11.19972 -5.5199,0 -9.9997,-5.01321 -9.9997,-11.19972 z" /><g
+     id="g7780"
+     clip-path="url(#clipPath4673)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7778"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,744.89,439.54)"><tspan
+         id="tspan7776"
+         y="0"
+         x="0 4.8016801 11.52684 17.971201 21.144239 28.5714 35.56332 38.792519 45.728279 52.453442 57.943081">LTS Release</tspan></text>
+</g><g
+     id="g7786"
+     clip-path="url(#clipPath4685)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7784"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,856.06,439.75)"><tspan
+         id="tspan7782"
+         y="0"
+         x="0 12.0042 15.2334 22.562281 29.961361 34.903439 38.020321 45.461521 52.453442 55.68264 62.618401 69.343559 74.833199">Minor Release</tspan></text>
+</g><path
+     style="fill:#44546a;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path7788"
+     d="m 779.25841,46.265514 v -25.14604 c 0,-1.10664 -0.89331,-1.99995 -1.99995,-1.99995 -1.10664,0 -1.99995,0.89331 -1.99995,1.99995 v 25.14604 c 0,1.0933 0.89331,1.99995 1.99995,1.99995 1.10664,0 1.99995,-0.90665 1.99995,-1.99995 z m 3.9999,-23.14609 -5.99985,-11.9997 -5.99985,11.9997 z" /><g
+     id="g7794"
+     clip-path="url(#clipPath4699)"
+     transform="matrix(1.3333,0,0,-1.3333,-24.241503,623.02442)"><text
+       style="font-size:14.03999996px;font-family:Calibri;fill:#000000"
+       id="text7792"
+       font-size="14.04px"
+       transform="matrix(1,0,0,-1,622.34,439.54)"><tspan
+         id="tspan7790"
+         y="0"
+         x="0 8.1291599 15.82308 19.305 22.309561 29.512079 36.504002 41.151241 46.640881 49.870079 57.339359">ABI Version</tspan></text>
+</g><path
+     style="fill:none;stroke:#002060;stroke-width:1.27996802;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path7796"
+     stroke-miterlimit="10"
+     d="M 763.41881,62.078444 H 1236.847 V 0.63998401 H 763.41881 Z" /></svg>
\ No newline at end of file
diff --git a/doc/guides/contributing/img/what_is_an_abi.svg b/doc/guides/contributing/img/what_is_an_abi.svg
new file mode 100644
index 0000000..fd3d993
--- /dev/null
+++ b/doc/guides/contributing/img/what_is_an_abi.svg
@@ -0,0 +1,382 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="970.69568"
+   height="522.22693"
+   version="1.1"
+   viewBox="0 0 970.69568 522.22693"
+   xml:space="preserve"
+   id="svg8399"
+   sodipodi:docname="what_is_an_abi.svg"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
+     id="metadata8403"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     id="namedview8401"
+     showgrid="false"
+     inkscape:zoom="0.62755727"
+     inkscape:cx="820.83951"
+     inkscape:cy="-47.473217"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg8399" /><defs
+     id="defs8269"><clipPath
+       id="clipPath26"><path
+         d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
+         id="path8206"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><radialGradient
+       id="radialGradient40"
+       cx="0"
+       cy="0"
+       r="1"
+       gradientTransform="matrix(386.44367,-1.3123672e-5,-1.3123672e-5,-386.44367,470.30824,246.15384)"
+       gradientUnits="userSpaceOnUse"><stop
+         stop-color="#f9d8e2"
+         offset="0"
+         id="stop8209" /><stop
+         stop-color="#fff"
+         offset=".74"
+         id="stop8211" /><stop
+         stop-color="#fff"
+         offset=".83"
+         id="stop8213" /><stop
+         stop-color="#fff"
+         offset="1"
+         id="stop8215" /></radialGradient><clipPath
+       id="clipPath56"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8218"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath68"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8221"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath82"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8224"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath96"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8227"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath108"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8230"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath120"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8233"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath132"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8236"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath144"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8239"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath156"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8242"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath168"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8245"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath180"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8248"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath192"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8251"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath204"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8254"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath216"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8257"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath228"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8260"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath240"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8263"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath><clipPath
+       id="clipPath260"><path
+         d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
+         id="path8266"
+         inkscape:connector-curvature="0"
+         style="clip-rule:evenodd" /></clipPath></defs><path
+     inkscape:connector-curvature="0"
+     style="fill:url(#radialGradient40);fill-rule:evenodd;stroke-width:1.33329999"
+     id="path8275"
+     d="m 116.15709,143.06309 c 0,-28.46596 23.07942,-51.545378 51.54538,-51.545378 h 605.21154 c 28.46595,0 51.54537,23.079418 51.54537,51.545378 V 349.2446 c 0,28.46595 -23.07942,51.54538 -51.54537,51.54538 H 167.70247 c -28.46595,0 -51.54538,-23.07943 -51.54538,-51.54538 z" /><path
+     style="fill:#00b050;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8277"
+     d="m 478.70803,73.758152 0.58665,373.057338 c 0,1.67996 -1.35997,3.03993 -3.03992,3.03993 -1.67996,0.0133 -3.03993,-1.34663 -3.03993,-3.02659 L 472.62818,73.758152 c 0,-1.67995 1.35997,-3.03992 3.03992,-3.03992 1.67996,0 3.03993,1.35997 3.03993,3.03992 z m 6.65317,370.004088 -9.09311,18.25287 -9.14644,-18.22621 z" /><path
+     style="fill:none;stroke:#7030a0;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8279"
+     stroke-miterlimit="10"
+     d="m 3.0399239,186.92866 c 0,-36.70575 29.7459201,-66.45167 66.4516701,-66.45167 H 778.00721 c 36.70575,0 66.45167,29.74592 66.45167,66.45167 v 265.80669 c 0,36.70574 -29.74592,66.45167 -66.45167,66.45167 H 69.491594 c -36.70575,0 -66.4516701,-29.74593 -66.4516701,-66.45167 z" /><path
+     style="fill:none;stroke:#3b3059;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8281"
+     stroke-miterlimit="10"
+     d="m 101.27746,71.464882 c 0,-37.78572 30.63924,-68.4249581 68.42496,-68.4249581 h 729.52846 c 37.7857,0 68.4249,30.6392381 68.4249,68.4249581 V 345.1647 c 0,37.78572 -30.6392,68.42496 -68.4249,68.42496 H 169.70242 c -37.78572,0 -68.42496,-30.63924 -68.42496,-68.42496 z" /><g
+     id="g8287"
+     clip-path="url(#clipPath56)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.06399918px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8285"
+       font-size="32.064px"
+       transform="matrix(1,0,0,-1,409.78,93.312)"><tspan
+         id="tspan8283"
+         y="0"
+         x="0 23.855616 42.837505 66.693123">DPDK</tspan></text>
+</g><g
+     id="g8293"
+     clip-path="url(#clipPath68)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.06399918px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8291"
+       font-size="32.064px"
+       transform="matrix(1,0,0,-1,358.03,435.43)"><tspan
+         id="tspan8289"
+         y="0"
+         x="0 23.72736 45.595009 67.462654 73.875458 80.160004 100.90541 122.80512 133.54655 139.95937 160.96127">Application</tspan></text>
+</g><path
+     style="fill:#f9d8e2;fill-opacity:0.70196001;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8295"
+     d="M 424.30939,345.59136 H 531.18672 V 277.91305 H 424.30939 Z" /><g
+     id="g8301"
+     clip-path="url(#clipPath82)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.04000092px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8299"
+       font-size="32.04px"
+       transform="matrix(1,0,0,-1,432.96,231.41)"><tspan
+         id="tspan8297"
+         y="0"
+         x="0 23.7096 42.67728">API</tspan></text>
+</g><path
+     style="fill:#f9d8e2;fill-opacity:0.70196001;fill-rule:evenodd;stroke-width:1.33329999"
+     inkscape:connector-curvature="0"
+     id="path8303"
+     d="m 422.38944,213.91465 h 107.19732 v -67.8383 H 422.38944 Z" /><g
+     id="g8309"
+     clip-path="url(#clipPath96)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:32.04000092px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8307"
+       font-size="32.04px"
+       transform="matrix(1,0,0,-1,431.54,330.29)"><tspan
+         id="tspan8305"
+         y="0"
+         x="0 23.7096 42.100559">ABI</tspan></text>
+</g><g
+     id="g8315"
+     clip-path="url(#clipPath108)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8313"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,293.23)"><tspan
+         id="tspan8311"
+         y="0"
+         x="0 9.4483204 14.25228 24.706079 35.447159 40.203239 51.10392 66.106323 81.076797 84.332642 94.068237">Programming</tspan></text>
+</g><g
+     id="g8321"
+     clip-path="url(#clipPath120)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.98400021px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8319"
+       font-size="15.984px"
+       transform="matrix(1,0,0,-1,221.78,274.03)"><tspan
+         id="tspan8317"
+         y="0"
+         x="0 7.320672 18.237743 27.987984 38.633327 48.351601 59.268673 69.945984">Language</tspan></text>
+</g><g
+     id="g8327"
+     clip-path="url(#clipPath132)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8325"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,254.81)"><tspan
+         id="tspan8323"
+         y="0"
+         x="0 7.6767602 17.38044 27.116039 37.442162 42.708961 45.93288 56.386681 66.122276">Functions</tspan></text>
+</g><g
+     id="g8333"
+     clip-path="url(#clipPath144)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8331"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,235.61)"><tspan
+         id="tspan8329"
+         y="0"
+         x="0 11.87424 22.77492 28.073641 38.974319 44.273041 52.891441 63.776161 74.150162">Datatypes</tspan></text>
+</g><g
+     id="g8339"
+     clip-path="url(#clipPath156)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8337"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,216.41)"><tspan
+         id="tspan8335"
+         y="0"
+         x="0 9.6877203 20.06172 25.312559 35.016239 39.820202 49.555801 54.216122 60.823559 69.441963 80.326683 90.700684">Return Types</tspan></text>
+</g><g
+     id="g8345"
+     clip-path="url(#clipPath168)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8343"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,197.21)"><tspan
+         id="tspan8341"
+         y="0"
+         x="0 12.97548 23.429279 33.164879 39.357361 44.640121 55.540798 65.276398 70.559158">Constants</tspan></text>
+</g><g
+     id="g8351"
+     clip-path="url(#clipPath180)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8349"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,221.78,178.01)"><tspan
+         id="tspan8347"
+         y="0"
+         x="0">…</tspan></text>
+</g><g
+     id="g8357"
+     clip-path="url(#clipPath192)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8355"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,354.12)"><tspan
+         id="tspan8353"
+         y="0"
+         x="0 3.8304 13.566 19.75848 25.07316 29.877119 39.580799 49.906921 55.189678 58.413601 68.867401 78.602997 83.2314 89.423882 99.797882">Instruction set</tspan></text>
+</g><g
+     id="g8363"
+     clip-path="url(#clipPath204)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.98400021px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8361"
+       font-size="15.984px"
+       transform="matrix(1,0,0,-1,546.38,332.88)"><tspan
+         id="tspan8359"
+         y="0"
+         x="0 8.5674238 16.239744 26.517456 36.859104 46.577377 51.836113 62.753185 73.654274 77.026894 87.352562 91.892014 103.99191 108.33955 115.66022 118.85703 128.60727 136.63123 147.02083">Executable &amp; Linker</tspan></text>
+</g><g
+     id="g8369"
+     clip-path="url(#clipPath216)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8367"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,313.66)"><tspan
+         id="tspan8365"
+         y="0"
+         x="0 7.6767602 18.13056 22.934521 37.904999 48.805679">Format</tspan></text>
+</g><g
+     id="g8375"
+     clip-path="url(#clipPath228)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8373"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,292.42)"><tspan
+         id="tspan8371"
+         y="0"
+         x="0 12.97548 23.87616 27.22776 30.579359 33.80328 43.538879 54.200161 58.39764 71.373123 81.82692 91.562523 100.6278 110.95392 120.68952 125.95632 129.18024 139.63403 149.36964 155.56212">Calling Conventions.</tspan></text>
+</g><g
+     id="g8381"
+     clip-path="url(#clipPath240)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8379"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,546.38,271.3)"><tspan
+         id="tspan8377"
+         y="0"
+         x="0">…</tspan></text>
+</g><path
+     style="fill:none;stroke:#ffffff;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:18.239544, 24.319392"
+     inkscape:connector-curvature="0"
+     id="path8383"
+     stroke-miterlimit="10"
+     d="M 122.71693,120.47699 H 782.84709" /><path
+     style="fill:none;stroke:#ffffff;stroke-width:6.07984781;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:18.239544, 24.319392"
+     inkscape:connector-curvature="0"
+     id="path8385"
+     stroke-miterlimit="10"
+     d="M 177.27556,413.58966 H 837.40573" /><g
+     id="g8391"
+     clip-path="url(#clipPath260)"
+     transform="matrix(1.3333,0,0,-1.3333,-143.35642,633.10417)"><text
+       style="font-style:italic;font-size:15.96000004px;font-family:'Century Gothic';fill:#3b3059"
+       id="text8389"
+       font-style="italic"
+       font-size="15.96px"
+       transform="matrix(1,0,0,-1,483.19,405.82)"><tspan
+         id="tspan8387"
+         y="0"
+         x="0 5.0114398 14.71512 24.45072 34.77684 40.299 43.522919 53.976719 63.712318 68.13324 78.459358 89.360039 92.583961 95.807877">function calls</tspan></text>
+</g><path
+     style="fill:none;stroke:#3b3059;stroke-width:0.95997602;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8393"
+     stroke-miterlimit="10"
+     d="m 574.38564,303.03242 c -11.93304,0 -21.59946,-1.61329 -21.59946,-3.59991 V 164.62255 c 0,-1.98662 -9.66643,-3.59991 -21.59946,-3.59991 11.93303,0 21.59946,-1.61329 21.59946,-3.59991 v -18.30621 c 0,-1.98662 9.66642,-3.59991 21.59946,-3.59991" /><path
+     style="fill:none;stroke:#3b3059;stroke-width:0.95997602;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
+     inkscape:connector-curvature="0"
+     id="path8395"
+     stroke-miterlimit="10"
+     d="m 372.63068,389.43026 c 13.293,0 24.0794,-1.79995 24.0794,-4.01323 v -91.53105 c 0,-2.21327 10.78639,-4.01323 24.0794,-4.01323 -13.29301,0 -24.0794,-1.79995 -24.0794,-4.01323 v -65.3717 c 0,-2.21328 -10.7864,-4.01323 -24.0794,-4.01323" /></svg>
\ No newline at end of file
diff --git a/doc/guides/contributing/stable.rst b/doc/guides/contributing/stable.rst
index 6a5eee9..4d38bb8 100644
--- a/doc/guides/contributing/stable.rst
+++ b/doc/guides/contributing/stable.rst
@@ -1,7 +1,7 @@
 ..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2018 The DPDK contributors
 
-.. stable_lts_releases:
+.. _stable_lts_releases:
 
 DPDK Stable Releases and Long Term Support
 ==========================================
@@ -53,6 +53,9 @@ year's November (X.11) release will be maintained as an LTS for 2 years.
 After the X.11 release, an LTS branch will be created for it at
 http://git.dpdk.org/dpdk-stable where bugfixes will be backported to.
 
+A LTS release may align with the declaration of a new major ABI version,
+please read the :doc:`abi_policy` for more information.
+
 It is anticipated that there will be at least 4 releases per year of the LTS
 or approximately 1 every 3 months. However, the cadence can be shorter or
 longer depending on the number and criticality of the backported
@@ -119,10 +122,3 @@ A Stable Release will be released by:
   list.
 
 Stable releases are available on the `dpdk.org download page <http://core.dpdk.org/download/>`_.
-
-
-ABI
----
-
-The Stable Release should not be seen as a way of breaking or circumventing
-the DPDK ABI policy.
-- 
2.7.4


^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions
@ 2019-11-08 12:46 10% Ray Kinsella
  2019-11-08 12:46 18% ` [dpdk-dev] [PATCH v9 1/4] doc: separate versioning.rst into version and policy Ray Kinsella
                   ` (5 more replies)
  0 siblings, 6 replies; 200+ results
From: Ray Kinsella @ 2019-11-08 12:46 UTC (permalink / raw)
  To: dev
  Cc: mdr, thomas, stephen, bruce.richardson, ferruh.yigit,
	konstantin.ananyev, jerinj, olivier.matz, nhorman,
	maxime.coquelin, john.mcnamara, marko.kovacevic, hemant.agrawal,
	ktraynor, aconole

TL;DR abbreviation:
A major ABI version that all DPDK releases during an agreed period support. ABI
versioning is managed at a project-level, in place of library-level management.
ABI changes to add new features are permitted, as long as ABI compatibility with
the major ABI version is maintained.

Detail:
This patch introduces major ABI versions, initally released aligned with the LTS
release and maintained for one year through subsequent releases. The intention
is that the one year abi support period, will then be reviewed after the initial
year with the intention of lengthening the period for the next ABI version and
declaring new major ABI versions less frequently.

ABI changes that preserve ABI compatibility with the major ABI version are
permitted in subsequent releases. ABI changes, follow similar approval rules as
before with the additional gate of now requiring technical board approval. The
merging and release of ABI breaking changes would now be pushed to the
declaration of the next major ABI version.

This change encourages developers to maintain ABI compatibility with the major
ABI version, by promoting a permissive culture around those changes that
preserve ABI compatibility. This approach begins to align DPDK with those
projects that declare major ABI versions (e.g. version 2.x, 3.x) and support
those versions for some period, typically two years or more.

To provide an example of how this might work in practice:

 * DPDK v20 is declared as the supported ABI version for one year, aligned with
   the DPDK v19.11 (LTS) release. All library sonames are updated to reflect the
   new ABI version, e.g. librte_eal.so.20, librte_acl.so.20...
 * DPDK v20.02 .. v20.08 releases are ABI compatible with the DPDK v20 ABI. ABI
   changes are permitted from DPDK v20.02 onwards, with the condition that ABI
   compatibility with DPDK v20 is preserved.
 * DPDK v21 is declared as the new supported ABI version for two years, aligned
   with the DPDK v20.11 (LTS) release. The DPDK v20 ABI is now depreciated,
   library sonames are updated to v21 and ABI compatibility breaking changes may
   be introduced.

v9
 * Loosened up word around when new major ABI's are declared.
   (as suggested by Thomas Monjalon and agreed at the Techboard)

v8
 * Fixed intermediate build warnings, figure annotations and typo's.
   (as suggested by John McNamara).

v7
 * PNGs are now SVG. Some additional clarifications. Fixed typos and grammatical
   errors. (as suggested by Thomas Monjalon and David Marchand)

v6
 * Added figure to abi_policy.rst, comparing and contrasting the DPDK abi and
   api. (as suggested by Aaron Conole)

v5
 * Added figure to abi_policy.rst, mapping abi versions and abi compatibility to
   DPDK releases. (as suggested by Neil Horman)

v4
 * Removed changes to stable.rst, fixed typos and clarified the ABI policy
   "warning".

v3
 * Added myself as the maintainer of the ABI policy.
 * Updated the policy and versioning guides to use the year of the LTS+1 (e.g.
   v20), as the abi major version number.

v2
 * Restructured the patch into 3 patches:
   1. Splits the original versioning document into an ABI policy document
     and ABI versioning document.
   2. Add changes to the policy document introducing major ABI versions.
   3. Fixes up the versioning document in light of major ABI versioning. 
 * Reduces the initial ABI stability from two years to one year, with a review
   after the first year.
 * Adds detail around ABI version handling for experimental libraries.
 * Adds detail around chain of responsility for removing deprecated symbols.

Ray Kinsella (4):
  doc: separate versioning.rst into version and policy
  doc: changes to abi policy introducing major abi versions
  doc: updates to versioning guide for abi versions
  doc: add maintainer for abi policy

 MAINTAINERS                                        |    4 +
 doc/guides/contributing/abi_policy.rst             |  326 ++++++
 doc/guides/contributing/abi_versioning.rst         |  515 ++++++++++
 .../contributing/img/abi_stability_policy.svg      | 1059 ++++++++++++++++++++
 doc/guides/contributing/img/what_is_an_abi.svg     |  382 +++++++
 doc/guides/contributing/index.rst                  |    3 +-
 doc/guides/contributing/patches.rst                |    6 +-
 doc/guides/contributing/stable.rst                 |   12 +-
 doc/guides/contributing/versioning.rst             |  591 -----------
 doc/guides/rel_notes/deprecation.rst               |    6 +-
 10 files changed, 2298 insertions(+), 606 deletions(-)
 create mode 100644 doc/guides/contributing/abi_policy.rst
 create mode 100644 doc/guides/contributing/abi_versioning.rst
 create mode 100644 doc/guides/contributing/img/abi_stability_policy.svg
 create mode 100644 doc/guides/contributing/img/what_is_an_abi.svg
 delete mode 100644 doc/guides/contributing/versioning.rst

-- 
2.7.4


^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 11:37  0%               ` Ferruh Yigit
@ 2019-11-08 11:56  0%                 ` Matan Azrad
  2019-11-08 12:51  0%                   ` Ferruh Yigit
  2019-11-08 13:11  0%                   ` Ananyev, Konstantin
  0 siblings, 2 replies; 200+ results
From: Matan Azrad @ 2019-11-08 11:56 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev



From: Ferruh Yigit
> On 11/8/2019 10:10 AM, Matan Azrad wrote:
> >
> >
> > From: Ferruh Yigit
> >> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> >>> Hi
> >>>
> >>> From: Ferruh Yigit
> >>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> >>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> >>>>>
> >>>> 	RTE_ETHER_MAX_LEN;
> >>>>>  	}
> >>>>>
> >>>>> +	/*
> >>>>> +	 * If LRO is enabled, check that the maximum aggregated
> packet
> >>>>> +	 * size is supported by the configured device.
> >>>>> +	 */
> >>>>> +	if (dev_conf->rxmode.offloads &
> DEV_RX_OFFLOAD_TCP_LRO) {
> >>>>> +		ret = check_lro_pkt_size(
> >>>>> +				port_id, dev_conf-
> >>>>> rxmode.max_lro_pkt_size,
> >>>>> +				dev_info.max_lro_pkt_size);
> >>>>> +		if (ret != 0)
> >>>>> +			goto rollback;
> >>>>> +	}
> >>>>> +
> >>>>
> >>>> This check forces applications that enable LRO to provide
> >> 'max_lro_pkt_size'
> >>>> config value.
> >>>
> >>> Yes.(we can break an API, we noticed it)
> >>
> >> I am not talking about API/ABI breakage, that part is OK.
> >> With this check, if the application requested LRO offload but not
> >> provided 'max_lro_pkt_size' value, device configuration will fail.
> >>
> > Yes
> >> Can there be a case application is good with whatever the PMD can
> >> support as max?
> > Yes can be - you know, we can do everything we want but it is better to be
> consistent:
> > Due to the fact of Max rx pkt len field is mandatory for JUMBO offload, max
> lro pkt len should be mandatory for LRO offload.
> >
> > So your question is actually why both, non-lro packets and LRO packets max
> size are mandatory...
> >
> >
> > I think it should be important values for net applications management.
> > Also good for mbuf size managements.
> >
> >>>
> >>>> - Why it is mandatory now, how it was working before if it is
> >>>> mandatory value?
> >>>
> >>> It is the same as max_rx_pkt_len which is mandatory for jumbo frame
> >> offload.
> >>> So now, when the user configures a LRO offload he must to set max
> >>> lro pkt
> >> len.
> >>> We don't want to confuse the user here with the max rx pkt len
> >> configurations and behaviors, they should be with same logic.
> >>>
> >>> This parameter defines well the LRO behavior.
> >>> Before this, each PMD took its own interpretation to what should be
> >>> the
> >> maximum size for LRO aggregated packets.
> >>> Now, the user must say what is his intension, and the ethdev can
> >>> limit it
> >> according to the device capability.
> >>> By this way, also, the PMD can organize\optimize its data-path more.
> >>> Also, the application can create different mempools for LRO queues
> >>> to
> >> allow bigger packet receiving for LRO traffic.
> >>>
> >>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is '0'?
> >>> Yes, you can see the feature description Dekel added.
> >>> This patch also updates all the PMDs support an LRO for non-0 value.
> >>
> >> Of course I can see the updates Matan, my point is "What happens if
> >> PMD doesn't provide 'max_lro_pkt_size'",
> >> 1) There is no check for it right, so it is acceptable?
> >
> > There is check.
> > If the capability is 0, any non-zero configuration will fail.
> >
> >> 2) Are we making this filed mandatory to provide for PMDs, it is easy
> >> to make new fields mandatory for PMDs but is this really necessary?
> >
> > Yes, for consistence.
> >
> >>>
> >>> as same as max rx pkt len, no?
> >>>
> >>>> - What do you think setting 'max_lro_pkt_size' config value to what
> >>>> PMD provided if application doesn't provide it?
> >>> Same answers as above.
> >>>
> >>
> >> If application doesn't care the value, as it has been till now, and
> >> not provided explicit 'max_lro_pkt_size', why not ethdev level use
> >> the value provided by PMD instead of failing?
> >
> > Again, same question we can ask on max rx pkt len.
> >
> > Looks like the packet size is very important value which should be set by
> the application.
> >
> > Previous applications have no option to configure it, so they haven't
> configure it, (probably cover it somehow) I think it is our miss to supply this
> info.
> >
> > Let's do it in same way as we do max rx pkt len (as this patch main idea).
> > Later, we can change both to other meaning.
> >
> 
> I think it is not a good reason to introduce a new mandatory config option for
> application because of 'max_rx_pkt_len' does it.

It is mandatory only if LRO offload is configured.

> Will it work, if:
> - If application doesn't provide this value, use the PMD max

May cause a problem if the mbuf size is not enough for the PMD maximum.
 
> - If both application and PMD doesn't provide this value, fail on configure()?

It will work.
In my opinion - not ideal.

Matan



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08 10:10  0%             ` Matan Azrad
@ 2019-11-08 11:37  0%               ` Ferruh Yigit
  2019-11-08 11:56  0%                 ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-08 11:37 UTC (permalink / raw)
  To: Matan Azrad, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

On 11/8/2019 10:10 AM, Matan Azrad wrote:
> 
> 
> From: Ferruh Yigit
>> On 11/8/2019 6:54 AM, Matan Azrad wrote:
>>> Hi
>>>
>>> From: Ferruh Yigit
>>>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
>>>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>>>>>
>>>> 	RTE_ETHER_MAX_LEN;
>>>>>  	}
>>>>>
>>>>> +	/*
>>>>> +	 * If LRO is enabled, check that the maximum aggregated packet
>>>>> +	 * size is supported by the configured device.
>>>>> +	 */
>>>>> +	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
>>>>> +		ret = check_lro_pkt_size(
>>>>> +				port_id, dev_conf-
>>>>> rxmode.max_lro_pkt_size,
>>>>> +				dev_info.max_lro_pkt_size);
>>>>> +		if (ret != 0)
>>>>> +			goto rollback;
>>>>> +	}
>>>>> +
>>>>
>>>> This check forces applications that enable LRO to provide
>> 'max_lro_pkt_size'
>>>> config value.
>>>
>>> Yes.(we can break an API, we noticed it)
>>
>> I am not talking about API/ABI breakage, that part is OK.
>> With this check, if the application requested LRO offload but not provided
>> 'max_lro_pkt_size' value, device configuration will fail.
>>
> Yes
>> Can there be a case application is good with whatever the PMD can support
>> as max?
> Yes can be - you know, we can do everything we want but it is better to be consistent:
> Due to the fact of Max rx pkt len field is mandatory for JUMBO offload, max lro pkt len should be mandatory for LRO offload.
> 
> So your question is actually why both, non-lro packets and LRO packets max size are mandatory...
> 
> 
> I think it should be important values for net applications management.
> Also good for mbuf size managements.
> 
>>>
>>>> - Why it is mandatory now, how it was working before if it is
>>>> mandatory value?
>>>
>>> It is the same as max_rx_pkt_len which is mandatory for jumbo frame
>> offload.
>>> So now, when the user configures a LRO offload he must to set max lro pkt
>> len.
>>> We don't want to confuse the user here with the max rx pkt len
>> configurations and behaviors, they should be with same logic.
>>>
>>> This parameter defines well the LRO behavior.
>>> Before this, each PMD took its own interpretation to what should be the
>> maximum size for LRO aggregated packets.
>>> Now, the user must say what is his intension, and the ethdev can limit it
>> according to the device capability.
>>> By this way, also, the PMD can organize\optimize its data-path more.
>>> Also, the application can create different mempools for LRO queues to
>> allow bigger packet receiving for LRO traffic.
>>>
>>>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is '0'?
>>> Yes, you can see the feature description Dekel added.
>>> This patch also updates all the PMDs support an LRO for non-0 value.
>>
>> Of course I can see the updates Matan, my point is "What happens if PMD
>> doesn't provide 'max_lro_pkt_size'",
>> 1) There is no check for it right, so it is acceptable?
> 
> There is check.
> If the capability is 0, any non-zero configuration will fail. 
> 
>> 2) Are we making this filed mandatory to provide for PMDs, it is easy to make
>> new fields mandatory for PMDs but is this really necessary?
> 
> Yes, for consistence.
> 
>>>
>>> as same as max rx pkt len, no?
>>>
>>>> - What do you think setting 'max_lro_pkt_size' config value to what
>>>> PMD provided if application doesn't provide it?
>>> Same answers as above.
>>>
>>
>> If application doesn't care the value, as it has been till now, and not provided
>> explicit 'max_lro_pkt_size', why not ethdev level use the value provided by
>> PMD instead of failing?
> 
> Again, same question we can ask on max rx pkt len.
> 
> Looks like the packet size is very important value which should be set by the application.
> 
> Previous applications have no option to configure it, so they haven't configure it, (probably cover it somehow) I think it is our miss to supply this info.
> 
> Let's do it in same way as we do max rx pkt len (as this patch main idea).
> Later, we can change both to other meaning.
> 

I think it is not a good reason to introduce a new mandatory config option for
application because of 'max_rx_pkt_len' does it.

Will it work, if:
- If application doesn't provide this value, use the PMD max
- If both application and PMD doesn't provide this value, fail on configure()?


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension
  2019-11-08  9:57  0% ` Ferruh Yigit
@ 2019-11-08 10:52  0%   ` Andrew Rybchenko
  0 siblings, 0 replies; 200+ results
From: Andrew Rybchenko @ 2019-11-08 10:52 UTC (permalink / raw)
  To: Ferruh Yigit, Thomas Monjalon; +Cc: dev

On 11/8/19 12:57 PM, Ferruh Yigit wrote:
> On 11/7/2019 10:15 PM, Thomas Monjalon wrote:
>> The struct rte_eth_dev and rte_eth_dev_data are supposed
>> to be used internally only, but there is a chance that
>> increasing their size would break ABI for some applications.
>> In order to allow smooth addition of features without breaking
>> ABI compatibility, some space is reserved.
>>
>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  2019-11-08  9:19  3%           ` Ferruh Yigit
@ 2019-11-08 10:10  0%             ` Matan Azrad
  2019-11-08 11:37  0%               ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2019-11-08 10:10 UTC (permalink / raw)
  To: Ferruh Yigit, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev



From: Ferruh Yigit
> On 11/8/2019 6:54 AM, Matan Azrad wrote:
> > Hi
> >
> > From: Ferruh Yigit
> >> On 11/7/2019 12:35 PM, Dekel Peled wrote:
> >>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
> >>>
> >> 	RTE_ETHER_MAX_LEN;
> >>>  	}
> >>>
> >>> +	/*
> >>> +	 * If LRO is enabled, check that the maximum aggregated packet
> >>> +	 * size is supported by the configured device.
> >>> +	 */
> >>> +	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
> >>> +		ret = check_lro_pkt_size(
> >>> +				port_id, dev_conf-
> >>> rxmode.max_lro_pkt_size,
> >>> +				dev_info.max_lro_pkt_size);
> >>> +		if (ret != 0)
> >>> +			goto rollback;
> >>> +	}
> >>> +
> >>
> >> This check forces applications that enable LRO to provide
> 'max_lro_pkt_size'
> >> config value.
> >
> > Yes.(we can break an API, we noticed it)
> 
> I am not talking about API/ABI breakage, that part is OK.
> With this check, if the application requested LRO offload but not provided
> 'max_lro_pkt_size' value, device configuration will fail.
> 
Yes
> Can there be a case application is good with whatever the PMD can support
> as max?
Yes can be - you know, we can do everything we want but it is better to be consistent:
Due to the fact of Max rx pkt len field is mandatory for JUMBO offload, max lro pkt len should be mandatory for LRO offload.

So your question is actually why both, non-lro packets and LRO packets max size are mandatory...


I think it should be important values for net applications management.
Also good for mbuf size managements.

> >
> >> - Why it is mandatory now, how it was working before if it is
> >> mandatory value?
> >
> > It is the same as max_rx_pkt_len which is mandatory for jumbo frame
> offload.
> > So now, when the user configures a LRO offload he must to set max lro pkt
> len.
> > We don't want to confuse the user here with the max rx pkt len
> configurations and behaviors, they should be with same logic.
> >
> > This parameter defines well the LRO behavior.
> > Before this, each PMD took its own interpretation to what should be the
> maximum size for LRO aggregated packets.
> > Now, the user must say what is his intension, and the ethdev can limit it
> according to the device capability.
> > By this way, also, the PMD can organize\optimize its data-path more.
> > Also, the application can create different mempools for LRO queues to
> allow bigger packet receiving for LRO traffic.
> >
> >> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is '0'?
> > Yes, you can see the feature description Dekel added.
> > This patch also updates all the PMDs support an LRO for non-0 value.
> 
> Of course I can see the updates Matan, my point is "What happens if PMD
> doesn't provide 'max_lro_pkt_size'",
> 1) There is no check for it right, so it is acceptable?

There is check.
If the capability is 0, any non-zero configuration will fail. 

> 2) Are we making this filed mandatory to provide for PMDs, it is easy to make
> new fields mandatory for PMDs but is this really necessary?

Yes, for consistence.

> >
> > as same as max rx pkt len, no?
> >
> >> - What do you think setting 'max_lro_pkt_size' config value to what
> >> PMD provided if application doesn't provide it?
> > Same answers as above.
> >
> 
> If application doesn't care the value, as it has been till now, and not provided
> explicit 'max_lro_pkt_size', why not ethdev level use the value provided by
> PMD instead of failing?

Again, same question we can ask on max rx pkt len.

Looks like the packet size is very important value which should be set by the application.

Previous applications have no option to configure it, so they haven't configure it, (probably cover it somehow) I think it is our miss to supply this info.

Let's do it in same way as we do max rx pkt len (as this patch main idea).
Later, we can change both to other meaning.

Matan



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension
  2019-11-07 22:15  4% [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension Thomas Monjalon
  2019-11-08  3:41  0% ` Stephen Hemminger
@ 2019-11-08  9:57  0% ` Ferruh Yigit
  2019-11-08 10:52  0%   ` Andrew Rybchenko
  2019-11-11  7:26  4% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-08  9:57 UTC (permalink / raw)
  To: Thomas Monjalon, Andrew Rybchenko; +Cc: dev

On 11/7/2019 10:15 PM, Thomas Monjalon wrote:
> The struct rte_eth_dev and rte_eth_dev_data are supposed
> to be used internally only, but there is a chance that
> increasing their size would break ABI for some applications.
> In order to allow smooth addition of features without breaking
> ABI compatibility, some space is reserved.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>

Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension
  2019-11-08  3:41  0% ` Stephen Hemminger
@ 2019-11-08  9:40  0%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-08  9:40 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Ferruh Yigit, Andrew Rybchenko, dev

08/11/2019 04:41, Stephen Hemminger:
> On Thu,  7 Nov 2019 23:15:24 +0100
> Thomas Monjalon <thomas@monjalon.net> wrote:
> 
> > The struct rte_eth_dev and rte_eth_dev_data are supposed
> > to be used internally only, but there is a chance that
> > increasing their size would break ABI for some applications.
> > In order to allow smooth addition of features without breaking
> > ABI compatibility, some space is reserved.
> > 
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > ---
> > @@ -764,6 +767,9 @@ struct rte_eth_dev_data {
> > +
> > +	uint64_t reserved_64s[4]; /**< Reserved for future fields */
> > +	void *reserved_ptrs[4]; /**< Reserved for future fields */
> >  } __rte_cache_aligned;
> 
> Void * is 32 bits on 32 bit architectures is that helpful or not?

That's why I reserved separately uint and pointers.
If we need to add a pointer, we decrease the size of the pointer array
to keep the same struct size on all archs.



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  @ 2019-11-08  9:19  3%           ` Ferruh Yigit
  2019-11-08 10:10  0%             ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2019-11-08  9:19 UTC (permalink / raw)
  To: Matan Azrad, Dekel Peled, john.mcnamara, marko.kovacevic,
	nhorman, ajit.khaparde, somnath.kotur, anatoly.burakov,
	xuanziyang2, cloud.wangxiaoyun, zhouguoyang, wenzhuo.lu,
	konstantin.ananyev, Shahaf Shuler, Slava Ovsiienko, rmody,
	shshaikh, maxime.coquelin, tiwei.bie, zhihong.wang, yongwang,
	Thomas Monjalon, arybchenko, jingjing.wu, bernard.iremonger
  Cc: dev

On 11/8/2019 6:54 AM, Matan Azrad wrote:
> Hi
> 
> From: Ferruh Yigit
>> On 11/7/2019 12:35 PM, Dekel Peled wrote:
>>> @@ -1266,6 +1286,18 @@ struct rte_eth_dev *
>>>
>> 	RTE_ETHER_MAX_LEN;
>>>  	}
>>>
>>> +	/*
>>> +	 * If LRO is enabled, check that the maximum aggregated packet
>>> +	 * size is supported by the configured device.
>>> +	 */
>>> +	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
>>> +		ret = check_lro_pkt_size(
>>> +				port_id, dev_conf-
>>> rxmode.max_lro_pkt_size,
>>> +				dev_info.max_lro_pkt_size);
>>> +		if (ret != 0)
>>> +			goto rollback;
>>> +	}
>>> +
>>
>> This check forces applications that enable LRO to provide 'max_lro_pkt_size'
>> config value.
> 
> Yes.(we can break an API, we noticed it)

I am not talking about API/ABI breakage, that part is OK.
With this check, if the application requested LRO offload but not provided
'max_lro_pkt_size' value, device configuration will fail.

Can there be a case application is good with whatever the PMD can support as max?

> 
>> - Why it is mandatory now, how it was working before if it is mandatory
>> value?
> 
> It is the same as max_rx_pkt_len which is mandatory for jumbo frame offload.
> So now, when the user configures a LRO offload he must to set max lro pkt len.
> We don't want to confuse the user here with the max rx pkt len configurations and behaviors, they should be with same logic.
> 
> This parameter defines well the LRO behavior.
> Before this, each PMD took its own interpretation to what should be the maximum size for LRO aggregated packets.
> Now, the user must say what is his intension, and the ethdev can limit it according to the device capability.
> By this way, also, the PMD can organize\optimize its data-path more.
> Also, the application can create different mempools for LRO queues to allow bigger packet receiving for LRO traffic.
>  
>> - What happens if PMD doesn't provide 'max_lro_pkt_size', so it is '0'?
> Yes, you can see the feature description Dekel added.
> This patch also updates all the PMDs support an LRO for non-0 value.

Of course I can see the updates Matan, my point is "What happens if PMD doesn't
provide 'max_lro_pkt_size'",
1) There is no check for it right, so it is acceptable?
2) Are we making this filed mandatory to provide for PMDs, it is easy to make
new fields mandatory for PMDs but is this really necessary?

> 
> as same as max rx pkt len, no?
> 
>> - What do you think setting 'max_lro_pkt_size' config value to what PMD
>> provided if application doesn't provide it?
> Same answers as above.
> 

If application doesn't care the value, as it has been till now, and not provided
explicit 'max_lro_pkt_size', why not ethdev level use the value provided by PMD
instead of failing?

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension
  2019-11-07 22:15  4% [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension Thomas Monjalon
@ 2019-11-08  3:41  0% ` Stephen Hemminger
  2019-11-08  9:40  0%   ` Thomas Monjalon
  2019-11-08  9:57  0% ` Ferruh Yigit
  2019-11-11  7:26  4% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2019-11-08  3:41 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: Ferruh Yigit, Andrew Rybchenko, dev

On Thu,  7 Nov 2019 23:15:24 +0100
Thomas Monjalon <thomas@monjalon.net> wrote:

> The struct rte_eth_dev and rte_eth_dev_data are supposed
> to be used internally only, but there is a chance that
> increasing their size would break ABI for some applications.
> In order to allow smooth addition of features without breaking
> ABI compatibility, some space is reserved.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
>  lib/librte_ethdev/rte_ethdev_core.h | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h
> index 392aea8e6b..ea8dd1d9ba 100644
> --- a/lib/librte_ethdev/rte_ethdev_core.h
> +++ b/lib/librte_ethdev/rte_ethdev_core.h
> @@ -698,6 +698,9 @@ struct rte_eth_dev {
>  	struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
>  	enum rte_eth_dev_state state; /**< Flag indicating the port state */
>  	void *security_ctx; /**< Context for security ops */
> +
> +	uint64_t reserved_64s[4]; /**< Reserved for future fields */
> +	void *reserved_ptrs[4]; /**< Reserved for future fields */
>  } __rte_cache_aligned;
>  
>  struct rte_eth_dev_sriov;
> @@ -764,6 +767,9 @@ struct rte_eth_dev_data {
>  			/**< Switch-specific identifier.
>  			 *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.
>  			 */
> +
> +	uint64_t reserved_64s[4]; /**< Reserved for future fields */
> +	void *reserved_ptrs[4]; /**< Reserved for future fields */
>  } __rte_cache_aligned;
>  
>  /**

Void * is 32 bits on 32 bit architectures is that helpful or not?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 1/1] fbarray: fix duplicated fbarray file in secondary
  @ 2019-11-08  3:19  3%               ` Yasufumi Ogawa
  0 siblings, 0 replies; 200+ results
From: Yasufumi Ogawa @ 2019-11-08  3:19 UTC (permalink / raw)
  To: Burakov, Anatoly, Ananyev, Konstantin, David Marchand
  Cc: dev, dpdk stable, Yasufumi Ogawa

>>> -----Original Message-----
>>> From: Burakov, Anatoly <anatoly.burakov@intel.com>
>>> Sent: Tuesday, November 5, 2019 11:31 AM
>>> To: David Marchand <david.marchand@redhat.com>; Yasufumi Ogawa 
>>> <yasufum.o@gmail.com>
>>> Cc: Ananyev, Konstantin <konstantin.ananyev@intel.com>; dev 
>>> <dev@dpdk.org>; dpdk stable <stable@dpdk.org>; Yasufumi Ogawa
>>> <ogawa.yasufumi@lab.ntt.co.jp>
>>> Subject: Re: [PATCH v6 1/1] fbarray: fix duplicated fbarray file in 
>>> secondary
>>>
>>> On 05-Nov-19 10:13 AM, David Marchand wrote:
>>>> Hello Anatoly, Yasufumi,
>>>>
>>>> On Mon, Nov 4, 2019 at 11:20 AM Burakov, Anatoly
>>>> <anatoly.burakov@intel.com> wrote:
>>>>>
>>>>> On 01-Nov-19 9:04 AM, yasufum.o@gmail.com wrote:
>>>>>> From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
>>>>>>
>>>>>> In secondary_msl_create_walk(), it creates a file for fbarrays 
>>>>>> with its
>>>>>> PID for reserving unique name among secondary processes. However, it
>>>>>> does not work if several secondaries run as app containers because 
>>>>>> each
>>>>>> of containerized secondary has PID 1, and failed to reserve unique 
>>>>>> name
>>>>>> other than first one. To reserve unique name in each of 
>>>>>> containers, use
>>>>>> hostname in addition to PID.
>>>>>>
>>>>>> Cc: stable@dpdk.org
>>>>
>>>> We can't backport this as is, see below.
>>>>
>>>>
>>>>>>
>>>>>> Signed-off-by: Yasufumi Ogawa <yasufum.o@gmail.com>
>>>>>> ---
>>>>>>     lib/librte_eal/common/include/rte_fbarray.h |  2 +-
>>>>>>     lib/librte_eal/linux/eal/eal_memalloc.c     | 11 ++++++++---
>>>>>>     2 files changed, 9 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/lib/librte_eal/common/include/rte_fbarray.h 
>>>>>> b/lib/librte_eal/common/include/rte_fbarray.h
>>>>>> index 6dccdbec9..5c2815093 100644
>>>>>> --- a/lib/librte_eal/common/include/rte_fbarray.h
>>>>>> +++ b/lib/librte_eal/common/include/rte_fbarray.h
>>>>>> @@ -39,7 +39,7 @@ extern "C" {
>>>>>>     #include <rte_compat.h>
>>>>>>     #include <rte_rwlock.h>
>>>>>>
>>>>>> -#define RTE_FBARRAY_NAME_LEN 64
>>>>>> +#define RTE_FBARRAY_NAME_LEN NAME_MAX
>>>>
>>>> The change on RTE_FBARRAY_NAME_LEN breaks the ABI, so we cannot
>>>> backport this as is.
>>>> For 19.11, we can allow this breakage, but we need an update of the
>>>> release notes.
OK. I wasn't careful for the ABI change. I think RTE_FBARRAY_NAME_LEN 64 
is enough without using hostname as a part of fbarray. So I would like 
to discard this change.

>>>>
>>>> Besides, what is the impact in terms of memory consumption?
>>>>
>>>>
>>>>>>
>>>>>>     struct rte_fbarray {
>>>>>>         char name[RTE_FBARRAY_NAME_LEN]; /**< name associated with 
>>>>>> an array */
>>>>>> diff --git a/lib/librte_eal/linux/eal/eal_memalloc.c 
>>>>>> b/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>>> index af6d0d023..24f0275c9 100644
>>>>>> --- a/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>>> +++ b/lib/librte_eal/linux/eal/eal_memalloc.c
>>>>>> @@ -1365,6 +1365,7 @@ secondary_msl_create_walk(const struct 
>>>>>> rte_memseg_list *msl,
>>>>>>         struct rte_memseg_list *primary_msl, *local_msl;
>>>>>>         char name[PATH_MAX];
>>>>>>         int msl_idx, ret;
>>>>>> +     char hostname[HOST_NAME_MAX] = { 0 };
>>>>>>
>>>>>>         if (msl->external)
>>>>>>                 return 0;
>>>>>> @@ -1373,9 +1374,13 @@ secondary_msl_create_walk(const struct 
>>>>>> rte_memseg_list *msl,
>>>>>>         primary_msl = &mcfg->memsegs[msl_idx];
>>>>>>         local_msl = &local_memsegs[msl_idx];
>>>>>>
>>>>>> -     /* create distinct fbarrays for each secondary */
>>>>>> -     snprintf(name, RTE_FBARRAY_NAME_LEN, "%s_%i",
>>>>>> -             primary_msl->memseg_arr.name, getpid());
>>>>>> +     /* Create distinct fbarrays for each secondary by using PID and
>>>>>> +      * hostname. The reason why using hostname is because PID 
>>>>>> could be
>>>>>> +      * duplicated among secondaries if it is launched in a 
>>>>>> container.
>>>>>> +      */
>>>>>> +     gethostname(hostname, HOST_NAME_MAX);
>>>>
>>>> Personal preference, s/HOST_NAME_MAX/sizeof(hostname)/.
>>>>
>>>>
>>>> hostname[] is HOST_NAME_MAX bytes long.
>>>> In the worst case, we can get a non NULL terminated hostname string.
>>>> "
>>>>          gethostname() returns the null-terminated hostname in the
>>>> character array name, which has a length of len bytes.  If the
>>>> null-terminated hostname is too large to fit, then the name is
>>>> truncated, and
>>>>          no error is returned (but see NOTES below).  POSIX.1-2001 says
>>>> that if such truncation occurs, then it is unspecified whether the
>>>> returned buffer includes a terminating null byte.
>>>> ...
>>>> NOTES
>>>>          SUSv2 guarantees that "Host names are limited to 255 bytes".
>>>> POSIX.1-2001 guarantees that "Host names (not including the
>>>> terminating null byte) are  limited  to  HOST_NAME_MAX  bytes".   On
>>>> Linux,
>>>>          HOST_NAME_MAX is defined with the value 64, which has been the
>>>> limit since Linux 1.0 (earlier kernels imposed a limit of 8 bytes).
>>>> "
>>>>
>>>> How about making hostname[] HOST_NAME_MAX+1 bytes long?
>>>>
>>>>>> +     snprintf(name, RTE_FBARRAY_NAME_LEN, "%s_%s_%d",
>>>>>> +                     primary_msl->memseg_arr.name, hostname, 
>>>>>> (int)getpid());
>>>>>>
>>>>>>         ret = rte_fbarray_init(&local_msl->memseg_arr, name,
>>>>>>                 primary_msl->memseg_arr.len,
>>>>>>
>>>>>
>>>>> I think the order should be reversed. Both containers and 
>>>>> non-containers
>>>>> can have their hostname set, and RTE_FBARRAY_NAME_LEN is of fairly
>>>>> limited length, so if the hostname is long enough, the PID never gets
>>>>> into the name string, resulting in duplicates. It is better have 
>>>>> pid first.
>>>>
>>>> Anatoly,
>>>>
>>>> On the principle, it seems better, yes.
>>>> Just the comment on RTE_FBARRAY_NAME_LEN indicates that you missed the
>>>> change at the top of the patch.
>>>> What do you think of this change?
>>>>
>>>
>>> Yes, i did miss that, apologies.
>>>
>>> I don't have a strong opinion on this change, however the above comment
>>> would still be true if we make fbarray size to be hostname_max + 1 - we
>>> still potentially get no space for a pid. So if we're going to have pid
>>> in there as well, it should be hostname_max + pid_max (5 digits?) +
>>> whatever underscores we have + null terminator, to ensure it fits under
>>> any and all circumstances.#
In "man 5 proc", it says the default value of pid_max is 32768, but can 
be set up to 2^22 (=4194304) on 64-bit systems. So, I think it is safer 
to consider pid_max is 7 digits.

I can find secondary's fbarray file named as
$ sudo ls /var/run/dpdk/rte/
...
fbarray_memseg-1048576k-0-0_24118
fbarray_memseg-1048576k-0-0_24191
fbarray_memseg-1048576k-0-0_24199
...

It consists of [prefix]-[hugepage size]-[numa node?]-[memchan?]_[PID]", 
and size of the name before PID is totally 28 digits. If another 
underscore and hostname are included in the name, the max size of 
fbarray file name is
   28 + 7(PID) + 1(underscore) + HOST_NAME_MAX+1(null terminator)

Considering 28 can be larger, how about using 32 as following?
+     int fbarray_sec_name_len = 32 + 7 + 1 + HOST_NAME_MAX + 1;

+     snprintf(name, fbarray_sec_name_len, "%s_%d_%s",
+                     primary_msl->memseg_arr.name, getpid(), hostname);

>>
>> I think that at least on linux we have more than enough space here:
>>
>> $ find /usr/include -type f | xargs grep ' NAME_MAX' | grep define
>> /usr/include/linux/limits.h:#define NAME_MAX         255        /* # 
>> chars in a file name */
>>
>> $ find /usr/include -type f | xargs grep ' HOST_NAME_MAX' | grep define
>> /usr/include/i386-linux-gnu/bits/local_lim.h:#define 
>> HOST_NAME_MAX             64
>> /usr/include/x86_64-linux-gnu/bits/local_lim.h:#define 
>> HOST_NAME_MAX           64
>>
> 
> Okay, works for me :)

Thanks,
Yasufumi

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension
@ 2019-11-07 22:15  4% Thomas Monjalon
  2019-11-08  3:41  0% ` Stephen Hemminger
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Thomas Monjalon @ 2019-11-07 22:15 UTC (permalink / raw)
  To: Ferruh Yigit, Andrew Rybchenko; +Cc: dev

The struct rte_eth_dev and rte_eth_dev_data are supposed
to be used internally only, but there is a chance that
increasing their size would break ABI for some applications.
In order to allow smooth addition of features without breaking
ABI compatibility, some space is reserved.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 lib/librte_ethdev/rte_ethdev_core.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h
index 392aea8e6b..ea8dd1d9ba 100644
--- a/lib/librte_ethdev/rte_ethdev_core.h
+++ b/lib/librte_ethdev/rte_ethdev_core.h
@@ -698,6 +698,9 @@ struct rte_eth_dev {
 	struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
 	enum rte_eth_dev_state state; /**< Flag indicating the port state */
 	void *security_ctx; /**< Context for security ops */
+
+	uint64_t reserved_64s[4]; /**< Reserved for future fields */
+	void *reserved_ptrs[4]; /**< Reserved for future fields */
 } __rte_cache_aligned;
 
 struct rte_eth_dev_sriov;
@@ -764,6 +767,9 @@ struct rte_eth_dev_data {
 			/**< Switch-specific identifier.
 			 *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.
 			 */
+
+	uint64_t reserved_64s[4]; /**< Reserved for future fields */
+	void *reserved_ptrs[4]; /**< Reserved for future fields */
 } __rte_cache_aligned;
 
 /**
-- 
2.23.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps
                     ` (2 preceding siblings ...)
  2019-11-07  6:35  0% ` Rajesh Ravi
@ 2019-11-07 15:35  0% ` David Marchand
  3 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-07 15:35 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Bruce Richardson, Rajesh Ravi, Ajit Khaparde,
	Jonathan Richardson, Scott Branden, Vikram Mysore Prakash,
	Srinath Mannam, Thomas Monjalon, dpdk stable

On Tue, Nov 5, 2019 at 4:15 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> Currently, externally created heaps are supposed to be automatically
> mapped for VFIO DMA by EAL, however they only do so if, at the time of
> heap creation, VFIO is initialized and has at least one device
> available. If no devices are available at the time of heap creation (or
> if devices were available, but were since hot-unplugged, thus dropping
> all VFIO container mappings), then VFIO mapping code would have skipped
> over externally allocated heaps.
>
> The fix is two-fold. First, we allow externally allocated memory
> segments to be marked as "heap" segments. This allows us to distinguish
> between external memory segments that were created via heap API, from
> those that were created via rte_extmem_register() API.
>
> Then, we fix the VFIO code to only skip non-heap external segments.
> Also, since external heaps are not guaranteed to have valid IOVA
> addresses, we will skip those which have invalid IOVA addresses as well.
>
> Fixes: 0f526d674f8e ("malloc: separate creating memseg list and malloc heap")
Cc: stable@dpdk.org

>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Rajesh Ravi <rajesh.ravi@broadcom.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>

> ---
>
> Notes:
>     This cannot be backported to older releases as it breaks the
>     API and ABI. A separate fix is in the works for stable.
>

Applied, thanks.


--
David Marchand


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v7 02/12] build: annotate versioned symbols with __vsym macro
    2019-11-07 15:03  3%   ` [dpdk-dev] [PATCH v7 01/12] doc: fix description of versioning macros Andrzej Ostruszka
@ 2019-11-07 15:03  2%   ` Andrzej Ostruszka
  1 sibling, 0 replies; 200+ results
From: Andrzej Ostruszka @ 2019-11-07 15:03 UTC (permalink / raw)
  To: dev, John McNamara, Marko Kovacevic, David Hunt, Neil Horman,
	Bruce Richardson, Vladimir Medvedkin, Robert Sanford,
	Erik Gabriel Carrillo
  Cc: mattias.ronnblom, stephen

Every implementation of a particular version of given symbol needs to be
marked in its declaration as such (using `__vsym` macro).  This patch
fixes this and also clarifies the documentation about that.

Signed-off-by: Andrzej Ostruszka <aostruszka@marvell.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 doc/guides/contributing/versioning.rst        | 14 +++++++---
 lib/librte_distributor/rte_distributor.c      | 18 ++++++------
 lib/librte_distributor/rte_distributor_v20.c  | 18 ++++++------
 .../common/include/rte_function_versioning.h  |  7 +++++
 lib/librte_lpm/rte_lpm.c                      | 28 +++++++++----------
 lib/librte_lpm/rte_lpm6.c                     | 16 +++++------
 lib/librte_timer/rte_timer.c                  | 20 ++++++-------
 7 files changed, 67 insertions(+), 54 deletions(-)

diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
index 8a38928c0..fcd2d50f1 100644
--- a/doc/guides/contributing/versioning.rst
+++ b/doc/guides/contributing/versioning.rst
@@ -225,6 +225,10 @@ The macros exported are:
   fully qualified function ``p``, so that if a symbol becomes versioned, it
   can still be mapped back to the public symbol name.
 
+* ``__vsym``:  Annotation to be used in a declaration of the internal symbol
+  ``be`` to signal that it is being used as an implementation of a particular
+  version of symbol ``b``.
+
 Examples of ABI Macro use
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
@@ -345,8 +349,9 @@ with the public symbol name
 
 .. code-block:: c
 
-  struct rte_acl_ctx *
+ -struct rte_acl_ctx *
  -rte_acl_create(const struct rte_acl_param *param)
+ +struct rte_acl_ctx * __vsym
  +rte_acl_create_v20(const struct rte_acl_param *param)
  {
         size_t sz;
@@ -354,7 +359,8 @@ with the public symbol name
         ...
 
 Note that the base name of the symbol was kept intact, as this is conducive to
-the macros used for versioning symbols.  That is our next step, mapping this new
+the macros used for versioning symbols and we have annotated the function as an
+implementation of versioned symbol.  That is our next step, mapping this new
 symbol name to the initial symbol name at version node 2.0.  Immediately after
 the function, we add this line of code
 
@@ -374,7 +380,7 @@ name, with a different suffix, and  implement it appropriately
 
 .. code-block:: c
 
-   struct rte_acl_ctx *
+   struct rte_acl_ctx * __vsym
    rte_acl_create_v21(const struct rte_acl_param *param, int debug);
    {
         struct rte_acl_ctx *ctx = rte_acl_create_v20(param);
@@ -423,7 +429,7 @@ defined, we add this
 
 .. code-block:: c
 
-   struct rte_acl_ctx *
+   struct rte_acl_ctx * __vsym
    rte_acl_create_v21(const struct rte_acl_param *param, int debug)
    {
         ...
diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index 7df97df92..2cc32ddba 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -32,7 +32,7 @@ EAL_REGISTER_TAILQ(rte_dist_burst_tailq)
 
 /**** Burst Packet APIs called by workers ****/
 
-void
+void __vsym
 rte_distributor_request_pkt_v1705(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt,
 		unsigned int count)
@@ -89,7 +89,7 @@ MAP_STATIC_SYMBOL(void rte_distributor_request_pkt(struct rte_distributor *d,
 		unsigned int count),
 		rte_distributor_request_pkt_v1705);
 
-int
+int __vsym
 rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts)
 {
@@ -134,7 +134,7 @@ MAP_STATIC_SYMBOL(int rte_distributor_poll_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts),
 		rte_distributor_poll_pkt_v1705);
 
-int
+int __vsym
 rte_distributor_get_pkt_v1705(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts,
 		struct rte_mbuf **oldpkt, unsigned int return_count)
@@ -169,7 +169,7 @@ MAP_STATIC_SYMBOL(int rte_distributor_get_pkt(struct rte_distributor *d,
 		struct rte_mbuf **oldpkt, unsigned int return_count),
 		rte_distributor_get_pkt_v1705);
 
-int
+int __vsym
 rte_distributor_return_pkt_v1705(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt, int num)
 {
@@ -359,7 +359,7 @@ release(struct rte_distributor *d, unsigned int wkr)
 
 
 /* process a set of packets to distribute them to workers */
-int
+int __vsym
 rte_distributor_process_v1705(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs)
 {
@@ -506,7 +506,7 @@ MAP_STATIC_SYMBOL(int rte_distributor_process(struct rte_distributor *d,
 		rte_distributor_process_v1705);
 
 /* return to the caller, packets returned from workers */
-int
+int __vsym
 rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs)
 {
@@ -556,7 +556,7 @@ total_outstanding(const struct rte_distributor *d)
  * Flush the distributor, so that there are no outstanding packets in flight or
  * queued up.
  */
-int
+int __vsym
 rte_distributor_flush_v1705(struct rte_distributor *d)
 {
 	unsigned int flushed;
@@ -591,7 +591,7 @@ MAP_STATIC_SYMBOL(int rte_distributor_flush(struct rte_distributor *d),
 		rte_distributor_flush_v1705);
 
 /* clears the internal returns array in the distributor */
-void
+void __vsym
 rte_distributor_clear_returns_v1705(struct rte_distributor *d)
 {
 	unsigned int wkr;
@@ -613,7 +613,7 @@ MAP_STATIC_SYMBOL(void rte_distributor_clear_returns(struct rte_distributor *d),
 		rte_distributor_clear_returns_v1705);
 
 /* creates a distributor instance */
-struct rte_distributor *
+struct rte_distributor * __vsym
 rte_distributor_create_v1705(const char *name,
 		unsigned int socket_id,
 		unsigned int num_workers,
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_v20.c
index db6c49258..7a6fddf55 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_v20.c
@@ -27,7 +27,7 @@ EAL_REGISTER_TAILQ(rte_distributor_tailq)
 
 /**** APIs called by workers ****/
 
-void
+void __vsym
 rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
@@ -43,7 +43,7 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 }
 VERSION_SYMBOL(rte_distributor_request_pkt, _v20, 2.0);
 
-struct rte_mbuf *
+struct rte_mbuf * __vsym
 rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 		unsigned worker_id)
 {
@@ -59,7 +59,7 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 }
 VERSION_SYMBOL(rte_distributor_poll_pkt, _v20, 2.0);
 
-struct rte_mbuf *
+struct rte_mbuf * __vsym
 rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
@@ -71,7 +71,7 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
 }
 VERSION_SYMBOL(rte_distributor_get_pkt, _v20, 2.0);
 
-int
+int __vsym
 rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
@@ -204,7 +204,7 @@ process_returns(struct rte_distributor_v20 *d)
 }
 
 /* process a set of packets to distribute them to workers */
-int
+int __vsym
 rte_distributor_process_v20(struct rte_distributor_v20 *d,
 		struct rte_mbuf **mbufs, unsigned num_mbufs)
 {
@@ -321,7 +321,7 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 VERSION_SYMBOL(rte_distributor_process, _v20, 2.0);
 
 /* return to the caller, packets returned from workers */
-int
+int __vsym
 rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
 		struct rte_mbuf **mbufs, unsigned max_mbufs)
 {
@@ -359,7 +359,7 @@ total_outstanding(const struct rte_distributor_v20 *d)
 
 /* flush the distributor, so that there are no outstanding packets in flight or
  * queued up. */
-int
+int __vsym
 rte_distributor_flush_v20(struct rte_distributor_v20 *d)
 {
 	const unsigned flushed = total_outstanding(d);
@@ -372,7 +372,7 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d)
 VERSION_SYMBOL(rte_distributor_flush, _v20, 2.0);
 
 /* clears the internal returns array in the distributor */
-void
+void __vsym
 rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 {
 	d->returns.start = d->returns.count = 0;
@@ -383,7 +383,7 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 VERSION_SYMBOL(rte_distributor_clear_returns, _v20, 2.0);
 
 /* creates a distributor instance */
-struct rte_distributor_v20 *
+struct rte_distributor_v20 * __vsym
 rte_distributor_create_v20(const char *name,
 		unsigned socket_id,
 		unsigned num_workers)
diff --git a/lib/librte_eal/common/include/rte_function_versioning.h b/lib/librte_eal/common/include/rte_function_versioning.h
index eae619d60..c924351d5 100644
--- a/lib/librte_eal/common/include/rte_function_versioning.h
+++ b/lib/librte_eal/common/include/rte_function_versioning.h
@@ -52,6 +52,13 @@
  * symbol <b> to the internal symbol <b><e>
  */
 #define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", " RTE_STR(b) "@@DPDK_" RTE_STR(n))
+
+/*
+ * __vsym
+ * Annotation to be used in declaration of the internal symbol <b><e> to signal
+ * that it is being used as an implementation of a particular version of symbol
+ * <b>.
+ */
 #define __vsym __attribute__((used))
 
 /*
diff --git a/lib/librte_lpm/rte_lpm.c b/lib/librte_lpm/rte_lpm.c
index c96395e26..106916dc8 100644
--- a/lib/librte_lpm/rte_lpm.c
+++ b/lib/librte_lpm/rte_lpm.c
@@ -90,7 +90,7 @@ depth_to_range(uint8_t depth)
 /*
  * Find an existing lpm table and return a pointer to it.
  */
-struct rte_lpm_v20 *
+struct rte_lpm_v20 * __vsym
 rte_lpm_find_existing_v20(const char *name)
 {
 	struct rte_lpm_v20 *l = NULL;
@@ -116,7 +116,7 @@ rte_lpm_find_existing_v20(const char *name)
 }
 VERSION_SYMBOL(rte_lpm_find_existing, _v20, 2.0);
 
-struct rte_lpm *
+struct rte_lpm * __vsym
 rte_lpm_find_existing_v1604(const char *name)
 {
 	struct rte_lpm *l = NULL;
@@ -147,7 +147,7 @@ MAP_STATIC_SYMBOL(struct rte_lpm *rte_lpm_find_existing(const char *name),
 /*
  * Allocates memory for LPM object
  */
-struct rte_lpm_v20 *
+struct rte_lpm_v20 * __vsym
 rte_lpm_create_v20(const char *name, int socket_id, int max_rules,
 		__rte_unused int flags)
 {
@@ -220,7 +220,7 @@ rte_lpm_create_v20(const char *name, int socket_id, int max_rules,
 }
 VERSION_SYMBOL(rte_lpm_create, _v20, 2.0);
 
-struct rte_lpm *
+struct rte_lpm * __vsym
 rte_lpm_create_v1604(const char *name, int socket_id,
 		const struct rte_lpm_config *config)
 {
@@ -329,7 +329,7 @@ MAP_STATIC_SYMBOL(
 /*
  * Deallocates memory for given LPM table.
  */
-void
+void __vsym
 rte_lpm_free_v20(struct rte_lpm_v20 *lpm)
 {
 	struct rte_lpm_list *lpm_list;
@@ -358,7 +358,7 @@ rte_lpm_free_v20(struct rte_lpm_v20 *lpm)
 }
 VERSION_SYMBOL(rte_lpm_free, _v20, 2.0);
 
-void
+void __vsym
 rte_lpm_free_v1604(struct rte_lpm *lpm)
 {
 	struct rte_lpm_list *lpm_list;
@@ -1177,7 +1177,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 /*
  * Add a route
  */
-int
+int __vsym
 rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 		uint8_t next_hop)
 {
@@ -1218,7 +1218,7 @@ rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 }
 VERSION_SYMBOL(rte_lpm_add, _v20, 2.0);
 
-int
+int __vsym
 rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
@@ -1264,7 +1264,7 @@ MAP_STATIC_SYMBOL(int rte_lpm_add(struct rte_lpm *lpm, uint32_t ip,
 /*
  * Look for a rule in the high-level rules table
  */
-int
+int __vsym
 rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 uint8_t *next_hop)
 {
@@ -1291,7 +1291,7 @@ uint8_t *next_hop)
 }
 VERSION_SYMBOL(rte_lpm_is_rule_present, _v20, 2.0);
 
-int
+int __vsym
 rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop)
 {
@@ -1844,7 +1844,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 /*
  * Deletes a rule
  */
-int
+int __vsym
 rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 {
 	int32_t rule_to_delete_index, sub_rule_index;
@@ -1898,7 +1898,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 }
 VERSION_SYMBOL(rte_lpm_delete, _v20, 2.0);
 
-int
+int __vsym
 rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
 {
 	int32_t rule_to_delete_index, sub_rule_index;
@@ -1957,7 +1957,7 @@ MAP_STATIC_SYMBOL(int rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip,
 /*
  * Delete all rules from the LPM table.
  */
-void
+void __vsym
 rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm)
 {
 	/* Zero rule information. */
@@ -1974,7 +1974,7 @@ rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm)
 }
 VERSION_SYMBOL(rte_lpm_delete_all, _v20, 2.0);
 
-void
+void __vsym
 rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
 {
 	/* Zero rule information. */
diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c
index e20f82460..0d161dc32 100644
--- a/lib/librte_lpm/rte_lpm6.c
+++ b/lib/librte_lpm/rte_lpm6.c
@@ -812,7 +812,7 @@ add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl,
 /*
  * Add a route
  */
-int
+int __vsym
 rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint8_t next_hop)
 {
@@ -862,7 +862,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	return 0;
 }
 
-int
+int __vsym
 rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t next_hop)
 {
@@ -955,7 +955,7 @@ lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl,
 /*
  * Looks up an IP
  */
-int
+int __vsym
 rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop)
 {
 	uint32_t next_hop32 = 0;
@@ -973,7 +973,7 @@ rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop)
 }
 VERSION_SYMBOL(rte_lpm6_lookup, _v20, 2.0);
 
-int
+int __vsym
 rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
 		uint32_t *next_hop)
 {
@@ -1008,7 +1008,7 @@ MAP_STATIC_SYMBOL(int rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
 /*
  * Looks up a group of IP addresses
  */
-int
+int __vsym
 rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int16_t * next_hops, unsigned n)
@@ -1049,7 +1049,7 @@ rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
 }
 VERSION_SYMBOL(rte_lpm6_lookup_bulk_func, _v20, 2.0);
 
-int
+int __vsym
 rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n)
@@ -1099,7 +1099,7 @@ MAP_STATIC_SYMBOL(int rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 /*
  * Look for a rule in the high-level rules table
  */
-int
+int __vsym
 rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint8_t *next_hop)
 {
@@ -1119,7 +1119,7 @@ rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 }
 VERSION_SYMBOL(rte_lpm6_is_rule_present, _v20, 2.0);
 
-int
+int __vsym
 rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop)
 {
diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c
index 3834c9473..381a9f43f 100644
--- a/lib/librte_timer/rte_timer.c
+++ b/lib/librte_timer/rte_timer.c
@@ -131,7 +131,7 @@ rte_timer_data_dealloc(uint32_t id)
 	return 0;
 }
 
-void
+void __vsym
 rte_timer_subsystem_init_v20(void)
 {
 	unsigned lcore_id;
@@ -153,7 +153,7 @@ VERSION_SYMBOL(rte_timer_subsystem_init, _v20, 2.0);
  * secondary processes should be empty, the zeroth entry can be shared by
  * multiple processes.
  */
-int
+int __vsym
 rte_timer_subsystem_init_v1905(void)
 {
 	const struct rte_memzone *mz;
@@ -551,7 +551,7 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t expire,
 }
 
 /* Reset and start the timer associated with the timer handle tim */
-int
+int __vsym
 rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
 		    enum rte_timer_type type, unsigned int tim_lcore,
 		    rte_timer_cb_t fct, void *arg)
@@ -574,7 +574,7 @@ rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
 }
 VERSION_SYMBOL(rte_timer_reset, _v20, 2.0);
 
-int
+int __vsym
 rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
 		      enum rte_timer_type type, unsigned int tim_lcore,
 		      rte_timer_cb_t fct, void *arg)
@@ -657,14 +657,14 @@ __rte_timer_stop(struct rte_timer *tim, int local_is_locked,
 }
 
 /* Stop the timer associated with the timer handle tim */
-int
+int __vsym
 rte_timer_stop_v20(struct rte_timer *tim)
 {
 	return __rte_timer_stop(tim, 0, &default_timer_data);
 }
 VERSION_SYMBOL(rte_timer_stop, _v20, 2.0);
 
-int
+int __vsym
 rte_timer_stop_v1905(struct rte_timer *tim)
 {
 	return rte_timer_alt_stop(default_data_id, tim);
@@ -817,14 +817,14 @@ __rte_timer_manage(struct rte_timer_data *timer_data)
 	priv_timer[lcore_id].running_tim = NULL;
 }
 
-void
+void __vsym
 rte_timer_manage_v20(void)
 {
 	__rte_timer_manage(&default_timer_data);
 }
 VERSION_SYMBOL(rte_timer_manage, _v20, 2.0);
 
-int
+int __vsym
 rte_timer_manage_v1905(void)
 {
 	struct rte_timer_data *timer_data;
@@ -1074,14 +1074,14 @@ __rte_timer_dump_stats(struct rte_timer_data *timer_data __rte_unused, FILE *f)
 #endif
 }
 
-void
+void __vsym
 rte_timer_dump_stats_v20(FILE *f)
 {
 	__rte_timer_dump_stats(&default_timer_data, f);
 }
 VERSION_SYMBOL(rte_timer_dump_stats, _v20, 2.0);
 
-int
+int __vsym
 rte_timer_dump_stats_v1905(FILE *f)
 {
 	return rte_timer_alt_dump_stats(default_data_id, f);
-- 
2.17.1


^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v7 01/12] doc: fix description of versioning macros
  @ 2019-11-07 15:03  3%   ` Andrzej Ostruszka
  2019-11-07 15:03  2%   ` [dpdk-dev] [PATCH v7 02/12] build: annotate versioned symbols with __vsym macro Andrzej Ostruszka
  1 sibling, 0 replies; 200+ results
From: Andrzej Ostruszka @ 2019-11-07 15:03 UTC (permalink / raw)
  To: dev, John McNamara, Marko Kovacevic, Neil Horman
  Cc: mattias.ronnblom, stephen

This patch fixes documentation of versioning macros so that they are
aligned with their implementation (no underscore is added by macros).

Signed-off-by: Andrzej Ostruszka <aostruszka@marvell.com>
Fixes: f1ef9794f9bd ("doc: add ABI guidelines")
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 doc/guides/contributing/versioning.rst                  | 4 ++--
 lib/librte_eal/common/include/rte_function_versioning.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
index 64984c54e..8a38928c0 100644
--- a/doc/guides/contributing/versioning.rst
+++ b/doc/guides/contributing/versioning.rst
@@ -215,11 +215,11 @@ library so that older binaries need not be immediately recompiled.
 The macros exported are:
 
 * ``VERSION_SYMBOL(b, e, n)``: Creates a symbol version table entry binding
-  versioned symbol ``b@DPDK_n`` to the internal function ``b_e``.
+  versioned symbol ``b@DPDK_n`` to the internal function ``be``.
 
 * ``BIND_DEFAULT_SYMBOL(b, e, n)``: Creates a symbol version entry instructing
   the linker to bind references to symbol ``b`` to the internal symbol
-  ``b_e``.
+  ``be``.
 
 * ``MAP_STATIC_SYMBOL(f, p)``: Declare the prototype ``f``, and map it to the
   fully qualified function ``p``, so that if a symbol becomes versioned, it
diff --git a/lib/librte_eal/common/include/rte_function_versioning.h b/lib/librte_eal/common/include/rte_function_versioning.h
index 55e88ffae..eae619d60 100644
--- a/lib/librte_eal/common/include/rte_function_versioning.h
+++ b/lib/librte_eal/common/include/rte_function_versioning.h
@@ -42,14 +42,14 @@
 /*
  * VERSION_SYMBOL
  * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
- * function name <b>_<e>
+ * function name <b><e>
  */
 #define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", " RTE_STR(b) "@DPDK_" RTE_STR(n))
 
 /*
  * BIND_DEFAULT_SYMBOL
  * Creates a symbol version entry instructing the linker to bind references to
- * symbol <b> to the internal symbol <b>_<e>
+ * symbol <b> to the internal symbol <b><e>
  */
 #define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", " RTE_STR(b) "@@DPDK_" RTE_STR(n))
 #define __vsym __attribute__((used))
-- 
2.17.1


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] DPDK Release Status Meeting 7/11/2019
@ 2019-11-07 15:01  4% Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2019-11-07 15:01 UTC (permalink / raw)
  To: dpdk-dev; +Cc: Thomas Monjalon

Minutes 7 November 2019
-----------------------

Agenda:
* Release Dates
* Subtrees
* OvS
* Conferences
* Opens

Participants:
* Debian/Microsoft
* Intel
* Mellanox
* NXP
* Red Hat


Release Dates
-------------

* v19.11 dates:
  * RC1 is released on Sunday 27 October
    * https://mails.dpdk.org/archives/announce/2019-October/000284.html
  * RC2				Friday 8 November
  * RC3				Friday 15 November
  * Release			Friday 22 November

* Proposed dates for 20.02 :
  * Proposal/V1:		Friday 6 December 2019
  * Integration/Merge/RC1:	Wednesday 15 January 2020
  * Release:			Friday 14 February 2020


Subtrees
--------

* main
  * ABI/API patches, and tooling reviews are going on, more review welcome
    * ABI policy:
      v8: https://patches.dpdk.org/project/dpdk/list/?series=7255&state=*
    * tooling
      v6: https://patches.dpdk.org/project/dpdk/list/?series=7299&state=*
      https://patches.dpdk.org/project/dpdk/list/?series=7004
  * WFE under review
    v12: https://patches.dpdk.org/project/dpdk/list/?series=7224&state=*
  * LTO series in the queue
    v6: https://patches.dpdk.org/project/dpdk/list/?series=7128&state=*
  * vfio fixes may be pushed today
  * new arm target patch under review
  * mempool patch applied, KNI iova=va patch can go in after review
  * Windows series can go in rc3

* next-net
  * There are more ethdev patches that will be included in rc2
    * configure SR-IOV VF from host patch will be deferred to next release
  * Will merge as much for rc2 but remaining will be deferred to next rc
  * Will make next-net ready for rc2 on Friday morning

* next-net-crypto
  * Almost ready for rc2
  * Future of the arm based crypto is not clear
  * ipsec-secgw, set default to IPsec library mode deferred to next release
  * Compression, waiting for new version
  * A work-group established in techboard to decide on CPU crypto decisions

* next-net-eventdev
  * pull request sent, planned to pull today

* next-net-virtio
  * Sent pull request, ready for rc2

* next-net-intel
  * ipn3ke PMD waiting for a new version

* LTS
  * v18.11.3 is released
    https://mails.dpdk.org/archives/announce/2019-October/000283.html
    * Next week Kevin will start backporting patches for next release


OvS
---

* vhost patch to enable large buffer support merged, this will help enabling TSO
in OvS.


Conferences
-----------

* DPDK Summit North America, Mountain View CA, November 12-13
  https://www.dpdk.org/event/dpdk-summit-na-mountain-view/


Opens
-----

* Governing board triggered some questions related DPDK community lab,
  we can have more discussion soon related to utilizing the lab better


DPDK Release Status Meetings
============================

The DPDK Release Status Meeting is intended for DPDK Committers to discuss
the status of the master tree and sub-trees, and for project managers to
track progress or milestone dates.

The meeting occurs on Thursdays at 8:30 UTC. If you wish to attend just
send an email to "John McNamara <john.mcnamara@intel.com>" for the invite.



^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v4 1/3] ethdev: support API to set max LRO packet size
  @ 2019-11-07 12:35  3%     ` Dekel Peled
      1 sibling, 1 reply; 200+ results
From: Dekel Peled @ 2019-11-07 12:35 UTC (permalink / raw)
  To: john.mcnamara, marko.kovacevic, nhorman, ajit.khaparde,
	somnath.kotur, anatoly.burakov, xuanziyang2, cloud.wangxiaoyun,
	zhouguoyang, wenzhuo.lu, konstantin.ananyev, matan, shahafs,
	viacheslavo, rmody, shshaikh, maxime.coquelin, tiwei.bie,
	zhihong.wang, yongwang, thomas, ferruh.yigit, arybchenko,
	jingjing.wu, bernard.iremonger
  Cc: dev

This patch implements [1], to support API for configuration and
validation of max size for LRO aggregated packet.
API change notice [2] is removed, and release notes for 19.11
are updated accordingly.

Various PMDs using LRO offload are updated, the new data members are
initialized to ensure they don't fail validation.

[1] http://patches.dpdk.org/patch/58217/
[2] http://patches.dpdk.org/patch/57492/

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/nics/features.rst             |  2 ++
 doc/guides/rel_notes/deprecation.rst     |  4 ---
 doc/guides/rel_notes/release_19_11.rst   |  8 ++++++
 drivers/net/bnxt/bnxt_ethdev.c           |  1 +
 drivers/net/hinic/hinic_pmd_ethdev.c     |  1 +
 drivers/net/ixgbe/ixgbe_ethdev.c         |  2 ++
 drivers/net/ixgbe/ixgbe_vf_representor.c |  1 +
 drivers/net/mlx5/mlx5.h                  |  3 +++
 drivers/net/mlx5/mlx5_ethdev.c           |  1 +
 drivers/net/mlx5/mlx5_rxq.c              |  1 -
 drivers/net/qede/qede_ethdev.c           |  1 +
 drivers/net/virtio/virtio_ethdev.c       |  1 +
 drivers/net/vmxnet3/vmxnet3_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.c           | 44 ++++++++++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h           |  4 +++
 15 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index 7a31cf7..2138ce3 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -193,10 +193,12 @@ LRO
 Supports Large Receive Offload.
 
 * **[uses]       rte_eth_rxconf,rte_eth_rxmode**: ``offloads:DEV_RX_OFFLOAD_TCP_LRO``.
+  ``dev_conf.rxmode.max_lro_pkt_size``.
 * **[implements] datapath**: ``LRO functionality``.
 * **[implements] rte_eth_dev_data**: ``lro``.
 * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
 * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
+* **[provides]   rte_eth_dev_info**: ``max_lro_pkt_size``.
 
 
 .. _nic_features_tso:
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index c10dc30..fdec33d 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -87,10 +87,6 @@ Deprecation Notices
   This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
   thereby improve Rx performance if application wishes do so.
 
-* ethdev: New 32-bit fields may be added for maximum LRO session size, in
-  struct ``rte_eth_dev_info`` for the port capability and in struct
-  ``rte_eth_rxmode`` for the port configuration.
-
 * cryptodev: support for using IV with all sizes is added, J0 still can
   be used but only when IV length in following structs ``rte_crypto_auth_xform``,
   ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index 23182d1..b2b788c 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -406,6 +406,14 @@ ABI Changes
   align the Ethernet header on receive and all known encapsulations
   preserve the alignment of the header.
 
+* ethdev: Added 32-bit fields for maximum LRO aggregated packet size, in
+  struct ``rte_eth_dev_info`` for the port capability and in struct
+  ``rte_eth_rxmode`` for the port configuration.
+  Application should use the new field in struct ``rte_eth_rxmode`` to configure
+  the requested size.
+  PMD should use the new field in struct ``rte_eth_dev_info`` to report the
+  supported port capability.
+
 
 Shared Library Versions
 -----------------------
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index b9b055e..741b897 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -519,6 +519,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	/* Fast path specifics */
 	dev_info->min_rx_bufsize = 1;
 	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
+	dev_info->max_lro_pkt_size = BNXT_MAX_PKT_LEN;
 
 	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
 	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED)
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 9f37a40..b33b2cf 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -727,6 +727,7 @@ static void hinic_get_speed_capa(struct rte_eth_dev *dev, uint32_t *speed_capa)
 	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
 	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
 	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
+	info->max_lro_pkt_size = HINIC_MAX_JUMBO_FRAME_SIZE;
 	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
 	info->min_mtu = HINIC_MIN_MTU_SIZE;
 	info->max_mtu = HINIC_MAX_MTU_SIZE;
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 30c0379..c391f51 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3814,6 +3814,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	}
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL register */
 	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pkt_size = 15872;
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
 	dev_info->max_vfs = pci_dev->max_vfs;
@@ -3937,6 +3938,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
 	dev_info->max_rx_pktlen = 9728; /* includes CRC, cf MAXFRS reg */
+	dev_info->max_lro_pkt_size = 9728;
 	dev_info->max_mtu = dev_info->max_rx_pktlen - IXGBE_ETH_OVERHEAD;
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
diff --git a/drivers/net/ixgbe/ixgbe_vf_representor.c b/drivers/net/ixgbe/ixgbe_vf_representor.c
index dbbef29..28dfa3a 100644
--- a/drivers/net/ixgbe/ixgbe_vf_representor.c
+++ b/drivers/net/ixgbe/ixgbe_vf_representor.c
@@ -48,6 +48,7 @@
 	dev_info->min_rx_bufsize = 1024;
 	/**< Minimum size of RX buffer. */
 	dev_info->max_rx_pktlen = 9728;
+	dev_info->max_lro_pkt_size = 9728;
 	/**< Maximum configurable length of RX pkt. */
 	dev_info->max_rx_queues = IXGBE_VF_MAX_RX_QUEUES;
 	/**< Maximum number of RX queues. */
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index f644998..fdfc99b 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -203,6 +203,9 @@ struct mlx5_hca_attr {
 #define MLX5_LRO_SUPPORTED(dev) \
 	(((struct mlx5_priv *)((dev)->data->dev_private))->config.lro.supported)
 
+/* Maximal size of aggregated LRO packet. */
+#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
+
 /* LRO configurations structure. */
 struct mlx5_lro_config {
 	uint32_t supported:1; /* Whether LRO is supported. */
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index c2bed2f..1443faa 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -606,6 +606,7 @@ struct ethtool_link_settings {
 	/* FIXME: we should ask the device for these values. */
 	info->min_rx_bufsize = 32;
 	info->max_rx_pktlen = 65536;
+	info->max_lro_pkt_size = MLX5_MAX_LRO_SIZE;
 	/*
 	 * Since we need one CQ per QP, the limit is the minimum number
 	 * between the two values.
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 24d0eaa..9423e7b 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -1701,7 +1701,6 @@ struct mlx5_rxq_obj *
 	return 0;
 }
 
-#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
 #define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
 					sizeof(struct rte_vlan_hdr) * 2 + \
 					sizeof(struct rte_ipv6_hdr)))
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 575982f..ccbb8a4 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1277,6 +1277,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
 	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
 	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
+	dev_info->max_lro_pkt_size = (uint32_t)0x7FFF;
 	dev_info->rx_desc_lim = qede_rx_desc_lim;
 	dev_info->tx_desc_lim = qede_tx_desc_lim;
 
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 646de99..fa33c45 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -2435,6 +2435,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
 		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
 	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
 	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
+	dev_info->max_lro_pkt_size = VIRTIO_MAX_RX_PKTLEN;
 	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
 
 	host_features = VTPCI_OPS(hw)->get_features(hw);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index d1faeaa..d18e8bc 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1161,6 +1161,7 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)
 	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
 	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
 	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pkt_size = 16384;
 	dev_info->speed_capa = ETH_LINK_SPEED_10G;
 	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 652c369..c642ba5 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1136,6 +1136,26 @@ struct rte_eth_dev *
 	return name;
 }
 
+static inline int
+check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
+		   uint32_t dev_info_size)
+{
+	int ret = 0;
+
+	if (config_size > dev_info_size) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "> max allowed value %u\n", port_id, config_size,
+			       dev_info_size);
+		ret = -EINVAL;
+	} else if (config_size < RTE_ETHER_MIN_LEN) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "< min allowed value %u\n", port_id, config_size,
+			       (unsigned int)RTE_ETHER_MIN_LEN);
+		ret = -EINVAL;
+	}
+	return ret;
+}
+
 int
 rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
@@ -1266,6 +1286,18 @@ struct rte_eth_dev *
 							RTE_ETHER_MAX_LEN;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		ret = check_lro_pkt_size(
+				port_id, dev_conf->rxmode.max_lro_pkt_size,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			goto rollback;
+	}
+
 	/* Any requested offloading must be within its device capabilities */
 	if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) !=
 	     dev_conf->rxmode.offloads) {
@@ -1770,6 +1802,18 @@ struct rte_eth_dev *
 		return -EINVAL;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		int ret = check_lro_pkt_size(port_id,
+				dev->data->dev_conf.rxmode.max_lro_pkt_size,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			return ret;
+	}
+
 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
 					      socket_id, &local_conf, mp);
 	if (!ret) {
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 44d77b3..1b76df5 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -395,6 +395,8 @@ struct rte_eth_rxmode {
 	/** The multi-queue packet distribution mode to be used, e.g. RSS. */
 	enum rte_eth_rx_mq_mode mq_mode;
 	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME enabled. */
+	/** Maximum allowed size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
 	/**
 	 * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
@@ -1218,6 +1220,8 @@ struct rte_eth_dev_info {
 	const uint32_t *dev_flags; /**< Device flags */
 	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
 	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
+	/** Maximum configurable size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
 	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
 	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
-- 
1.8.3.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v5 0/5] Some fixes for hinic PMD driver
  @ 2019-11-07  9:29  0% ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2019-11-07  9:29 UTC (permalink / raw)
  To: Xiaoyun wang, dev
  Cc: zhouguoyang, wulike1, luoxianjun, shahar.belkar, tanya.brokhman,
	xuanziyang2

On 11/1/2019 1:36 PM, Xiaoyun wang wrote:
> This patch fixes code style check issue, offload info calculating problem 
> for TSO offload. Replace mbuf alloc function with initialized, remove
> Flow Director feature from doc files and add Flow API feature to
> hinic.ini, Remove Free Tx mbuf on demand from hinic.ini.
> 
> --
> v4->v5:
>   - Fix code style check issue
>   - Fix offload info calculating problem for TSO
>   - Replace mbuf alloc function with initialized
>   - Remove Flow Director feature from doc files
>   - Remove Free Tx mbuf on demand from hinic.ini
> 
> v3->v4:
>   - Fix receive performance code review comments
>   - Fix 32-bit build errs for mbox logs
>   - Modify skb description as mbuf
>  
> v2->v3:
>   - Split hinic.ini and hinic.rst to related feature patches
>   - Add min_mtu & max_mtu initialization for hinic_dev_infos_get
>   - Fix fdir config patch with net/hinic/base
>   - Split link patch into link and fw version getting 2 patches
>   - Update pmd doc files to new next version 
>   - Add comments for cover letter patch
>   - Add rxq & txq info getting interfaces
>   - Fix load intrinsics for receiving packets
>   
> v1->v2:
>   - Fix RSS bugs for vxlan packets inner type
>   - Add comments for new added func interface
>   - Fix code review comments from patch v1
>   - Fix code style problems
>   - Remove ceq interfaces and definitions that not used
>   - Fix aeq init bugs, firstly alloc aeq resource, then set aeq ctrl len
>   - Fix bar map bugs for VF Page size larger than PF
>   - Modify link state set, add enable or disable fiber in tx direction 
>   - Fix mbox and mgmt channel sync lock mechanism to reduce CPU usage
>   - Fix FDIR bugs for VRRP packets
>   - Fit ABI changes from dpdk lib
> 
> v1:
>   - Support SR-IOV function
>   - Support FLOW API for packet filter
>   - Support allmulticast mode
>   - Support MTU set
>   - Support unicast and multicast MAC set
>   - Support setting link down and up
>   - Support get firmware version
>   - Support inner L3 checksum offload
>   - Support LRO offload
>   - Add hinic PMD doc files
> 
> Xiaoyun wang (5):
>   net/hinic/base: fix code style check issue
>   net/hinic: fix offload info calculating problem for TSO
>   net/hinic: optimize mbuf alloc function with initialized
>   net/hinic: remove Flow Director feature from doc files
>   net/hinic: remove Free Tx mbuf on demand from hinic.ini

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps
  2019-11-06 21:53  0% ` David Marchand
@ 2019-11-06 22:12  0%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2019-11-06 22:12 UTC (permalink / raw)
  To: David Marchand, Anatoly Burakov
  Cc: dev, Bruce Richardson, Rajesh Ravi, Ajit Khaparde,
	Jonathan Richardson, Scott Branden, Vikram Mysore Prakash,
	Srinath Mannam, Kevin Traynor

06/11/2019 22:53, David Marchand:
> On Tue, Nov 5, 2019 at 4:15 PM Anatoly Burakov
> <anatoly.burakov@intel.com> wrote:
> >
> > Currently, externally created heaps are supposed to be automatically
> > mapped for VFIO DMA by EAL, however they only do so if, at the time of
> > heap creation, VFIO is initialized and has at least one device
> > available. If no devices are available at the time of heap creation (or
> > if devices were available, but were since hot-unplugged, thus dropping
> > all VFIO container mappings), then VFIO mapping code would have skipped
> > over externally allocated heaps.
> >
> > The fix is two-fold. First, we allow externally allocated memory
> > segments to be marked as "heap" segments. This allows us to distinguish
> > between external memory segments that were created via heap API, from
> > those that were created via rte_extmem_register() API.
> >
> > Then, we fix the VFIO code to only skip non-heap external segments.
> > Also, since external heaps are not guaranteed to have valid IOVA
> > addresses, we will skip those which have invalid IOVA addresses as well.
> >
> > Fixes: 0f526d674f8e ("malloc: separate creating memseg list and malloc heap")
> >
> > Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> > ---
> >
> > Notes:
> >     This cannot be backported to older releases as it breaks the
> >     API and ABI. A separate fix is in the works for stable.
> 
> I'd say we still have to Cc: stable, on the principle so that the
> stable maintainers know there is an issue on this commit.

Yes I agree. Cc: stable should be in this commit log.
Adding Cc: stable does not mean the patch can be backported without any effort :)




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps
    @ 2019-11-06 21:53  0% ` David Marchand
  2019-11-06 22:12  0%   ` Thomas Monjalon
  2019-11-07  6:35  0% ` Rajesh Ravi
  2019-11-07 15:35  0% ` David Marchand
  3 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-06 21:53 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Bruce Richardson, Rajesh Ravi, Ajit Khaparde,
	Jonathan Richardson, Scott Branden, Vikram Mysore Prakash,
	Srinath Mannam, Thomas Monjalon, Kevin Traynor

On Tue, Nov 5, 2019 at 4:15 PM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> Currently, externally created heaps are supposed to be automatically
> mapped for VFIO DMA by EAL, however they only do so if, at the time of
> heap creation, VFIO is initialized and has at least one device
> available. If no devices are available at the time of heap creation (or
> if devices were available, but were since hot-unplugged, thus dropping
> all VFIO container mappings), then VFIO mapping code would have skipped
> over externally allocated heaps.
>
> The fix is two-fold. First, we allow externally allocated memory
> segments to be marked as "heap" segments. This allows us to distinguish
> between external memory segments that were created via heap API, from
> those that were created via rte_extmem_register() API.
>
> Then, we fix the VFIO code to only skip non-heap external segments.
> Also, since external heaps are not guaranteed to have valid IOVA
> addresses, we will skip those which have invalid IOVA addresses as well.
>
> Fixes: 0f526d674f8e ("malloc: separate creating memseg list and malloc heap")
>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---
>
> Notes:
>     This cannot be backported to older releases as it breaks the
>     API and ABI. A separate fix is in the works for stable.

I'd say we still have to Cc: stable, on the principle so that the
stable maintainers know there is an issue on this commit.

Kevin, wdyt?

>
>  lib/librte_eal/common/include/rte_memory.h |  1 +
>  lib/librte_eal/common/rte_malloc.c         |  1 +
>  lib/librte_eal/freebsd/eal/eal_memory.c    |  1 +
>  lib/librte_eal/linux/eal/eal_memory.c      |  3 ++
>  lib/librte_eal/linux/eal/eal_vfio.c        | 46 +++++++++++++++++++---
>  5 files changed, 47 insertions(+), 5 deletions(-)
>
> diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h
> index 38e00e382c..bf81a2faa8 100644
> --- a/lib/librte_eal/common/include/rte_memory.h
> +++ b/lib/librte_eal/common/include/rte_memory.h
> @@ -81,6 +81,7 @@ struct rte_memseg_list {
>         volatile uint32_t version; /**< version number for multiprocess sync. */
>         size_t len; /**< Length of memory area covered by this memseg list. */
>         unsigned int external; /**< 1 if this list points to external memory */
> +       unsigned int heap; /**< 1 if this list points to a heap */
>         struct rte_fbarray memseg_arr;
>  };
>
> diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
> index 044d3a9078..413e4aa004 100644
> --- a/lib/librte_eal/common/rte_malloc.c
> +++ b/lib/librte_eal/common/rte_malloc.c
> @@ -396,6 +396,7 @@ rte_malloc_heap_memory_add(const char *heap_name, void *va_addr, size_t len,
>
>         rte_spinlock_lock(&heap->lock);
>         ret = malloc_heap_add_external_memory(heap, msl);
> +       msl->heap = 1; /* mark it as heap segment */
>         rte_spinlock_unlock(&heap->lock);
>
>  unlock:
> diff --git a/lib/librte_eal/freebsd/eal/eal_memory.c b/lib/librte_eal/freebsd/eal/eal_memory.c
> index 7fe3178898..a97d8f0f0c 100644
> --- a/lib/librte_eal/freebsd/eal/eal_memory.c
> +++ b/lib/librte_eal/freebsd/eal/eal_memory.c
> @@ -93,6 +93,7 @@ rte_eal_hugepage_init(void)
>                 msl->page_sz = page_sz;
>                 msl->len = internal_config.memory;
>                 msl->socket_id = 0;
> +               msl->heap = 1;
>
>                 /* populate memsegs. each memseg is 1 page long */
>                 for (cur_seg = 0; cur_seg < n_segs; cur_seg++) {
> diff --git a/lib/librte_eal/linux/eal/eal_memory.c b/lib/librte_eal/linux/eal/eal_memory.c
> index accfd2e232..43e4ffc757 100644
> --- a/lib/librte_eal/linux/eal/eal_memory.c
> +++ b/lib/librte_eal/linux/eal/eal_memory.c
> @@ -831,6 +831,7 @@ alloc_memseg_list(struct rte_memseg_list *msl, uint64_t page_sz,
>         msl->page_sz = page_sz;
>         msl->socket_id = socket_id;
>         msl->base_va = NULL;
> +       msl->heap = 1; /* mark it as a heap segment */
>
>         RTE_LOG(DEBUG, EAL, "Memseg list allocated: 0x%zxkB at socket %i\n",
>                         (size_t)page_sz >> 10, socket_id);
> @@ -1405,6 +1406,7 @@ eal_legacy_hugepage_init(void)
>                 msl->page_sz = page_sz;
>                 msl->socket_id = 0;
>                 msl->len = internal_config.memory;
> +               msl->heap = 1;
>
>                 /* we're in single-file segments mode, so only the segment list
>                  * fd needs to be set up.
> @@ -1677,6 +1679,7 @@ eal_legacy_hugepage_init(void)
>                 mem_sz = msl->len;
>                 munmap(msl->base_va, mem_sz);
>                 msl->base_va = NULL;
> +               msl->heap = 0;
>
>                 /* destroy backing fbarray */
>                 rte_fbarray_destroy(&msl->memseg_arr);
> diff --git a/lib/librte_eal/linux/eal/eal_vfio.c b/lib/librte_eal/linux/eal/eal_vfio.c
> index d9541b1220..d5a2bbea0d 100644
> --- a/lib/librte_eal/linux/eal/eal_vfio.c
> +++ b/lib/librte_eal/linux/eal/eal_vfio.c
> @@ -1250,7 +1250,16 @@ type1_map(const struct rte_memseg_list *msl, const struct rte_memseg *ms,
>  {
>         int *vfio_container_fd = arg;
>
> -       if (msl->external)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
> +               return 0;
> +
> +       /* if IOVA mode is VA, we've already mapped the internal segments */
> +       if (!msl->external && rte_eal_iova_mode() == RTE_IOVA_VA)
>                 return 0;
>
>         return vfio_type1_dma_mem_map(*vfio_container_fd, ms->addr_64, ms->iova,
> @@ -1313,12 +1322,18 @@ vfio_type1_dma_mem_map(int vfio_container_fd, uint64_t vaddr, uint64_t iova,
>  static int
>  vfio_type1_dma_map(int vfio_container_fd)
>  {
> +       int ret;
>         if (rte_eal_iova_mode() == RTE_IOVA_VA) {
>                 /* with IOVA as VA mode, we can get away with mapping contiguous
>                  * chunks rather than going page-by-page.
>                  */
> -               return rte_memseg_contig_walk(type1_map_contig,
> +               ret = rte_memseg_contig_walk(type1_map_contig,

We can move the ret variable declaration in this block.
I can do when applying.

>                                 &vfio_container_fd);
> +               if (ret)
> +                       return ret;
> +               /* we have to continue the walk because we've skipped the
> +                * external segments during the config walk.
> +                */
>         }
>         return rte_memseg_walk(type1_map, &vfio_container_fd);
>  }
> @@ -1410,7 +1425,15 @@ vfio_spapr_map_walk(const struct rte_memseg_list *msl,
>  {
>         struct spapr_remap_walk_param *param = arg;
>
> -       if (msl->external || ms->addr_64 == param->addr_64)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
> +               return 0;
> +
> +       if (ms->addr_64 == param->addr_64)
>                 return 0;
>
>         return vfio_spapr_dma_do_map(param->vfio_container_fd, ms->addr_64, ms->iova,
> @@ -1423,7 +1446,15 @@ vfio_spapr_unmap_walk(const struct rte_memseg_list *msl,
>  {
>         struct spapr_remap_walk_param *param = arg;
>
> -       if (msl->external || ms->addr_64 == param->addr_64)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
> +               return 0;
> +
> +       if (ms->addr_64 == param->addr_64)
>                 return 0;
>
>         return vfio_spapr_dma_do_map(param->vfio_container_fd, ms->addr_64, ms->iova,
> @@ -1443,7 +1474,12 @@ vfio_spapr_window_size_walk(const struct rte_memseg_list *msl,
>         struct spapr_walk_param *param = arg;
>         uint64_t max = ms->iova + ms->len;
>
> -       if (msl->external)
> +       /* skip external memory that isn't a heap */
> +       if (msl->external && !msl->heap)
> +               return 0;
> +
> +       /* skip any segments with invalid IOVA addresses */
> +       if (ms->iova == RTE_BAD_IOVA)
>                 return 0;
>
>         /* do not iterate ms we haven't mapped yet  */
> --
> 2.17.1



-- 
David Marchand

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 2/4] doc: changes to abi policy introducing major abi versions
  @ 2019-11-06 21:07 10%     ` Thomas Monjalon
  2019-11-08 14:09  5%       ` Ray Kinsella
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2019-11-06 21:07 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, stephen, bruce.richardson, ferruh.yigit, konstantin.ananyev,
	jerinj, olivier.matz, nhorman, maxime.coquelin, john.mcnamara,
	marko.kovacevic, hemant.agrawal, ktraynor, aconole

Hi,
Please find the techboard comments below.

06/11/2019 10:22, Ray Kinsella:
> On 06/11/2019 09:06, Thomas Monjalon wrote:
> > 06/11/2019 09:49, Ray Kinsella:
> >> On 06/11/2019 00:11, Thomas Monjalon wrote:
> >>> 05/11/2019 16:24, Ray Kinsella:
> >>>> +#. Major ABI versions are declared every **year** and are then supported for one
> >>>> +   year, typically aligned with the :ref:`LTS release <stable_lts_releases>`.
> >>>
> >>> As discussed earlier, a major ABI version can be declared less often
> >>> than one year in the future.
> >>> An ABI is supported more than one year, because of the LTS branches.
> >>> That's why I propose to replace with this sentence:
> >>> "
> >>> Major ABI versions are declared regularly and are then supported for
> >>> at least one year, typically aligned with the :ref:`LTS release <stable_lts_releases>`.
> >>> "
> >>
> >> So look, this one was a decision of the technical board.
> > 
> > The techboard didn't decide to change the ABI every year.
> > We decided to review the duration after the first year, with a plan to extend.
> > 
> >> My position is still what was agreed was, "declared every year, and supported for one year".
> >> I like it, it's crystal clear what is the policy, until we change the policy.
> > 
> > I think it gives a wrong message.
> > 
> >> That said, I can make the change no problem, but I need some others to chime in to ok it. 
> >> Perhaps at the head of the Techboard today?
> > 
> > Yes I add it to the techboard meeting.

The techboard propose other rewords:
"supported" may be replaced with "compatibility is enforced"
"every year" may be replaced with "no more frequently than every year"
"declared" may be replaced with "could be declared"

I think you got the idea. Please adjust wording to something more accurate.

###

> >>>> +A major ABI version is declared every year, aligned with that year's LTS
> >>>> +release, e.g. v19.11. This ABI version is then supported for one year by all
> >>>> +subsequent releases within that time period, until the next LTS release, e.g.
> >>>> +v20.11.
> >>>
> >>> Let's reword like this:
> >>> "
> >>> A new major ABI version can be declared when a new LTS branch is started,

It has been suggested to replace "can" with "may".

> >>> e.g. ABI 19 for DPDK 19.11.0.
> >>> This major ABI version is then supported until the next one,
> >>> e.g. ABI 20 for DPDK 20.11.0.
> >>> All ABI changes must be detailed in the release notes.
> >>> "

My reword is wrong because ABI versions should be 20 and 21 respectively.

> >> This is more ambiguous, although what I said above stands.
> > 
> > What you said is wrong because of 2 reasons:
> > - it is not always one year for an major ABI
> 
> Well that is a point of disagreement.

The techboard agreed to remove "every year".
> 
> > - it is always longer because of LTS branch
> 
> Well I was pretty careful to qualify the ABI policy applies to releases over the year.
> To distinguish it from LTS branch. 

As above, we may replace "ABI is supported" with
"ABI compatibility is enforced".

> >> If there is general agreement with changing this part of the policy, I am ok to make 
> >> the change.
> > 
> > Yes let's review with the techboard.

Please try to reflect techboard comments while keeping something understandable :)

###

> >>>> +   ABI breakages due to changes such as reorganizing public
> >>>> +   structure fields for aesthetic or readability purposes should be avoided.
> >>>
> >>> Why it should be avoided?
> >>> If the ABI is broken anyway, I don't see any reason to not break it more.
> >>
> >> This is text from the original ABI Policy - I think the general sentiment still stands.
> >> Just because you have an ABI Breakage window doesn't mean you should feel free to break
> >> the ABI. The 3 ACKs required from Technical Board member to change the ABI, are another
> >> reflection of this. 
> >>
> >> As a general rule.
> >> Unnecessary changes should still be avoided, to reduce ABI churn between ABI versions.
> > 
> > I agree we must avoid unnecessary API changes because it requires apps to adapt.
> > But if the change is only ABI, and we are in an ABI-change window,
> > I don't see any issue

The techboard agrees that the ABI changes are unlimited but API changes must be avoided.
It is suggested to replace "ABI" with "API". I think this reword is better:
"
API changes such as reorganizing public structure fields
for aesthetic or readability purposes should be avoided.
"

###

> >>>> +Libraries marked as ``experimental`` are entirely not considered part of an ABI
> >>>> +version, and may change without warning at any time. Experimental libraries
> >>>> +always have a major version of ``0`` to indicate they exist outside of
> >>>> +ABI Versioning, with the minor version incremented with each ABI change
> >>>> +to library.
> >>>
> >>> It means not all libraries will have the same ABI version.
> >>> It is contrary of "ABI version is managed at a project level",
> >>> and I don't see a real benefit of a different version number.
> >>
> >> There is a benefit, major version 0 is a very clear indication that 
> >> the library exists outside of ABI management. 
> >> A library isn't in the ABI, until it is in the ABI - an then it gets
> >> added to the major version number. 
> >>
> >>> Anyway, some experimental functions can live inside a library
> >>> with a stable ABI version number
> >>
> >> True, but if an entire library is experimental - let's be crystal 
> >> clear about that. 
> > 
> > I would like to see what others think.

The techboard decided to keep this policy: .0 for pure experimental libs.



^ permalink raw reply	[relevance 10%]

* [dpdk-dev] [PATCH v6 09/10] build: change ABI version to 20.0
                       ` (9 preceding siblings ...)
  2019-11-06 16:54  3%   ` [dpdk-dev] [PATCH v6 08/10] drivers/octeontx: add missing public symbol Anatoly Burakov
@ 2019-11-06 16:54  2%   ` Anatoly Burakov
  2019-11-06 16:54 23%   ` [dpdk-dev] [PATCH v6 10/10] buildtools: add ABI versioning check script Anatoly Burakov
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Pawel Modrak, Nicolas Chautru, Hemant Agrawal, Sachin Saxena,
	Rosen Xu, Stephen Hemminger, Anoob Joseph, Tomasz Duszynski,
	Liron Himi, Jerin Jacob, Nithin Dabilpuram, Vamsi Attunuru,
	Lee Daly, Fiona Trahe, Ashish Gupta, Sunila Sahu, Declan Doherty,
	Pablo de Lara, Gagandeep Singh, Ravi Kumar, Akhil Goyal,
	Michael Shamis, Nagadheeraj Rottela, Srikanth Jampala,
	Ankur Dwivedi, Fan Zhang, Jay Zhou, Nipun Gupta,
	Mattias Rönnblom, Pavan Nikhilesh, Liang Ma, Peter Mccarthy,
	Harry van Haaren, Artem V. Andreev, Andrew Rybchenko,
	Olivier Matz, Gage Eads, John W. Linville, Xiaolong Ye, Qi Zhang,
	Shepard Siegel, Ed Czeck, John Miller, Igor Russkikh,
	Pavel Belous, Allain Legacy, Matt Peters, Rasesh Mody,
	Shahed Shaikh, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Rahul Lakkireddy, Wenzhuo Lu, Marcin Wojtas, Michal Krawczyk,
	Guy Tzalik, Evgeny Schemeilin, Igor Chauskin, John Daley,
	Hyong Youb Kim, Gaetan Rivet, Xiao Wang, Ziyang Xuan,
	Xiaoyun Wang, Guoyang Zhou, Wei Hu (Xavier), Min Hu (Connor),
	Yisen Zhuang, Beilei Xing, Jingjing Wu, Qiming Yang,
	Konstantin Ananyev, Ferruh Yigit, Shijith Thotton,
	Srisivasubramanian Srinivasan, Jakub Grajciar, Matan Azrad,
	Shahaf Shuler, Viacheslav Ovsiienko, Zyta Szpak,
	K. Y. Srinivasan, Haiyang Zhang, Rastislav Cernay, Jan Remes,
	Alejandro Lucero, Tetsuya Mukawa, Kiran Kumar K,
	Bruce Richardson, Jasvinder Singh, Cristian Dumitrescu,
	Keith Wiles, Maciej Czekaj, Maxime Coquelin, Tiwei Bie,
	Zhihong Wang, Yong Wang, Tianfei zhang, Xiaoyun Li, Satha Rao,
	Shreyansh Jain, David Hunt, Byron Marohn, Yipeng Wang,
	Thomas Monjalon, Jiayu Hu, Sameh Gobriel, Reshma Pattan,
	Vladimir Medvedkin, Robert Sanford, Erik Gabriel Carrillo,
	john.mcnamara, ray.kinsella, david.marchand

From: Pawel Modrak <pawelx.modrak@intel.com>

Merge all vesions in linker version script files to DPDK_20.0.

This commit was generated by running the following command:

:~/DPDK$ buildtools/update-abi.sh 20.0

Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 .../rte_pmd_bbdev_fpga_lte_fec_version.map    |   8 +-
 .../null/rte_pmd_bbdev_null_version.map       |   2 +-
 .../rte_pmd_bbdev_turbo_sw_version.map        |   2 +-
 drivers/bus/dpaa/rte_bus_dpaa_version.map     | 113 +++---
 drivers/bus/fslmc/rte_bus_fslmc_version.map   | 154 ++++-----
 drivers/bus/ifpga/rte_bus_ifpga_version.map   |  14 +-
 drivers/bus/pci/rte_bus_pci_version.map       |   2 +-
 drivers/bus/vdev/rte_bus_vdev_version.map     |  12 +-
 drivers/bus/vmbus/rte_bus_vmbus_version.map   |  12 +-
 drivers/common/cpt/rte_common_cpt_version.map |   9 +-
 .../common/dpaax/rte_common_dpaax_version.map |  14 +-
 .../common/mvep/rte_common_mvep_version.map   |   6 +-
 .../octeontx/rte_common_octeontx_version.map  |   6 +-
 .../rte_common_octeontx2_version.map          |  16 +-
 .../compress/isal/rte_pmd_isal_version.map    |   2 +-
 .../rte_pmd_octeontx_compress_version.map     |   2 +-
 drivers/compress/qat/rte_pmd_qat_version.map  |   2 +-
 .../compress/zlib/rte_pmd_zlib_version.map    |   2 +-
 .../aesni_gcm/rte_pmd_aesni_gcm_version.map   |   2 +-
 .../aesni_mb/rte_pmd_aesni_mb_version.map     |   2 +-
 .../crypto/armv8/rte_pmd_armv8_version.map    |   2 +-
 .../caam_jr/rte_pmd_caam_jr_version.map       |   3 +-
 drivers/crypto/ccp/rte_pmd_ccp_version.map    |   3 +-
 .../dpaa2_sec/rte_pmd_dpaa2_sec_version.map   |  10 +-
 .../dpaa_sec/rte_pmd_dpaa_sec_version.map     |  10 +-
 .../crypto/kasumi/rte_pmd_kasumi_version.map  |   2 +-
 .../crypto/mvsam/rte_pmd_mvsam_version.map    |   2 +-
 .../crypto/nitrox/rte_pmd_nitrox_version.map  |   2 +-
 .../null/rte_pmd_null_crypto_version.map      |   2 +-
 .../rte_pmd_octeontx_crypto_version.map       |   3 +-
 .../rte_pmd_octeontx2_crypto_version.map      |   3 +-
 .../openssl/rte_pmd_openssl_version.map       |   2 +-
 .../rte_pmd_crypto_scheduler_version.map      |  19 +-
 .../crypto/snow3g/rte_pmd_snow3g_version.map  |   2 +-
 .../virtio/rte_pmd_virtio_crypto_version.map  |   2 +-
 drivers/crypto/zuc/rte_pmd_zuc_version.map    |   2 +-
 .../event/dpaa/rte_pmd_dpaa_event_version.map |   3 +-
 .../dpaa2/rte_pmd_dpaa2_event_version.map     |   2 +-
 .../event/dsw/rte_pmd_dsw_event_version.map   |   2 +-
 .../rte_pmd_octeontx_event_version.map        |   2 +-
 .../rte_pmd_octeontx2_event_version.map       |   3 +-
 .../event/opdl/rte_pmd_opdl_event_version.map |   2 +-
 .../rte_pmd_skeleton_event_version.map        |   3 +-
 drivers/event/sw/rte_pmd_sw_event_version.map |   2 +-
 .../bucket/rte_mempool_bucket_version.map     |   3 +-
 .../mempool/dpaa/rte_mempool_dpaa_version.map |   2 +-
 .../dpaa2/rte_mempool_dpaa2_version.map       |  12 +-
 .../octeontx/rte_mempool_octeontx_version.map |   2 +-
 .../rte_mempool_octeontx2_version.map         |   4 +-
 .../mempool/ring/rte_mempool_ring_version.map |   3 +-
 .../stack/rte_mempool_stack_version.map       |   3 +-
 .../af_packet/rte_pmd_af_packet_version.map   |   3 +-
 drivers/net/af_xdp/rte_pmd_af_xdp_version.map |   2 +-
 drivers/net/ark/rte_pmd_ark_version.map       |   5 +-
 .../net/atlantic/rte_pmd_atlantic_version.map |   6 -
 drivers/net/avp/rte_pmd_avp_version.map       |   2 +-
 drivers/net/axgbe/rte_pmd_axgbe_version.map   |   2 +-
 drivers/net/bnx2x/rte_pmd_bnx2x_version.map   |   3 +-
 drivers/net/bnxt/rte_pmd_bnxt_version.map     |   4 +-
 drivers/net/bonding/rte_pmd_bond_version.map  |  47 +--
 drivers/net/cxgbe/rte_pmd_cxgbe_version.map   |   3 +-
 drivers/net/dpaa/rte_pmd_dpaa_version.map     |  11 +-
 drivers/net/dpaa2/rte_pmd_dpaa2_version.map   |  12 +-
 drivers/net/e1000/rte_pmd_e1000_version.map   |   3 +-
 drivers/net/ena/rte_pmd_ena_version.map       |   3 +-
 drivers/net/enetc/rte_pmd_enetc_version.map   |   3 +-
 drivers/net/enic/rte_pmd_enic_version.map     |   3 +-
 .../net/failsafe/rte_pmd_failsafe_version.map |   3 +-
 drivers/net/fm10k/rte_pmd_fm10k_version.map   |   3 +-
 drivers/net/hinic/rte_pmd_hinic_version.map   |   3 +-
 drivers/net/hns3/rte_pmd_hns3_version.map     |   4 +-
 drivers/net/i40e/rte_pmd_i40e_version.map     |  65 +---
 drivers/net/iavf/rte_pmd_iavf_version.map     |   3 +-
 drivers/net/ice/rte_pmd_ice_version.map       |   3 +-
 drivers/net/ifc/rte_pmd_ifc_version.map       |   3 +-
 drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map |   3 +-
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map   |  62 ++--
 drivers/net/kni/rte_pmd_kni_version.map       |   3 +-
 .../net/liquidio/rte_pmd_liquidio_version.map |   3 +-
 drivers/net/memif/rte_pmd_memif_version.map   |   5 +-
 drivers/net/mlx4/rte_pmd_mlx4_version.map     |   3 +-
 drivers/net/mlx5/rte_pmd_mlx5_version.map     |   2 +-
 drivers/net/mvneta/rte_pmd_mvneta_version.map |   2 +-
 drivers/net/mvpp2/rte_pmd_mvpp2_version.map   |   2 +-
 drivers/net/netvsc/rte_pmd_netvsc_version.map |   4 +-
 drivers/net/nfb/rte_pmd_nfb_version.map       |   3 +-
 drivers/net/nfp/rte_pmd_nfp_version.map       |   2 +-
 drivers/net/null/rte_pmd_null_version.map     |   3 +-
 .../net/octeontx/rte_pmd_octeontx_version.map |  10 +-
 .../octeontx2/rte_pmd_octeontx2_version.map   |   3 +-
 drivers/net/pcap/rte_pmd_pcap_version.map     |   3 +-
 drivers/net/pfe/rte_pmd_pfe_version.map       |   3 +-
 drivers/net/qede/rte_pmd_qede_version.map     |   3 +-
 drivers/net/ring/rte_pmd_ring_version.map     |  10 +-
 drivers/net/sfc/rte_pmd_sfc_version.map       |   3 +-
 .../net/softnic/rte_pmd_softnic_version.map   |   2 +-
 .../net/szedata2/rte_pmd_szedata2_version.map |   2 +-
 drivers/net/tap/rte_pmd_tap_version.map       |   3 +-
 .../net/thunderx/rte_pmd_thunderx_version.map |   3 +-
 .../rte_pmd_vdev_netvsc_version.map           |   3 +-
 drivers/net/vhost/rte_pmd_vhost_version.map   |  11 +-
 drivers/net/virtio/rte_pmd_virtio_version.map |   3 +-
 .../net/vmxnet3/rte_pmd_vmxnet3_version.map   |   3 +-
 .../rte_rawdev_dpaa2_cmdif_version.map        |   3 +-
 .../rte_rawdev_dpaa2_qdma_version.map         |   4 +-
 .../raw/ifpga/rte_rawdev_ifpga_version.map    |   3 +-
 drivers/raw/ioat/rte_rawdev_ioat_version.map  |   3 +-
 drivers/raw/ntb/rte_rawdev_ntb_version.map    |   5 +-
 .../rte_rawdev_octeontx2_dma_version.map      |   3 +-
 .../skeleton/rte_rawdev_skeleton_version.map  |   3 +-
 lib/librte_acl/rte_acl_version.map            |   2 +-
 .../rte_bitratestats_version.map              |   2 +-
 lib/librte_cfgfile/rte_cfgfile_version.map    |  34 +-
 lib/librte_cmdline/rte_cmdline_version.map    |  10 +-
 .../rte_cryptodev_version.map                 | 102 ++----
 .../rte_distributor_version.map               |   4 +-
 lib/librte_eal/rte_eal_version.map            | 324 ++++++------------
 lib/librte_efd/rte_efd_version.map            |   2 +-
 lib/librte_ethdev/rte_ethdev_version.map      | 160 +++------
 lib/librte_eventdev/rte_eventdev_version.map  | 130 +++----
 lib/librte_gro/rte_gro_version.map            |   2 +-
 lib/librte_gso/rte_gso_version.map            |   2 +-
 lib/librte_hash/rte_hash_version.map          |  43 +--
 lib/librte_ip_frag/rte_ip_frag_version.map    |  10 +-
 lib/librte_jobstats/rte_jobstats_version.map  |  10 +-
 lib/librte_kni/rte_kni_version.map            |   2 +-
 lib/librte_kvargs/rte_kvargs_version.map      |   4 +-
 .../rte_latencystats_version.map              |   2 +-
 lib/librte_lpm/rte_lpm_version.map            |  39 +--
 lib/librte_mbuf/rte_mbuf_version.map          |  49 +--
 lib/librte_member/rte_member_version.map      |   2 +-
 lib/librte_mempool/rte_mempool_version.map    |  44 +--
 lib/librte_meter/rte_meter_version.map        |  13 +-
 lib/librte_metrics/rte_metrics_version.map    |   2 +-
 lib/librte_net/rte_net_version.map            |  23 +-
 lib/librte_pci/rte_pci_version.map            |   2 +-
 lib/librte_pdump/rte_pdump_version.map        |   2 +-
 lib/librte_pipeline/rte_pipeline_version.map  |  36 +-
 lib/librte_port/rte_port_version.map          |  64 +---
 lib/librte_power/rte_power_version.map        |  24 +-
 lib/librte_rawdev/rte_rawdev_version.map      |   4 +-
 lib/librte_reorder/rte_reorder_version.map    |   8 +-
 lib/librte_ring/rte_ring_version.map          |  10 +-
 lib/librte_sched/rte_sched_version.map        |  14 +-
 lib/librte_security/rte_security_version.map  |   2 +-
 lib/librte_table/rte_table_version.map        |   2 +-
 lib/librte_timer/rte_timer_version.map        |  12 +-
 lib/librte_vhost/rte_vhost_version.map        |  52 +--
 148 files changed, 695 insertions(+), 1438 deletions(-)

diff --git a/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map b/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
index f64b0f9c27..d9de5102db 100644
--- a/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
+++ b/drivers/baseband/fpga_lte_fec/rte_pmd_bbdev_fpga_lte_fec_version.map
@@ -1,10 +1,6 @@
-DPDK_19.08 {
-    local: *;
-};
-
 EXPERIMENTAL {
-    global:
+	global:
 
-    fpga_lte_fec_configure;
+	fpga_lte_fec_configure;
 
 };
diff --git a/drivers/baseband/null/rte_pmd_bbdev_null_version.map b/drivers/baseband/null/rte_pmd_bbdev_null_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/baseband/null/rte_pmd_bbdev_null_version.map
+++ b/drivers/baseband/null/rte_pmd_bbdev_null_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map b/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
+++ b/drivers/baseband/turbo_sw/rte_pmd_bbdev_turbo_sw_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map
index cf428a54dc..e6ca4361e0 100644
--- a/drivers/bus/dpaa/rte_bus_dpaa_version.map
+++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	bman_acquire;
@@ -7,123 +7,90 @@ DPDK_17.11 {
 	bman_new_pool;
 	bman_query_free_buffers;
 	bman_release;
+	bman_thread_irq;
+	dpaa_logtype_eventdev;
 	dpaa_logtype_mempool;
 	dpaa_logtype_pmd;
 	dpaa_netcfg;
+	dpaa_svr_family;
 	fman_ccsr_map_fd;
 	fman_dealloc_bufs_mask_hi;
 	fman_dealloc_bufs_mask_lo;
 	fman_if_add_mac_addr;
 	fman_if_clear_mac_addr;
 	fman_if_disable_rx;
-	fman_if_enable_rx;
 	fman_if_discard_rx_errors;
-	fman_if_get_fc_threshold;
+	fman_if_enable_rx;
 	fman_if_get_fc_quanta;
+	fman_if_get_fc_threshold;
 	fman_if_get_fdoff;
+	fman_if_get_sg_enable;
 	fman_if_loopback_disable;
 	fman_if_loopback_enable;
 	fman_if_promiscuous_disable;
 	fman_if_promiscuous_enable;
 	fman_if_reset_mcast_filter_table;
 	fman_if_set_bp;
-	fman_if_set_fc_threshold;
 	fman_if_set_fc_quanta;
+	fman_if_set_fc_threshold;
 	fman_if_set_fdoff;
 	fman_if_set_ic_params;
 	fman_if_set_maxfrm;
 	fman_if_set_mcast_filter_table;
+	fman_if_set_sg;
 	fman_if_stats_get;
 	fman_if_stats_get_all;
 	fman_if_stats_reset;
 	fman_ip_rev;
+	fsl_qman_fq_portal_create;
 	netcfg_acquire;
 	netcfg_release;
-	qm_channel_caam;
-	qman_create_fq;
-	qman_dequeue;
-	qman_dqrr_consume;
-	qman_enqueue;
-	qman_enqueue_multi;
-	qman_fq_fqid;
-	qman_fq_state;
-	qman_init_fq;
-	qman_poll_dqrr;
-	qman_query_fq_np;
-	qman_set_vdq;
-	qman_reserve_fqid_range;
-	qman_volatile_dequeue;
-	rte_dpaa_driver_register;
-	rte_dpaa_driver_unregister;
-	rte_dpaa_mem_ptov;
-	rte_dpaa_portal_init;
-
-	local: *;
-};
-
-DPDK_18.02 {
-	global:
-
-	dpaa_logtype_eventdev;
-	dpaa_svr_family;
 	per_lcore_dpaa_io;
 	per_lcore_held_bufs;
+	qm_channel_caam;
 	qm_channel_pool1;
 	qman_alloc_cgrid_range;
 	qman_alloc_pool_range;
+	qman_clear_irq;
 	qman_create_cgr;
+	qman_create_fq;
 	qman_dca_index;
 	qman_delete_cgr;
+	qman_dequeue;
+	qman_dqrr_consume;
+	qman_enqueue;
+	qman_enqueue_multi;
 	qman_enqueue_multi_fq;
+	qman_fq_fqid;
+	qman_fq_portal_irqsource_add;
+	qman_fq_portal_irqsource_remove;
+	qman_fq_portal_thread_irq;
+	qman_fq_state;
+	qman_init_fq;
+	qman_irqsource_add;
+	qman_irqsource_remove;
 	qman_modify_cgr;
 	qman_oos_fq;
+	qman_poll_dqrr;
 	qman_portal_dequeue;
 	qman_portal_poll_rx;
 	qman_query_fq_frm_cnt;
+	qman_query_fq_np;
 	qman_release_cgrid_range;
+	qman_reserve_fqid_range;
 	qman_retire_fq;
+	qman_set_fq_lookup_table;
+	qman_set_vdq;
 	qman_static_dequeue_add;
-	rte_dpaa_portal_fq_close;
-	rte_dpaa_portal_fq_init;
-
-} DPDK_17.11;
-
-DPDK_18.08 {
-	global:
-
-	fman_if_get_sg_enable;
-	fman_if_set_sg;
-
-} DPDK_18.02;
-
-DPDK_18.11 {
-	global:
-
-	bman_thread_irq;
-	fman_if_get_sg_enable;
-	fman_if_set_sg;
-	qman_clear_irq;
-
-	qman_irqsource_add;
-	qman_irqsource_remove;
 	qman_thread_fd;
 	qman_thread_irq;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	qman_set_fq_lookup_table;
-
-} DPDK_18.11;
-
-DPDK_19.11 {
-	global:
-
-	fsl_qman_fq_portal_create;
-	qman_fq_portal_irqsource_add;
-	qman_fq_portal_irqsource_remove;
-	qman_fq_portal_thread_irq;
-
-} DPDK_19.05;
+	qman_volatile_dequeue;
+	rte_dpaa_driver_register;
+	rte_dpaa_driver_unregister;
+	rte_dpaa_mem_ptov;
+	rte_dpaa_portal_fq_close;
+	rte_dpaa_portal_fq_init;
+	rte_dpaa_portal_init;
+
+	local: *;
+};
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index 4da787236b..fe45575046 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -1,32 +1,67 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
+	dpaa2_affine_qbman_ethrx_swp;
 	dpaa2_affine_qbman_swp;
 	dpaa2_alloc_dpbp_dev;
 	dpaa2_alloc_dq_storage;
+	dpaa2_dpbp_supported;
+	dpaa2_dqrr_size;
+	dpaa2_eqcr_size;
 	dpaa2_free_dpbp_dev;
 	dpaa2_free_dq_storage;
+	dpaa2_free_eq_descriptors;
+	dpaa2_get_qbman_swp;
+	dpaa2_io_portal;
+	dpaa2_svr_family;
+	dpaa2_virt_mode;
 	dpbp_disable;
 	dpbp_enable;
 	dpbp_get_attributes;
 	dpbp_get_num_free_bufs;
 	dpbp_open;
 	dpbp_reset;
+	dpci_get_opr;
+	dpci_set_opr;
+	dpci_set_rx_queue;
+	dpcon_get_attributes;
+	dpcon_open;
+	dpdmai_close;
+	dpdmai_disable;
+	dpdmai_enable;
+	dpdmai_get_attributes;
+	dpdmai_get_rx_queue;
+	dpdmai_get_tx_queue;
+	dpdmai_open;
+	dpdmai_set_rx_queue;
+	dpio_add_static_dequeue_channel;
 	dpio_close;
 	dpio_disable;
 	dpio_enable;
 	dpio_get_attributes;
 	dpio_open;
+	dpio_remove_static_dequeue_channel;
 	dpio_reset;
 	dpio_set_stashing_destination;
+	mc_get_soc_version;
+	mc_get_version;
 	mc_send_command;
 	per_lcore__dpaa2_io;
+	per_lcore_dpaa2_held_bufs;
 	qbman_check_command_complete;
+	qbman_check_new_result;
 	qbman_eq_desc_clear;
+	qbman_eq_desc_set_dca;
 	qbman_eq_desc_set_fq;
 	qbman_eq_desc_set_no_orp;
+	qbman_eq_desc_set_orp;
 	qbman_eq_desc_set_qd;
 	qbman_eq_desc_set_response;
+	qbman_eq_desc_set_token;
+	qbman_fq_query_state;
+	qbman_fq_state_frame_count;
+	qbman_get_dqrr_from_idx;
+	qbman_get_dqrr_idx;
 	qbman_pull_desc_clear;
 	qbman_pull_desc_set_fq;
 	qbman_pull_desc_set_numframes;
@@ -35,112 +70,43 @@ DPDK_17.05 {
 	qbman_release_desc_set_bpid;
 	qbman_result_DQ_fd;
 	qbman_result_DQ_flags;
-	qbman_result_has_new_result;
-	qbman_swp_acquire;
-	qbman_swp_pull;
-	qbman_swp_release;
-	rte_fslmc_driver_register;
-	rte_fslmc_driver_unregister;
-	rte_fslmc_vfio_dmamap;
-	rte_mcp_ptr_list;
-
-	local: *;
-};
-
-DPDK_17.08 {
-	global:
-
-	dpaa2_io_portal;
-	dpaa2_get_qbman_swp;
-	dpci_set_rx_queue;
-	dpcon_open;
-	dpcon_get_attributes;
-	dpio_add_static_dequeue_channel;
-	dpio_remove_static_dequeue_channel;
-	mc_get_soc_version;
-	mc_get_version;
-	qbman_check_new_result;
-	qbman_eq_desc_set_dca;
-	qbman_get_dqrr_from_idx;
-	qbman_get_dqrr_idx;
 	qbman_result_DQ_fqd_ctx;
+	qbman_result_DQ_odpid;
+	qbman_result_DQ_seqnum;
 	qbman_result_SCN_state;
+	qbman_result_eqresp_fd;
+	qbman_result_eqresp_rc;
+	qbman_result_eqresp_rspid;
+	qbman_result_eqresp_set_rspid;
+	qbman_result_has_new_result;
+	qbman_swp_acquire;
 	qbman_swp_dqrr_consume;
+	qbman_swp_dqrr_idx_consume;
 	qbman_swp_dqrr_next;
 	qbman_swp_enqueue_multiple;
 	qbman_swp_enqueue_multiple_desc;
+	qbman_swp_enqueue_multiple_fd;
 	qbman_swp_interrupt_clear_status;
+	qbman_swp_prefetch_dqrr_next;
+	qbman_swp_pull;
 	qbman_swp_push_set;
+	qbman_swp_release;
 	rte_dpaa2_alloc_dpci_dev;
-	rte_fslmc_object_register;
-	rte_global_active_dqs_list;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	dpaa2_dpbp_supported;
 	rte_dpaa2_dev_type;
+	rte_dpaa2_free_dpci_dev;
 	rte_dpaa2_intr_disable;
 	rte_dpaa2_intr_enable;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	dpaa2_svr_family;
-	dpaa2_virt_mode;
-	per_lcore_dpaa2_held_bufs;
-	qbman_fq_query_state;
-	qbman_fq_state_frame_count;
-	qbman_swp_dqrr_idx_consume;
-	qbman_swp_prefetch_dqrr_next;
-	rte_fslmc_get_device_count;
-
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	dpaa2_affine_qbman_ethrx_swp;
-	dpdmai_close;
-	dpdmai_disable;
-	dpdmai_enable;
-	dpdmai_get_attributes;
-	dpdmai_get_rx_queue;
-	dpdmai_get_tx_queue;
-	dpdmai_open;
-	dpdmai_set_rx_queue;
-	rte_dpaa2_free_dpci_dev;
 	rte_dpaa2_memsegs;
-
-} DPDK_18.02;
-
-DPDK_18.11 {
-	global:
-	dpaa2_dqrr_size;
-	dpaa2_eqcr_size;
-	dpci_get_opr;
-	dpci_set_opr;
-
-} DPDK_18.05;
-
-DPDK_19.05 {
-	global:
-	dpaa2_free_eq_descriptors;
-
-	qbman_eq_desc_set_orp;
-	qbman_eq_desc_set_token;
-	qbman_result_DQ_odpid;
-	qbman_result_DQ_seqnum;
-	qbman_result_eqresp_fd;
-	qbman_result_eqresp_rc;
-	qbman_result_eqresp_rspid;
-	qbman_result_eqresp_set_rspid;
-	qbman_swp_enqueue_multiple_fd;
-} DPDK_18.11;
+	rte_fslmc_driver_register;
+	rte_fslmc_driver_unregister;
+	rte_fslmc_get_device_count;
+	rte_fslmc_object_register;
+	rte_fslmc_vfio_dmamap;
+	rte_global_active_dqs_list;
+	rte_mcp_ptr_list;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/drivers/bus/ifpga/rte_bus_ifpga_version.map b/drivers/bus/ifpga/rte_bus_ifpga_version.map
index 964c9a9c45..05b4a28c1b 100644
--- a/drivers/bus/ifpga/rte_bus_ifpga_version.map
+++ b/drivers/bus/ifpga/rte_bus_ifpga_version.map
@@ -1,17 +1,11 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	global:
 
-	rte_ifpga_get_integer32_arg;
-	rte_ifpga_get_string_arg;
 	rte_ifpga_driver_register;
 	rte_ifpga_driver_unregister;
+	rte_ifpga_find_afu_by_name;
+	rte_ifpga_get_integer32_arg;
+	rte_ifpga_get_string_arg;
 
 	local: *;
 };
-
-DPDK_19.05 {
-	global:
-
-	rte_ifpga_find_afu_by_name;
-
-} DPDK_18.05;
diff --git a/drivers/bus/pci/rte_bus_pci_version.map b/drivers/bus/pci/rte_bus_pci_version.map
index 27e9c4f101..012d817e14 100644
--- a/drivers/bus/pci/rte_bus_pci_version.map
+++ b/drivers/bus/pci/rte_bus_pci_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_pci_dump;
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
index 590cf9b437..5abb10ecb0 100644
--- a/drivers/bus/vdev/rte_bus_vdev_version.map
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -1,18 +1,12 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
+	rte_vdev_add_custom_scan;
 	rte_vdev_init;
 	rte_vdev_register;
+	rte_vdev_remove_custom_scan;
 	rte_vdev_uninit;
 	rte_vdev_unregister;
 
 	local: *;
 };
-
-DPDK_18.02 {
-	global:
-
-	rte_vdev_add_custom_scan;
-	rte_vdev_remove_custom_scan;
-
-} DPDK_17.11;
diff --git a/drivers/bus/vmbus/rte_bus_vmbus_version.map b/drivers/bus/vmbus/rte_bus_vmbus_version.map
index ae231ad329..cbaaebc06c 100644
--- a/drivers/bus/vmbus/rte_bus_vmbus_version.map
+++ b/drivers/bus/vmbus/rte_bus_vmbus_version.map
@@ -1,6 +1,4 @@
-/* SPDX-License-Identifier: BSD-3-Clause */
-
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	rte_vmbus_chan_close;
@@ -20,6 +18,7 @@ DPDK_18.08 {
 	rte_vmbus_probe;
 	rte_vmbus_register;
 	rte_vmbus_scan;
+	rte_vmbus_set_latency;
 	rte_vmbus_sub_channel_index;
 	rte_vmbus_subchan_open;
 	rte_vmbus_unmap_device;
@@ -27,10 +26,3 @@ DPDK_18.08 {
 
 	local: *;
 };
-
-DPDK_18.11 {
-	global:
-
-	rte_vmbus_set_latency;
-
-} DPDK_18.08;
diff --git a/drivers/common/cpt/rte_common_cpt_version.map b/drivers/common/cpt/rte_common_cpt_version.map
index 382ec4bd44..7f1929d58e 100644
--- a/drivers/common/cpt/rte_common_cpt_version.map
+++ b/drivers/common/cpt/rte_common_cpt_version.map
@@ -1,14 +1,9 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
+	cpt_pmd_ops_helper_asym_get_mlen;
 	cpt_pmd_ops_helper_get_mlen_direct_mode;
 	cpt_pmd_ops_helper_get_mlen_sg_mode;
-};
-
-DPDK_19.11 {
-	global:
-
-	cpt_pmd_ops_helper_asym_get_mlen;
 
 	local: *;
 };
diff --git a/drivers/common/dpaax/rte_common_dpaax_version.map b/drivers/common/dpaax/rte_common_dpaax_version.map
index a7699ae4dd..f72eba761d 100644
--- a/drivers/common/dpaax/rte_common_dpaax_version.map
+++ b/drivers/common/dpaax/rte_common_dpaax_version.map
@@ -1,29 +1,23 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
-	dpaax_iova_table_update;
 	dpaax_iova_table_depopulate;
 	dpaax_iova_table_dump;
 	dpaax_iova_table_p;
 	dpaax_iova_table_populate;
-
-	local: *;
-};
-
-DPDK_19.11 {
-	global:
+	dpaax_iova_table_update;
 	of_device_is_available;
 	of_device_is_compatible;
 	of_find_compatible_node;
 	of_find_node_by_phandle;
 	of_get_address;
 	of_get_mac_address;
+	of_get_next_child;
 	of_get_parent;
 	of_get_property;
 	of_init_path;
 	of_n_addr_cells;
 	of_translate_address;
-	of_get_next_child;
 
 	local: *;
-} DPDK_18.11;
+};
diff --git a/drivers/common/mvep/rte_common_mvep_version.map b/drivers/common/mvep/rte_common_mvep_version.map
index c71722d79f..030928439d 100644
--- a/drivers/common/mvep/rte_common_mvep_version.map
+++ b/drivers/common/mvep/rte_common_mvep_version.map
@@ -1,6 +1,8 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
-	rte_mvep_init;
 	rte_mvep_deinit;
+	rte_mvep_init;
+
+	local: *;
 };
diff --git a/drivers/common/octeontx/rte_common_octeontx_version.map b/drivers/common/octeontx/rte_common_octeontx_version.map
index a9b3cff9bc..c15fb89112 100644
--- a/drivers/common/octeontx/rte_common_octeontx_version.map
+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
@@ -1,8 +1,10 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	global:
 
 	octeontx_logtype_mbox;
+	octeontx_mbox_send;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
-	octeontx_mbox_send;
+
+	local: *;
 };
diff --git a/drivers/common/octeontx2/rte_common_octeontx2_version.map b/drivers/common/octeontx2/rte_common_octeontx2_version.map
index 4400120da0..adad21a2d6 100644
--- a/drivers/common/octeontx2/rte_common_octeontx2_version.map
+++ b/drivers/common/octeontx2/rte_common_octeontx2_version.map
@@ -1,39 +1,35 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
 	otx2_dev_active_vfs;
 	otx2_dev_fini;
 	otx2_dev_priv_init;
-
+	otx2_disable_irqs;
+	otx2_intra_dev_get_cfg;
 	otx2_logtype_base;
 	otx2_logtype_dpi;
 	otx2_logtype_mbox;
+	otx2_logtype_nix;
 	otx2_logtype_npa;
 	otx2_logtype_npc;
-	otx2_logtype_nix;
 	otx2_logtype_sso;
-	otx2_logtype_tm;
 	otx2_logtype_tim;
-
+	otx2_logtype_tm;
 	otx2_mbox_alloc_msg_rsp;
 	otx2_mbox_get_rsp;
 	otx2_mbox_get_rsp_tmo;
 	otx2_mbox_id2name;
 	otx2_mbox_msg_send;
 	otx2_mbox_wait_for_rsp;
-
-	otx2_intra_dev_get_cfg;
 	otx2_npa_lf_active;
 	otx2_npa_lf_obj_get;
 	otx2_npa_lf_obj_ref;
 	otx2_npa_pf_func_get;
 	otx2_npa_set_defaults;
+	otx2_register_irq;
 	otx2_sso_pf_func_get;
 	otx2_sso_pf_func_set;
-
-	otx2_disable_irqs;
 	otx2_unregister_irq;
-	otx2_register_irq;
 
 	local: *;
 };
diff --git a/drivers/compress/isal/rte_pmd_isal_version.map b/drivers/compress/isal/rte_pmd_isal_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/compress/isal/rte_pmd_isal_version.map
+++ b/drivers/compress/isal/rte_pmd_isal_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map b/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
+++ b/drivers/compress/octeontx/rte_pmd_octeontx_compress_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/qat/rte_pmd_qat_version.map b/drivers/compress/qat/rte_pmd_qat_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/qat/rte_pmd_qat_version.map
+++ b/drivers/compress/qat/rte_pmd_qat_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/compress/zlib/rte_pmd_zlib_version.map b/drivers/compress/zlib/rte_pmd_zlib_version.map
index ad6e191e49..f9f17e4f6e 100644
--- a/drivers/compress/zlib/rte_pmd_zlib_version.map
+++ b/drivers/compress/zlib/rte_pmd_zlib_version.map
@@ -1,3 +1,3 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map b/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
+++ b/drivers/crypto/aesni_gcm/rte_pmd_aesni_gcm_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map b/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
+++ b/drivers/crypto/aesni_mb/rte_pmd_aesni_mb_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/armv8/rte_pmd_armv8_version.map b/drivers/crypto/armv8/rte_pmd_armv8_version.map
index 1f84b68a83..f9f17e4f6e 100644
--- a/drivers/crypto/armv8/rte_pmd_armv8_version.map
+++ b/drivers/crypto/armv8/rte_pmd_armv8_version.map
@@ -1,3 +1,3 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map b/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
+++ b/drivers/crypto/caam_jr/rte_pmd_caam_jr_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/ccp/rte_pmd_ccp_version.map b/drivers/crypto/ccp/rte_pmd_ccp_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/crypto/ccp/rte_pmd_ccp_version.map
+++ b/drivers/crypto/ccp/rte_pmd_ccp_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map b/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
index 0bfb986d0b..5952d645fd 100644
--- a/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
+++ b/drivers/crypto/dpaa2_sec/rte_pmd_dpaa2_sec_version.map
@@ -1,12 +1,8 @@
-DPDK_17.05 {
-
-	local: *;
-};
-
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa2_sec_eventq_attach;
 	dpaa2_sec_eventq_detach;
 
-} DPDK_17.05;
+	local: *;
+};
diff --git a/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map b/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
index cc7f2162e0..8580fa13db 100644
--- a/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
+++ b/drivers/crypto/dpaa_sec/rte_pmd_dpaa_sec_version.map
@@ -1,12 +1,8 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_19.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa_sec_eventq_attach;
 	dpaa_sec_eventq_detach;
 
-} DPDK_17.11;
+	local: *;
+};
diff --git a/drivers/crypto/kasumi/rte_pmd_kasumi_version.map b/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
index 8ffeca934e..f9f17e4f6e 100644
--- a/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
+++ b/drivers/crypto/kasumi/rte_pmd_kasumi_version.map
@@ -1,3 +1,3 @@
-DPDK_16.07 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/mvsam/rte_pmd_mvsam_version.map b/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
+++ b/drivers/crypto/mvsam/rte_pmd_mvsam_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/nitrox/rte_pmd_nitrox_version.map b/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
index 406964d1fc..f9f17e4f6e 100644
--- a/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
+++ b/drivers/crypto/nitrox/rte_pmd_nitrox_version.map
@@ -1,3 +1,3 @@
-DPDK_19.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/null/rte_pmd_null_crypto_version.map b/drivers/crypto/null/rte_pmd_null_crypto_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/null/rte_pmd_null_crypto_version.map
+++ b/drivers/crypto/null/rte_pmd_null_crypto_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map b/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
+++ b/drivers/crypto/octeontx/rte_pmd_octeontx_crypto_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map b/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
index b7b7c91683..f9f17e4f6e 100644
--- a/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
+++ b/drivers/crypto/octeontx2/rte_pmd_octeontx2_crypto_version.map
@@ -1,4 +1,3 @@
-DPDK_19.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/openssl/rte_pmd_openssl_version.map b/drivers/crypto/openssl/rte_pmd_openssl_version.map
index cc5829e30b..f9f17e4f6e 100644
--- a/drivers/crypto/openssl/rte_pmd_openssl_version.map
+++ b/drivers/crypto/openssl/rte_pmd_openssl_version.map
@@ -1,3 +1,3 @@
-DPDK_16.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map b/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
index 5c43127cf2..077afedce7 100644
--- a/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
+++ b/drivers/crypto/scheduler/rte_pmd_crypto_scheduler_version.map
@@ -1,21 +1,16 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
 	rte_cryptodev_scheduler_load_user_scheduler;
-	rte_cryptodev_scheduler_slave_attach;
-	rte_cryptodev_scheduler_slave_detach;
-	rte_cryptodev_scheduler_ordering_set;
-	rte_cryptodev_scheduler_ordering_get;
-
-};
-
-DPDK_17.05 {
-	global:
-
 	rte_cryptodev_scheduler_mode_get;
 	rte_cryptodev_scheduler_mode_set;
 	rte_cryptodev_scheduler_option_get;
 	rte_cryptodev_scheduler_option_set;
+	rte_cryptodev_scheduler_ordering_get;
+	rte_cryptodev_scheduler_ordering_set;
+	rte_cryptodev_scheduler_slave_attach;
+	rte_cryptodev_scheduler_slave_detach;
 	rte_cryptodev_scheduler_slaves_get;
 
-} DPDK_17.02;
+	local: *;
+};
diff --git a/drivers/crypto/snow3g/rte_pmd_snow3g_version.map b/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
index dc4d417b7b..f9f17e4f6e 100644
--- a/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
+++ b/drivers/crypto/snow3g/rte_pmd_snow3g_version.map
@@ -1,3 +1,3 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map b/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
+++ b/drivers/crypto/virtio/rte_pmd_virtio_crypto_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/crypto/zuc/rte_pmd_zuc_version.map b/drivers/crypto/zuc/rte_pmd_zuc_version.map
index cc5829e30b..f9f17e4f6e 100644
--- a/drivers/crypto/zuc/rte_pmd_zuc_version.map
+++ b/drivers/crypto/zuc/rte_pmd_zuc_version.map
@@ -1,3 +1,3 @@
-DPDK_16.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dpaa/rte_pmd_dpaa_event_version.map b/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
+++ b/drivers/event/dpaa/rte_pmd_dpaa_event_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map b/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
index 1c0b7559dc..f9f17e4f6e 100644
--- a/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
+++ b/drivers/event/dpaa2/rte_pmd_dpaa2_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/dsw/rte_pmd_dsw_event_version.map b/drivers/event/dsw/rte_pmd_dsw_event_version.map
index 24bd5cdb35..f9f17e4f6e 100644
--- a/drivers/event/dsw/rte_pmd_dsw_event_version.map
+++ b/drivers/event/dsw/rte_pmd_dsw_event_version.map
@@ -1,3 +1,3 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/octeontx/rte_pmd_octeontx_event_version.map b/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
+++ b/drivers/event/octeontx/rte_pmd_octeontx_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map b/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
index 41c65c8c9c..f9f17e4f6e 100644
--- a/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
+++ b/drivers/event/octeontx2/rte_pmd_octeontx2_event_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	local: *;
 };
-
diff --git a/drivers/event/opdl/rte_pmd_opdl_event_version.map b/drivers/event/opdl/rte_pmd_opdl_event_version.map
index 58b94270d4..f9f17e4f6e 100644
--- a/drivers/event/opdl/rte_pmd_opdl_event_version.map
+++ b/drivers/event/opdl/rte_pmd_opdl_event_version.map
@@ -1,3 +1,3 @@
-DPDK_18.02 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
+++ b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/event/sw/rte_pmd_sw_event_version.map b/drivers/event/sw/rte_pmd_sw_event_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/event/sw/rte_pmd_sw_event_version.map
+++ b/drivers/event/sw/rte_pmd_sw_event_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/bucket/rte_mempool_bucket_version.map b/drivers/mempool/bucket/rte_mempool_bucket_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/mempool/bucket/rte_mempool_bucket_version.map
+++ b/drivers/mempool/bucket/rte_mempool_bucket_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
index 60bf50b2d1..9eebaf7ffd 100644
--- a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
+++ b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_dpaa_bpid_info;
diff --git a/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map b/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
index b45e7a9ac1..cd4bc88273 100644
--- a/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
+++ b/drivers/mempool/dpaa2/rte_mempool_dpaa2_version.map
@@ -1,16 +1,10 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_dpaa2_bpid_info;
 	rte_dpaa2_mbuf_alloc_bulk;
-
-	local: *;
-};
-
-DPDK_18.05 {
-	global:
-
 	rte_dpaa2_mbuf_from_buf_addr;
 	rte_dpaa2_mbuf_pool_bpid;
 
-} DPDK_17.05;
+	local: *;
+};
diff --git a/drivers/mempool/octeontx/rte_mempool_octeontx_version.map b/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
+++ b/drivers/mempool/octeontx/rte_mempool_octeontx_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map b/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
index d703368c31..d4f81aed8e 100644
--- a/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
+++ b/drivers/mempool/octeontx2/rte_mempool_octeontx2_version.map
@@ -1,8 +1,8 @@
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
-	otx2_npa_lf_init;
 	otx2_npa_lf_fini;
+	otx2_npa_lf_init;
 
 	local: *;
 };
diff --git a/drivers/mempool/ring/rte_mempool_ring_version.map b/drivers/mempool/ring/rte_mempool_ring_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/mempool/ring/rte_mempool_ring_version.map
+++ b/drivers/mempool/ring/rte_mempool_ring_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/mempool/stack/rte_mempool_stack_version.map b/drivers/mempool/stack/rte_mempool_stack_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/mempool/stack/rte_mempool_stack_version.map
+++ b/drivers/mempool/stack/rte_mempool_stack_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/af_packet/rte_pmd_af_packet_version.map b/drivers/net/af_packet/rte_pmd_af_packet_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/af_packet/rte_pmd_af_packet_version.map
+++ b/drivers/net/af_packet/rte_pmd_af_packet_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/af_xdp/rte_pmd_af_xdp_version.map b/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
index c6db030fe6..f9f17e4f6e 100644
--- a/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
+++ b/drivers/net/af_xdp/rte_pmd_af_xdp_version.map
@@ -1,3 +1,3 @@
-DPDK_19.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ark/rte_pmd_ark_version.map b/drivers/net/ark/rte_pmd_ark_version.map
index 1062e0429f..f9f17e4f6e 100644
--- a/drivers/net/ark/rte_pmd_ark_version.map
+++ b/drivers/net/ark/rte_pmd_ark_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-	 local: *;
-
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/atlantic/rte_pmd_atlantic_version.map b/drivers/net/atlantic/rte_pmd_atlantic_version.map
index b16faa999f..74146e9c09 100644
--- a/drivers/net/atlantic/rte_pmd_atlantic_version.map
+++ b/drivers/net/atlantic/rte_pmd_atlantic_version.map
@@ -1,8 +1,3 @@
-DPDK_18.11 {
-
-	local: *;
-};
-
 EXPERIMENTAL {
 	global:
 
@@ -13,4 +8,3 @@ EXPERIMENTAL {
 	rte_pmd_atl_macsec_select_txsa;
 	rte_pmd_atl_macsec_select_rxsa;
 };
-
diff --git a/drivers/net/avp/rte_pmd_avp_version.map b/drivers/net/avp/rte_pmd_avp_version.map
index 5352e7e3bd..f9f17e4f6e 100644
--- a/drivers/net/avp/rte_pmd_avp_version.map
+++ b/drivers/net/avp/rte_pmd_avp_version.map
@@ -1,3 +1,3 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/axgbe/rte_pmd_axgbe_version.map b/drivers/net/axgbe/rte_pmd_axgbe_version.map
index de8e412ff1..f9f17e4f6e 100644
--- a/drivers/net/axgbe/rte_pmd_axgbe_version.map
+++ b/drivers/net/axgbe/rte_pmd_axgbe_version.map
@@ -1,3 +1,3 @@
-DPDK_18.05 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/bnx2x/rte_pmd_bnx2x_version.map b/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
index bd8138a034..f9f17e4f6e 100644
--- a/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
+++ b/drivers/net/bnx2x/rte_pmd_bnx2x_version.map
@@ -1,4 +1,3 @@
-DPDK_2.1 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/bnxt/rte_pmd_bnxt_version.map b/drivers/net/bnxt/rte_pmd_bnxt_version.map
index 4750d40ad6..bb52562347 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt_version.map
+++ b/drivers/net/bnxt/rte_pmd_bnxt_version.map
@@ -1,4 +1,4 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	global:
 
 	rte_pmd_bnxt_get_vf_rx_status;
@@ -10,13 +10,13 @@ DPDK_17.08 {
 	rte_pmd_bnxt_set_tx_loopback;
 	rte_pmd_bnxt_set_vf_mac_addr;
 	rte_pmd_bnxt_set_vf_mac_anti_spoof;
+	rte_pmd_bnxt_set_vf_persist_stats;
 	rte_pmd_bnxt_set_vf_rate_limit;
 	rte_pmd_bnxt_set_vf_rxmode;
 	rte_pmd_bnxt_set_vf_vlan_anti_spoof;
 	rte_pmd_bnxt_set_vf_vlan_filter;
 	rte_pmd_bnxt_set_vf_vlan_insert;
 	rte_pmd_bnxt_set_vf_vlan_stripq;
-	rte_pmd_bnxt_set_vf_persist_stats;
 
 	local: *;
 };
diff --git a/drivers/net/bonding/rte_pmd_bond_version.map b/drivers/net/bonding/rte_pmd_bond_version.map
index 00d955c481..270c7d5d55 100644
--- a/drivers/net/bonding/rte_pmd_bond_version.map
+++ b/drivers/net/bonding/rte_pmd_bond_version.map
@@ -1,9 +1,21 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_eth_bond_8023ad_agg_selection_get;
+	rte_eth_bond_8023ad_agg_selection_set;
+	rte_eth_bond_8023ad_conf_get;
+	rte_eth_bond_8023ad_dedicated_queues_disable;
+	rte_eth_bond_8023ad_dedicated_queues_enable;
+	rte_eth_bond_8023ad_ext_collect;
+	rte_eth_bond_8023ad_ext_collect_get;
+	rte_eth_bond_8023ad_ext_distrib;
+	rte_eth_bond_8023ad_ext_distrib_get;
+	rte_eth_bond_8023ad_ext_slowtx;
+	rte_eth_bond_8023ad_setup;
 	rte_eth_bond_8023ad_slave_info;
 	rte_eth_bond_active_slaves_get;
 	rte_eth_bond_create;
+	rte_eth_bond_free;
 	rte_eth_bond_link_monitoring_set;
 	rte_eth_bond_mac_address_reset;
 	rte_eth_bond_mac_address_set;
@@ -19,36 +31,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_2.1 {
-	global:
-
-	rte_eth_bond_free;
-
-} DPDK_2.0;
-
-DPDK_16.04 {
-};
-
-DPDK_16.07 {
-	global:
-
-	rte_eth_bond_8023ad_ext_collect;
-	rte_eth_bond_8023ad_ext_collect_get;
-	rte_eth_bond_8023ad_ext_distrib;
-	rte_eth_bond_8023ad_ext_distrib_get;
-	rte_eth_bond_8023ad_ext_slowtx;
-
-} DPDK_16.04;
-
-DPDK_17.08 {
-	global:
-
-	rte_eth_bond_8023ad_dedicated_queues_enable;
-	rte_eth_bond_8023ad_dedicated_queues_disable;
-	rte_eth_bond_8023ad_agg_selection_get;
-	rte_eth_bond_8023ad_agg_selection_set;
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
-
-} DPDK_16.07;
diff --git a/drivers/net/cxgbe/rte_pmd_cxgbe_version.map b/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
index bd8138a034..f9f17e4f6e 100644
--- a/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
+++ b/drivers/net/cxgbe/rte_pmd_cxgbe_version.map
@@ -1,4 +1,3 @@
-DPDK_2.1 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/dpaa/rte_pmd_dpaa_version.map b/drivers/net/dpaa/rte_pmd_dpaa_version.map
index 8cb4500b51..f403a1526d 100644
--- a/drivers/net/dpaa/rte_pmd_dpaa_version.map
+++ b/drivers/net/dpaa/rte_pmd_dpaa_version.map
@@ -1,12 +1,9 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	dpaa_eth_eventq_attach;
 	dpaa_eth_eventq_detach;
 	rte_pmd_dpaa_set_tx_loopback;
-} DPDK_17.11;
+
+	local: *;
+};
diff --git a/drivers/net/dpaa2/rte_pmd_dpaa2_version.map b/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
index d1b4cdb232..f2bb793319 100644
--- a/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
+++ b/drivers/net/dpaa2/rte_pmd_dpaa2_version.map
@@ -1,15 +1,11 @@
-DPDK_17.05 {
-
-	local: *;
-};
-
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	dpaa2_eth_eventq_attach;
 	dpaa2_eth_eventq_detach;
 
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
@@ -17,4 +13,4 @@ EXPERIMENTAL {
 	rte_pmd_dpaa2_mux_flow_create;
 	rte_pmd_dpaa2_set_custom_hash;
 	rte_pmd_dpaa2_set_timestamp;
-} DPDK_17.11;
+};
diff --git a/drivers/net/e1000/rte_pmd_e1000_version.map b/drivers/net/e1000/rte_pmd_e1000_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/e1000/rte_pmd_e1000_version.map
+++ b/drivers/net/e1000/rte_pmd_e1000_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ena/rte_pmd_ena_version.map b/drivers/net/ena/rte_pmd_ena_version.map
index 349c6e1c22..f9f17e4f6e 100644
--- a/drivers/net/ena/rte_pmd_ena_version.map
+++ b/drivers/net/ena/rte_pmd_ena_version.map
@@ -1,4 +1,3 @@
-DPDK_16.04 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/enetc/rte_pmd_enetc_version.map b/drivers/net/enetc/rte_pmd_enetc_version.map
index 521e51f411..f9f17e4f6e 100644
--- a/drivers/net/enetc/rte_pmd_enetc_version.map
+++ b/drivers/net/enetc/rte_pmd_enetc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/enic/rte_pmd_enic_version.map b/drivers/net/enic/rte_pmd_enic_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/enic/rte_pmd_enic_version.map
+++ b/drivers/net/enic/rte_pmd_enic_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/failsafe/rte_pmd_failsafe_version.map b/drivers/net/failsafe/rte_pmd_failsafe_version.map
index b6d2840be4..f9f17e4f6e 100644
--- a/drivers/net/failsafe/rte_pmd_failsafe_version.map
+++ b/drivers/net/failsafe/rte_pmd_failsafe_version.map
@@ -1,4 +1,3 @@
-DPDK_17.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/fm10k/rte_pmd_fm10k_version.map b/drivers/net/fm10k/rte_pmd_fm10k_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/fm10k/rte_pmd_fm10k_version.map
+++ b/drivers/net/fm10k/rte_pmd_fm10k_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/hinic/rte_pmd_hinic_version.map b/drivers/net/hinic/rte_pmd_hinic_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/net/hinic/rte_pmd_hinic_version.map
+++ b/drivers/net/hinic/rte_pmd_hinic_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/hns3/rte_pmd_hns3_version.map b/drivers/net/hns3/rte_pmd_hns3_version.map
index 35e5f2debb..f9f17e4f6e 100644
--- a/drivers/net/hns3/rte_pmd_hns3_version.map
+++ b/drivers/net/hns3/rte_pmd_hns3_version.map
@@ -1,3 +1,3 @@
-DPDK_19.11 {
-	 local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index cccd5768c2..a80e69b93e 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -1,23 +1,34 @@
-DPDK_2.0 {
-
-	local: *;
-};
-
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
+	rte_pmd_i40e_add_vf_mac_addr;
+	rte_pmd_i40e_flow_add_del_packet_template;
+	rte_pmd_i40e_flow_type_mapping_get;
+	rte_pmd_i40e_flow_type_mapping_reset;
+	rte_pmd_i40e_flow_type_mapping_update;
+	rte_pmd_i40e_get_ddp_info;
+	rte_pmd_i40e_get_ddp_list;
 	rte_pmd_i40e_get_vf_stats;
+	rte_pmd_i40e_inset_get;
+	rte_pmd_i40e_inset_set;
 	rte_pmd_i40e_ping_vfs;
+	rte_pmd_i40e_process_ddp_package;
 	rte_pmd_i40e_ptype_mapping_get;
 	rte_pmd_i40e_ptype_mapping_replace;
 	rte_pmd_i40e_ptype_mapping_reset;
 	rte_pmd_i40e_ptype_mapping_update;
+	rte_pmd_i40e_query_vfid_by_mac;
 	rte_pmd_i40e_reset_vf_stats;
+	rte_pmd_i40e_rss_queue_region_conf;
+	rte_pmd_i40e_set_tc_strict_prio;
 	rte_pmd_i40e_set_tx_loopback;
 	rte_pmd_i40e_set_vf_broadcast;
 	rte_pmd_i40e_set_vf_mac_addr;
 	rte_pmd_i40e_set_vf_mac_anti_spoof;
+	rte_pmd_i40e_set_vf_max_bw;
 	rte_pmd_i40e_set_vf_multicast_promisc;
+	rte_pmd_i40e_set_vf_tc_bw_alloc;
+	rte_pmd_i40e_set_vf_tc_max_bw;
 	rte_pmd_i40e_set_vf_unicast_promisc;
 	rte_pmd_i40e_set_vf_vlan_anti_spoof;
 	rte_pmd_i40e_set_vf_vlan_filter;
@@ -25,43 +36,5 @@ DPDK_17.02 {
 	rte_pmd_i40e_set_vf_vlan_stripq;
 	rte_pmd_i40e_set_vf_vlan_tag;
 
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_pmd_i40e_set_tc_strict_prio;
-	rte_pmd_i40e_set_vf_max_bw;
-	rte_pmd_i40e_set_vf_tc_bw_alloc;
-	rte_pmd_i40e_set_vf_tc_max_bw;
-	rte_pmd_i40e_process_ddp_package;
-	rte_pmd_i40e_get_ddp_list;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_pmd_i40e_get_ddp_info;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_pmd_i40e_add_vf_mac_addr;
-	rte_pmd_i40e_flow_add_del_packet_template;
-	rte_pmd_i40e_flow_type_mapping_update;
-	rte_pmd_i40e_flow_type_mapping_get;
-	rte_pmd_i40e_flow_type_mapping_reset;
-	rte_pmd_i40e_query_vfid_by_mac;
-	rte_pmd_i40e_rss_queue_region_conf;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_pmd_i40e_inset_get;
-	rte_pmd_i40e_inset_set;
-} DPDK_17.11;
\ No newline at end of file
+	local: *;
+};
diff --git a/drivers/net/iavf/rte_pmd_iavf_version.map b/drivers/net/iavf/rte_pmd_iavf_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/net/iavf/rte_pmd_iavf_version.map
+++ b/drivers/net/iavf/rte_pmd_iavf_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ice/rte_pmd_ice_version.map b/drivers/net/ice/rte_pmd_ice_version.map
index 7b23b609da..f9f17e4f6e 100644
--- a/drivers/net/ice/rte_pmd_ice_version.map
+++ b/drivers/net/ice/rte_pmd_ice_version.map
@@ -1,4 +1,3 @@
-DPDK_19.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ifc/rte_pmd_ifc_version.map b/drivers/net/ifc/rte_pmd_ifc_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/net/ifc/rte_pmd_ifc_version.map
+++ b/drivers/net/ifc/rte_pmd_ifc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map b/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
index fc8c95e919..f9f17e4f6e 100644
--- a/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
+++ b/drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map
@@ -1,4 +1,3 @@
-DPDK_19.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
index c814f96d72..21534dbc3d 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe_version.map
@@ -1,57 +1,39 @@
-DPDK_2.0 {
-
-	local: *;
-};
-
-DPDK_16.11 {
-	global:
-
-	rte_pmd_ixgbe_set_all_queues_drop_en;
-	rte_pmd_ixgbe_set_tx_loopback;
-	rte_pmd_ixgbe_set_vf_mac_addr;
-	rte_pmd_ixgbe_set_vf_mac_anti_spoof;
-	rte_pmd_ixgbe_set_vf_split_drop_en;
-	rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
-	rte_pmd_ixgbe_set_vf_vlan_insert;
-	rte_pmd_ixgbe_set_vf_vlan_stripq;
-} DPDK_2.0;
-
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
+	rte_pmd_ixgbe_bypass_event_show;
+	rte_pmd_ixgbe_bypass_event_store;
+	rte_pmd_ixgbe_bypass_init;
+	rte_pmd_ixgbe_bypass_state_set;
+	rte_pmd_ixgbe_bypass_state_show;
+	rte_pmd_ixgbe_bypass_ver_show;
+	rte_pmd_ixgbe_bypass_wd_reset;
+	rte_pmd_ixgbe_bypass_wd_timeout_show;
+	rte_pmd_ixgbe_bypass_wd_timeout_store;
 	rte_pmd_ixgbe_macsec_config_rxsc;
 	rte_pmd_ixgbe_macsec_config_txsc;
 	rte_pmd_ixgbe_macsec_disable;
 	rte_pmd_ixgbe_macsec_enable;
 	rte_pmd_ixgbe_macsec_select_rxsa;
 	rte_pmd_ixgbe_macsec_select_txsa;
+	rte_pmd_ixgbe_ping_vf;
+	rte_pmd_ixgbe_set_all_queues_drop_en;
+	rte_pmd_ixgbe_set_tc_bw_alloc;
+	rte_pmd_ixgbe_set_tx_loopback;
+	rte_pmd_ixgbe_set_vf_mac_addr;
+	rte_pmd_ixgbe_set_vf_mac_anti_spoof;
 	rte_pmd_ixgbe_set_vf_rate_limit;
 	rte_pmd_ixgbe_set_vf_rx;
 	rte_pmd_ixgbe_set_vf_rxmode;
+	rte_pmd_ixgbe_set_vf_split_drop_en;
 	rte_pmd_ixgbe_set_vf_tx;
+	rte_pmd_ixgbe_set_vf_vlan_anti_spoof;
 	rte_pmd_ixgbe_set_vf_vlan_filter;
-} DPDK_16.11;
+	rte_pmd_ixgbe_set_vf_vlan_insert;
+	rte_pmd_ixgbe_set_vf_vlan_stripq;
 
-DPDK_17.05 {
-	global:
-
-	rte_pmd_ixgbe_ping_vf;
-	rte_pmd_ixgbe_set_tc_bw_alloc;
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_pmd_ixgbe_bypass_event_show;
-	rte_pmd_ixgbe_bypass_event_store;
-	rte_pmd_ixgbe_bypass_init;
-	rte_pmd_ixgbe_bypass_state_set;
-	rte_pmd_ixgbe_bypass_state_show;
-	rte_pmd_ixgbe_bypass_ver_show;
-	rte_pmd_ixgbe_bypass_wd_reset;
-	rte_pmd_ixgbe_bypass_wd_timeout_show;
-	rte_pmd_ixgbe_bypass_wd_timeout_store;
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/drivers/net/kni/rte_pmd_kni_version.map b/drivers/net/kni/rte_pmd_kni_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/net/kni/rte_pmd_kni_version.map
+++ b/drivers/net/kni/rte_pmd_kni_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/liquidio/rte_pmd_liquidio_version.map b/drivers/net/liquidio/rte_pmd_liquidio_version.map
index 8591cc0b18..f9f17e4f6e 100644
--- a/drivers/net/liquidio/rte_pmd_liquidio_version.map
+++ b/drivers/net/liquidio/rte_pmd_liquidio_version.map
@@ -1,4 +1,3 @@
-DPDK_17.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/memif/rte_pmd_memif_version.map b/drivers/net/memif/rte_pmd_memif_version.map
index 8861484fb3..f9f17e4f6e 100644
--- a/drivers/net/memif/rte_pmd_memif_version.map
+++ b/drivers/net/memif/rte_pmd_memif_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
-        local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/net/mlx4/rte_pmd_mlx4_version.map b/drivers/net/mlx4/rte_pmd_mlx4_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/mlx4/rte_pmd_mlx4_version.map
+++ b/drivers/net/mlx4/rte_pmd_mlx4_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mlx5/rte_pmd_mlx5_version.map b/drivers/net/mlx5/rte_pmd_mlx5_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/mlx5/rte_pmd_mlx5_version.map
+++ b/drivers/net/mlx5/rte_pmd_mlx5_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mvneta/rte_pmd_mvneta_version.map b/drivers/net/mvneta/rte_pmd_mvneta_version.map
index 24bd5cdb35..f9f17e4f6e 100644
--- a/drivers/net/mvneta/rte_pmd_mvneta_version.map
+++ b/drivers/net/mvneta/rte_pmd_mvneta_version.map
@@ -1,3 +1,3 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/mvpp2/rte_pmd_mvpp2_version.map b/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
index a753031720..f9f17e4f6e 100644
--- a/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
+++ b/drivers/net/mvpp2/rte_pmd_mvpp2_version.map
@@ -1,3 +1,3 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/netvsc/rte_pmd_netvsc_version.map b/drivers/net/netvsc/rte_pmd_netvsc_version.map
index d534019a6b..f9f17e4f6e 100644
--- a/drivers/net/netvsc/rte_pmd_netvsc_version.map
+++ b/drivers/net/netvsc/rte_pmd_netvsc_version.map
@@ -1,5 +1,3 @@
-/* SPDX-License-Identifier: BSD-3-Clause */
-
-DPDK_18.08 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/nfb/rte_pmd_nfb_version.map b/drivers/net/nfb/rte_pmd_nfb_version.map
index fc8c95e919..f9f17e4f6e 100644
--- a/drivers/net/nfb/rte_pmd_nfb_version.map
+++ b/drivers/net/nfb/rte_pmd_nfb_version.map
@@ -1,4 +1,3 @@
-DPDK_19.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/nfp/rte_pmd_nfp_version.map b/drivers/net/nfp/rte_pmd_nfp_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/nfp/rte_pmd_nfp_version.map
+++ b/drivers/net/nfp/rte_pmd_nfp_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/null/rte_pmd_null_version.map b/drivers/net/null/rte_pmd_null_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/null/rte_pmd_null_version.map
+++ b/drivers/net/null/rte_pmd_null_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/octeontx/rte_pmd_octeontx_version.map b/drivers/net/octeontx/rte_pmd_octeontx_version.map
index a3161b14d0..f7cae02fac 100644
--- a/drivers/net/octeontx/rte_pmd_octeontx_version.map
+++ b/drivers/net/octeontx/rte_pmd_octeontx_version.map
@@ -1,11 +1,7 @@
-DPDK_17.11 {
-
-	local: *;
-};
-
-DPDK_18.02 {
+DPDK_20.0 {
 	global:
 
 	rte_octeontx_pchan_map;
 
-} DPDK_17.11;
+	local: *;
+};
diff --git a/drivers/net/octeontx2/rte_pmd_octeontx2_version.map b/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
+++ b/drivers/net/octeontx2/rte_pmd_octeontx2_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/pcap/rte_pmd_pcap_version.map b/drivers/net/pcap/rte_pmd_pcap_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/pcap/rte_pmd_pcap_version.map
+++ b/drivers/net/pcap/rte_pmd_pcap_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/pfe/rte_pmd_pfe_version.map b/drivers/net/pfe/rte_pmd_pfe_version.map
index b7b7c91683..f9f17e4f6e 100644
--- a/drivers/net/pfe/rte_pmd_pfe_version.map
+++ b/drivers/net/pfe/rte_pmd_pfe_version.map
@@ -1,4 +1,3 @@
-DPDK_19.11 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/qede/rte_pmd_qede_version.map b/drivers/net/qede/rte_pmd_qede_version.map
index 349c6e1c22..f9f17e4f6e 100644
--- a/drivers/net/qede/rte_pmd_qede_version.map
+++ b/drivers/net/qede/rte_pmd_qede_version.map
@@ -1,4 +1,3 @@
-DPDK_16.04 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/ring/rte_pmd_ring_version.map b/drivers/net/ring/rte_pmd_ring_version.map
index 1f785d9409..ebb6be2733 100644
--- a/drivers/net/ring/rte_pmd_ring_version.map
+++ b/drivers/net/ring/rte_pmd_ring_version.map
@@ -1,14 +1,8 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_eth_from_ring;
 	rte_eth_from_rings;
 
 	local: *;
 };
-
-DPDK_2.2 {
-	global:
-
-	rte_eth_from_ring;
-
-} DPDK_2.0;
diff --git a/drivers/net/sfc/rte_pmd_sfc_version.map b/drivers/net/sfc/rte_pmd_sfc_version.map
index 31eca32ebe..f9f17e4f6e 100644
--- a/drivers/net/sfc/rte_pmd_sfc_version.map
+++ b/drivers/net/sfc/rte_pmd_sfc_version.map
@@ -1,4 +1,3 @@
-DPDK_17.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/softnic/rte_pmd_softnic_version.map b/drivers/net/softnic/rte_pmd_softnic_version.map
index bc44b06f98..50f113d5a2 100644
--- a/drivers/net/softnic/rte_pmd_softnic_version.map
+++ b/drivers/net/softnic/rte_pmd_softnic_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_pmd_softnic_run;
diff --git a/drivers/net/szedata2/rte_pmd_szedata2_version.map b/drivers/net/szedata2/rte_pmd_szedata2_version.map
index ad607bbedd..f9f17e4f6e 100644
--- a/drivers/net/szedata2/rte_pmd_szedata2_version.map
+++ b/drivers/net/szedata2/rte_pmd_szedata2_version.map
@@ -1,3 +1,3 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/tap/rte_pmd_tap_version.map b/drivers/net/tap/rte_pmd_tap_version.map
index 31eca32ebe..f9f17e4f6e 100644
--- a/drivers/net/tap/rte_pmd_tap_version.map
+++ b/drivers/net/tap/rte_pmd_tap_version.map
@@ -1,4 +1,3 @@
-DPDK_17.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/thunderx/rte_pmd_thunderx_version.map b/drivers/net/thunderx/rte_pmd_thunderx_version.map
index 1901bcb3b3..f9f17e4f6e 100644
--- a/drivers/net/thunderx/rte_pmd_thunderx_version.map
+++ b/drivers/net/thunderx/rte_pmd_thunderx_version.map
@@ -1,4 +1,3 @@
-DPDK_16.07 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map b/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
+++ b/drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vhost/rte_pmd_vhost_version.map b/drivers/net/vhost/rte_pmd_vhost_version.map
index 695db85749..16b591ccc4 100644
--- a/drivers/net/vhost/rte_pmd_vhost_version.map
+++ b/drivers/net/vhost/rte_pmd_vhost_version.map
@@ -1,13 +1,8 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	global:
 
 	rte_eth_vhost_get_queue_event;
-
-	local: *;
-};
-
-DPDK_16.11 {
-	global:
-
 	rte_eth_vhost_get_vid_from_port_id;
+
+	local: *;
 };
diff --git a/drivers/net/virtio/rte_pmd_virtio_version.map b/drivers/net/virtio/rte_pmd_virtio_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/virtio/rte_pmd_virtio_version.map
+++ b/drivers/net/virtio/rte_pmd_virtio_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map b/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
index ef35398402..f9f17e4f6e 100644
--- a/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
+++ b/drivers/net/vmxnet3/rte_pmd_vmxnet3_version.map
@@ -1,4 +1,3 @@
-DPDK_2.0 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map b/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
+++ b/drivers/raw/dpaa2_cmdif/rte_rawdev_dpaa2_cmdif_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map b/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
index d16a136fc8..ca6a0d7626 100644
--- a/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
+++ b/drivers/raw/dpaa2_qdma/rte_rawdev_dpaa2_qdma_version.map
@@ -1,4 +1,4 @@
-DPDK_19.05 {
+DPDK_20.0 {
 	global:
 
 	rte_qdma_attr_get;
@@ -9,9 +9,9 @@ DPDK_19.05 {
 	rte_qdma_start;
 	rte_qdma_stop;
 	rte_qdma_vq_create;
-	rte_qdma_vq_destroy;
 	rte_qdma_vq_dequeue;
 	rte_qdma_vq_dequeue_multi;
+	rte_qdma_vq_destroy;
 	rte_qdma_vq_enqueue;
 	rte_qdma_vq_enqueue_multi;
 	rte_qdma_vq_stats;
diff --git a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
index 9b9ab1a4cf..f9f17e4f6e 100644
--- a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
+++ b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
@@ -1,4 +1,3 @@
-DPDK_18.05 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/ioat/rte_rawdev_ioat_version.map b/drivers/raw/ioat/rte_rawdev_ioat_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/raw/ioat/rte_rawdev_ioat_version.map
+++ b/drivers/raw/ioat/rte_rawdev_ioat_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/ntb/rte_rawdev_ntb_version.map b/drivers/raw/ntb/rte_rawdev_ntb_version.map
index 8861484fb3..f9f17e4f6e 100644
--- a/drivers/raw/ntb/rte_rawdev_ntb_version.map
+++ b/drivers/raw/ntb/rte_rawdev_ntb_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
-        local: *;
+DPDK_20.0 {
+	local: *;
 };
diff --git a/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map b/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
index 9a61188cd5..f9f17e4f6e 100644
--- a/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
+++ b/drivers/raw/octeontx2_dma/rte_rawdev_octeontx2_dma_version.map
@@ -1,4 +1,3 @@
-DPDK_19.08 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/drivers/raw/skeleton/rte_rawdev_skeleton_version.map b/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
index 179140fb87..f9f17e4f6e 100644
--- a/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
+++ b/drivers/raw/skeleton/rte_rawdev_skeleton_version.map
@@ -1,4 +1,3 @@
-DPDK_18.02 {
-
+DPDK_20.0 {
 	local: *;
 };
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
index b09370a104..c3daca8115 100644
--- a/lib/librte_acl/rte_acl_version.map
+++ b/lib/librte_acl/rte_acl_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_acl_add_rules;
diff --git a/lib/librte_bitratestats/rte_bitratestats_version.map b/lib/librte_bitratestats/rte_bitratestats_version.map
index fe7454452d..88fc2912db 100644
--- a/lib/librte_bitratestats/rte_bitratestats_version.map
+++ b/lib/librte_bitratestats/rte_bitratestats_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_stats_bitrate_calc;
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
index a0a11cea8d..906eee96bf 100644
--- a/lib/librte_cfgfile/rte_cfgfile_version.map
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -1,40 +1,22 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_cfgfile_add_entry;
+	rte_cfgfile_add_section;
 	rte_cfgfile_close;
+	rte_cfgfile_create;
 	rte_cfgfile_get_entry;
 	rte_cfgfile_has_entry;
 	rte_cfgfile_has_section;
 	rte_cfgfile_load;
+	rte_cfgfile_load_with_params;
 	rte_cfgfile_num_sections;
+	rte_cfgfile_save;
 	rte_cfgfile_section_entries;
+	rte_cfgfile_section_entries_by_index;
 	rte_cfgfile_section_num_entries;
 	rte_cfgfile_sections;
+	rte_cfgfile_set_entry;
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_cfgfile_section_entries_by_index;
-
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_cfgfile_load_with_params;
-
-} DPDK_16.04;
-
-DPDK_17.11 {
-	global:
-
-	rte_cfgfile_add_entry;
-	rte_cfgfile_add_section;
-	rte_cfgfile_create;
-	rte_cfgfile_save;
-	rte_cfgfile_set_entry;
-
-} DPDK_17.05;
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
index 04bcb387f2..95fce812ff 100644
--- a/lib/librte_cmdline/rte_cmdline_version.map
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	cirbuf_add_buf_head;
@@ -40,6 +40,7 @@ DPDK_2.0 {
 	cmdline_parse_num;
 	cmdline_parse_portlist;
 	cmdline_parse_string;
+	cmdline_poll;
 	cmdline_printf;
 	cmdline_quit;
 	cmdline_set_prompt;
@@ -68,10 +69,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_2.1 {
-	global:
-
-	cmdline_poll;
-
-} DPDK_2.0;
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 3deb265ac2..1dd1e259a0 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -1,92 +1,62 @@
-DPDK_16.04 {
+DPDK_20.0 {
 	global:
 
-	rte_cryptodevs;
+	rte_crypto_aead_algorithm_strings;
+	rte_crypto_aead_operation_strings;
+	rte_crypto_auth_algorithm_strings;
+	rte_crypto_auth_operation_strings;
+	rte_crypto_cipher_algorithm_strings;
+	rte_crypto_cipher_operation_strings;
+	rte_crypto_op_pool_create;
+	rte_cryptodev_allocate_driver;
 	rte_cryptodev_callback_register;
 	rte_cryptodev_callback_unregister;
 	rte_cryptodev_close;
-	rte_cryptodev_count;
 	rte_cryptodev_configure;
+	rte_cryptodev_count;
+	rte_cryptodev_device_count_by_driver;
+	rte_cryptodev_devices_get;
+	rte_cryptodev_driver_id_get;
+	rte_cryptodev_driver_name_get;
+	rte_cryptodev_get_aead_algo_enum;
+	rte_cryptodev_get_auth_algo_enum;
+	rte_cryptodev_get_cipher_algo_enum;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
+	rte_cryptodev_get_sec_ctx;
 	rte_cryptodev_info_get;
+	rte_cryptodev_name_get;
 	rte_cryptodev_pmd_allocate;
 	rte_cryptodev_pmd_callback_process;
+	rte_cryptodev_pmd_create;
+	rte_cryptodev_pmd_create_dev_name;
+	rte_cryptodev_pmd_destroy;
+	rte_cryptodev_pmd_get_dev;
+	rte_cryptodev_pmd_get_named_dev;
+	rte_cryptodev_pmd_is_valid_dev;
+	rte_cryptodev_pmd_parse_input_args;
 	rte_cryptodev_pmd_release_device;
-	rte_cryptodev_sym_session_create;
-	rte_cryptodev_sym_session_free;
+	rte_cryptodev_queue_pair_count;
+	rte_cryptodev_queue_pair_setup;
 	rte_cryptodev_socket_id;
 	rte_cryptodev_start;
 	rte_cryptodev_stats_get;
 	rte_cryptodev_stats_reset;
 	rte_cryptodev_stop;
-	rte_cryptodev_queue_pair_count;
-	rte_cryptodev_queue_pair_setup;
-	rte_crypto_op_pool_create;
-
-	local: *;
-};
-
-DPDK_17.02 {
-	global:
-
-	rte_cryptodev_devices_get;
-	rte_cryptodev_pmd_create_dev_name;
-	rte_cryptodev_pmd_get_dev;
-	rte_cryptodev_pmd_get_named_dev;
-	rte_cryptodev_pmd_is_valid_dev;
+	rte_cryptodev_sym_capability_check_aead;
 	rte_cryptodev_sym_capability_check_auth;
 	rte_cryptodev_sym_capability_check_cipher;
 	rte_cryptodev_sym_capability_get;
-	rte_crypto_auth_algorithm_strings;
-	rte_crypto_auth_operation_strings;
-	rte_crypto_cipher_algorithm_strings;
-	rte_crypto_cipher_operation_strings;
-
-} DPDK_16.04;
-
-DPDK_17.05 {
-	global:
-
-	rte_cryptodev_get_auth_algo_enum;
-	rte_cryptodev_get_cipher_algo_enum;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_cryptodev_allocate_driver;
-	rte_cryptodev_device_count_by_driver;
-	rte_cryptodev_driver_id_get;
-	rte_cryptodev_driver_name_get;
-	rte_cryptodev_get_aead_algo_enum;
-	rte_cryptodev_sym_capability_check_aead;
-	rte_cryptodev_sym_session_init;
-	rte_cryptodev_sym_session_clear;
-	rte_crypto_aead_algorithm_strings;
-	rte_crypto_aead_operation_strings;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_cryptodev_get_sec_ctx;
-	rte_cryptodev_name_get;
-	rte_cryptodev_pmd_create;
-	rte_cryptodev_pmd_destroy;
-	rte_cryptodev_pmd_parse_input_args;
-
-} DPDK_17.08;
-
-DPDK_18.05 {
-	global:
-
 	rte_cryptodev_sym_get_header_session_size;
 	rte_cryptodev_sym_get_private_session_size;
+	rte_cryptodev_sym_session_clear;
+	rte_cryptodev_sym_session_create;
+	rte_cryptodev_sym_session_free;
+	rte_cryptodev_sym_session_init;
+	rte_cryptodevs;
 
-} DPDK_17.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
index 00e26b4804..1b7c643005 100644
--- a/lib/librte_distributor/rte_distributor_version.map
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_distributor_clear_returns;
@@ -10,4 +10,6 @@ DPDK_17.05 {
 	rte_distributor_request_pkt;
 	rte_distributor_return_pkt;
 	rte_distributor_returned_pkts;
+
+	local: *;
 };
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index 3478d3b852..8cfe6ca07e 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	__rte_panic;
@@ -6,44 +6,113 @@ DPDK_2.0 {
 	eal_timer_source;
 	per_lcore__lcore_id;
 	per_lcore__rte_errno;
+	rte_bus_dump;
+	rte_bus_find;
+	rte_bus_find_by_device;
+	rte_bus_find_by_name;
+	rte_bus_get_iommu_class;
+	rte_bus_probe;
+	rte_bus_register;
+	rte_bus_scan;
+	rte_bus_unregister;
 	rte_calloc;
 	rte_calloc_socket;
 	rte_cpu_get_flag_enabled;
+	rte_cpu_get_flag_name;
+	rte_cpu_is_supported;
+	rte_ctrl_thread_create;
 	rte_cycles_vmware_tsc_map;
 	rte_delay_us;
+	rte_delay_us_block;
+	rte_delay_us_callback_register;
+	rte_dev_is_probed;
+	rte_dev_probe;
+	rte_dev_remove;
+	rte_devargs_add;
+	rte_devargs_dump;
+	rte_devargs_insert;
+	rte_devargs_next;
+	rte_devargs_parse;
+	rte_devargs_parsef;
+	rte_devargs_remove;
+	rte_devargs_type_count;
 	rte_dump_physmem_layout;
 	rte_dump_registers;
 	rte_dump_stack;
 	rte_dump_tailq;
 	rte_eal_alarm_cancel;
 	rte_eal_alarm_set;
+	rte_eal_cleanup;
+	rte_eal_create_uio_dev;
 	rte_eal_get_lcore_state;
 	rte_eal_get_physmem_size;
+	rte_eal_get_runtime_dir;
 	rte_eal_has_hugepages;
+	rte_eal_has_pci;
+	rte_eal_hotplug_add;
+	rte_eal_hotplug_remove;
 	rte_eal_hpet_init;
 	rte_eal_init;
 	rte_eal_iopl_init;
+	rte_eal_iova_mode;
 	rte_eal_lcore_role;
+	rte_eal_mbuf_user_pool_ops;
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
+	rte_eal_primary_proc_alive;
 	rte_eal_process_type;
 	rte_eal_remote_launch;
 	rte_eal_tailq_lookup;
 	rte_eal_tailq_register;
+	rte_eal_using_phys_addrs;
+	rte_eal_vfio_intr_mode;
 	rte_eal_wait_lcore;
+	rte_epoll_ctl;
+	rte_epoll_wait;
 	rte_exit;
 	rte_free;
 	rte_get_hpet_cycles;
 	rte_get_hpet_hz;
+	rte_get_master_lcore;
+	rte_get_next_lcore;
 	rte_get_tsc_hz;
 	rte_hexdump;
+	rte_hypervisor_get;
+	rte_hypervisor_get_name;
+	rte_intr_allow_others;
 	rte_intr_callback_register;
 	rte_intr_callback_unregister;
+	rte_intr_cap_multiple;
 	rte_intr_disable;
+	rte_intr_dp_is_en;
+	rte_intr_efd_disable;
+	rte_intr_efd_enable;
 	rte_intr_enable;
+	rte_intr_free_epoll_fd;
+	rte_intr_rx_ctl;
+	rte_intr_tls_epfd;
+	rte_keepalive_create;
+	rte_keepalive_dispatch_pings;
+	rte_keepalive_mark_alive;
+	rte_keepalive_mark_sleep;
+	rte_keepalive_register_core;
+	rte_keepalive_register_relay_callback;
+	rte_lcore_count;
+	rte_lcore_has_role;
+	rte_lcore_index;
+	rte_lcore_is_enabled;
+	rte_lcore_to_socket_id;
 	rte_log;
 	rte_log_cur_msg_loglevel;
 	rte_log_cur_msg_logtype;
+	rte_log_dump;
+	rte_log_get_global_level;
+	rte_log_get_level;
+	rte_log_register;
+	rte_log_set_global_level;
+	rte_log_set_level;
+	rte_log_set_level_pattern;
+	rte_log_set_level_regexp;
 	rte_logs;
 	rte_malloc;
 	rte_malloc_dump_stats;
@@ -51,155 +120,38 @@ DPDK_2.0 {
 	rte_malloc_set_limit;
 	rte_malloc_socket;
 	rte_malloc_validate;
+	rte_malloc_virt2iova;
+	rte_mcfg_mem_read_lock;
+	rte_mcfg_mem_read_unlock;
+	rte_mcfg_mem_write_lock;
+	rte_mcfg_mem_write_unlock;
+	rte_mcfg_mempool_read_lock;
+	rte_mcfg_mempool_read_unlock;
+	rte_mcfg_mempool_write_lock;
+	rte_mcfg_mempool_write_unlock;
+	rte_mcfg_tailq_read_lock;
+	rte_mcfg_tailq_read_unlock;
+	rte_mcfg_tailq_write_lock;
+	rte_mcfg_tailq_write_unlock;
 	rte_mem_lock_page;
+	rte_mem_virt2iova;
 	rte_mem_virt2phy;
 	rte_memdump;
 	rte_memory_get_nchannel;
 	rte_memory_get_nrank;
 	rte_memzone_dump;
+	rte_memzone_free;
 	rte_memzone_lookup;
 	rte_memzone_reserve;
 	rte_memzone_reserve_aligned;
 	rte_memzone_reserve_bounded;
 	rte_memzone_walk;
 	rte_openlog_stream;
+	rte_rand;
 	rte_realloc;
-	rte_set_application_usage_hook;
-	rte_socket_id;
-	rte_strerror;
-	rte_strsplit;
-	rte_sys_gettid;
-	rte_thread_get_affinity;
-	rte_thread_set_affinity;
-	rte_vlog;
-	rte_zmalloc;
-	rte_zmalloc_socket;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_epoll_ctl;
-	rte_epoll_wait;
-	rte_intr_allow_others;
-	rte_intr_dp_is_en;
-	rte_intr_efd_disable;
-	rte_intr_efd_enable;
-	rte_intr_rx_ctl;
-	rte_intr_tls_epfd;
-	rte_memzone_free;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
-	rte_intr_cap_multiple;
-	rte_keepalive_create;
-	rte_keepalive_dispatch_pings;
-	rte_keepalive_mark_alive;
-	rte_keepalive_register_core;
-
-} DPDK_2.1;
-
-DPDK_16.04 {
-	global:
-
-	rte_cpu_get_flag_name;
-	rte_eal_primary_proc_alive;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
-	global:
-
-	rte_keepalive_mark_sleep;
-	rte_keepalive_register_relay_callback;
-	rte_rtm_supported;
-	rte_thread_setname;
-
-} DPDK_16.04;
-
-DPDK_16.11 {
-	global:
-
-	rte_delay_us_block;
-	rte_delay_us_callback_register;
-
-} DPDK_16.07;
-
-DPDK_17.02 {
-	global:
-
-	rte_bus_dump;
-	rte_bus_probe;
-	rte_bus_register;
-	rte_bus_scan;
-	rte_bus_unregister;
-
-} DPDK_16.11;
-
-DPDK_17.05 {
-	global:
-
-	rte_cpu_is_supported;
-	rte_intr_free_epoll_fd;
-	rte_log_dump;
-	rte_log_get_global_level;
-	rte_log_register;
-	rte_log_set_global_level;
-	rte_log_set_level;
-	rte_log_set_level_regexp;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	rte_bus_find;
-	rte_bus_find_by_device;
-	rte_bus_find_by_name;
-	rte_log_get_level;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_eal_create_uio_dev;
-	rte_bus_get_iommu_class;
-	rte_eal_has_pci;
-	rte_eal_iova_mode;
-	rte_eal_using_phys_addrs;
-	rte_eal_vfio_intr_mode;
-	rte_lcore_has_role;
-	rte_malloc_virt2iova;
-	rte_mem_virt2iova;
-	rte_vfio_enable;
-	rte_vfio_is_enabled;
-	rte_vfio_noiommu_is_enabled;
-	rte_vfio_release_device;
-	rte_vfio_setup_device;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_hypervisor_get;
-	rte_hypervisor_get_name;
-	rte_vfio_clear_group;
 	rte_reciprocal_value;
 	rte_reciprocal_value_u64;
-
-}  DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_log_set_level_pattern;
+	rte_rtm_supported;
 	rte_service_attr_get;
 	rte_service_attr_reset_all;
 	rte_service_component_register;
@@ -212,6 +164,8 @@ DPDK_18.05 {
 	rte_service_get_count;
 	rte_service_get_name;
 	rte_service_lcore_add;
+	rte_service_lcore_attr_get;
+	rte_service_lcore_attr_reset_all;
 	rte_service_lcore_count;
 	rte_service_lcore_count_services;
 	rte_service_lcore_del;
@@ -221,6 +175,7 @@ DPDK_18.05 {
 	rte_service_lcore_stop;
 	rte_service_map_lcore_get;
 	rte_service_map_lcore_set;
+	rte_service_may_be_active;
 	rte_service_probe_capability;
 	rte_service_run_iter_on_app_lcore;
 	rte_service_runstate_get;
@@ -228,17 +183,23 @@ DPDK_18.05 {
 	rte_service_set_runstate_mapped_check;
 	rte_service_set_stats_enable;
 	rte_service_start_with_defaults;
-
-} DPDK_18.02;
-
-DPDK_18.08 {
-	global:
-
-	rte_eal_mbuf_user_pool_ops;
+	rte_set_application_usage_hook;
+	rte_socket_count;
+	rte_socket_id;
+	rte_socket_id_by_idx;
+	rte_srand;
+	rte_strerror;
+	rte_strscpy;
+	rte_strsplit;
+	rte_sys_gettid;
+	rte_thread_get_affinity;
+	rte_thread_set_affinity;
+	rte_thread_setname;
 	rte_uuid_compare;
 	rte_uuid_is_null;
 	rte_uuid_parse;
 	rte_uuid_unparse;
+	rte_vfio_clear_group;
 	rte_vfio_container_create;
 	rte_vfio_container_destroy;
 	rte_vfio_container_dma_map;
@@ -247,77 +208,20 @@ DPDK_18.08 {
 	rte_vfio_container_group_unbind;
 	rte_vfio_dma_map;
 	rte_vfio_dma_unmap;
+	rte_vfio_enable;
 	rte_vfio_get_container_fd;
 	rte_vfio_get_group_fd;
 	rte_vfio_get_group_num;
-
-} DPDK_18.05;
-
-DPDK_18.11 {
-	global:
-
-	rte_dev_probe;
-	rte_dev_remove;
-	rte_eal_get_runtime_dir;
-	rte_eal_hotplug_add;
-	rte_eal_hotplug_remove;
-	rte_strscpy;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	rte_ctrl_thread_create;
-	rte_dev_is_probed;
-	rte_devargs_add;
-	rte_devargs_dump;
-	rte_devargs_insert;
-	rte_devargs_next;
-	rte_devargs_parse;
-	rte_devargs_parsef;
-	rte_devargs_remove;
-	rte_devargs_type_count;
-	rte_eal_cleanup;
-	rte_socket_count;
-	rte_socket_id_by_idx;
-
-} DPDK_18.11;
-
-DPDK_19.08 {
-	global:
-
-	rte_lcore_index;
-	rte_lcore_to_socket_id;
-	rte_mcfg_mem_read_lock;
-	rte_mcfg_mem_read_unlock;
-	rte_mcfg_mem_write_lock;
-	rte_mcfg_mem_write_unlock;
-	rte_mcfg_mempool_read_lock;
-	rte_mcfg_mempool_read_unlock;
-	rte_mcfg_mempool_write_lock;
-	rte_mcfg_mempool_write_unlock;
-	rte_mcfg_tailq_read_lock;
-	rte_mcfg_tailq_read_unlock;
-	rte_mcfg_tailq_write_lock;
-	rte_mcfg_tailq_write_unlock;
-	rte_rand;
-	rte_service_lcore_attr_get;
-	rte_service_lcore_attr_reset_all;
-	rte_service_may_be_active;
-	rte_srand;
-
-} DPDK_19.05;
-
-DPDK_19.11 {
-	global:
-
-	rte_get_master_lcore;
-	rte_get_next_lcore;
-	rte_lcore_count;
-	rte_lcore_is_enabled;
-
-} DPDK_19.08;
+	rte_vfio_is_enabled;
+	rte_vfio_noiommu_is_enabled;
+	rte_vfio_release_device;
+	rte_vfio_setup_device;
+	rte_vlog;
+	rte_zmalloc;
+	rte_zmalloc_socket;
+
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_efd/rte_efd_version.map b/lib/librte_efd/rte_efd_version.map
index ae60a64178..e010eecfe4 100644
--- a/lib/librte_efd/rte_efd_version.map
+++ b/lib/librte_efd/rte_efd_version.map
@@ -1,4 +1,4 @@
-DPDK_17.02 {
+DPDK_20.0 {
 	global:
 
 	rte_efd_create;
diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map
index e59d51648f..28819c1bb7 100644
--- a/lib/librte_ethdev/rte_ethdev_version.map
+++ b/lib/librte_ethdev/rte_ethdev_version.map
@@ -1,35 +1,53 @@
-DPDK_2.2 {
+DPDK_20.0 {
 	global:
 
+	_rte_eth_dev_callback_process;
+	_rte_eth_dev_reset;
+	rte_eth_add_first_rx_callback;
 	rte_eth_add_rx_callback;
 	rte_eth_add_tx_callback;
 	rte_eth_allmulticast_disable;
 	rte_eth_allmulticast_enable;
 	rte_eth_allmulticast_get;
+	rte_eth_dev_adjust_nb_rx_tx_desc;
 	rte_eth_dev_allocate;
 	rte_eth_dev_allocated;
+	rte_eth_dev_attach_secondary;
 	rte_eth_dev_callback_register;
 	rte_eth_dev_callback_unregister;
 	rte_eth_dev_close;
 	rte_eth_dev_configure;
 	rte_eth_dev_count;
+	rte_eth_dev_count_avail;
+	rte_eth_dev_count_total;
 	rte_eth_dev_default_mac_addr_set;
+	rte_eth_dev_filter_ctrl;
 	rte_eth_dev_filter_supported;
 	rte_eth_dev_flow_ctrl_get;
 	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_fw_version_get;
 	rte_eth_dev_get_dcb_info;
 	rte_eth_dev_get_eeprom;
 	rte_eth_dev_get_eeprom_length;
 	rte_eth_dev_get_mtu;
+	rte_eth_dev_get_name_by_port;
+	rte_eth_dev_get_port_by_name;
 	rte_eth_dev_get_reg_info;
+	rte_eth_dev_get_sec_ctx;
+	rte_eth_dev_get_supported_ptypes;
 	rte_eth_dev_get_vlan_offload;
-	rte_eth_devices;
 	rte_eth_dev_info_get;
 	rte_eth_dev_is_valid_port;
+	rte_eth_dev_l2_tunnel_eth_type_conf;
+	rte_eth_dev_l2_tunnel_offload_set;
+	rte_eth_dev_logtype;
 	rte_eth_dev_mac_addr_add;
 	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_pool_ops_supported;
 	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_probing_finish;
 	rte_eth_dev_release_port;
+	rte_eth_dev_reset;
 	rte_eth_dev_rss_hash_conf_get;
 	rte_eth_dev_rss_hash_update;
 	rte_eth_dev_rss_reta_query;
@@ -38,6 +56,7 @@ DPDK_2.2 {
 	rte_eth_dev_rx_intr_ctl_q;
 	rte_eth_dev_rx_intr_disable;
 	rte_eth_dev_rx_intr_enable;
+	rte_eth_dev_rx_offload_name;
 	rte_eth_dev_rx_queue_start;
 	rte_eth_dev_rx_queue_stop;
 	rte_eth_dev_set_eeprom;
@@ -47,18 +66,28 @@ DPDK_2.2 {
 	rte_eth_dev_set_mtu;
 	rte_eth_dev_set_rx_queue_stats_mapping;
 	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_vlan_ether_type;
 	rte_eth_dev_set_vlan_offload;
 	rte_eth_dev_set_vlan_pvid;
 	rte_eth_dev_set_vlan_strip_on_queue;
 	rte_eth_dev_socket_id;
 	rte_eth_dev_start;
 	rte_eth_dev_stop;
+	rte_eth_dev_tx_offload_name;
 	rte_eth_dev_tx_queue_start;
 	rte_eth_dev_tx_queue_stop;
 	rte_eth_dev_uc_all_hash_table_set;
 	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_udp_tunnel_port_add;
+	rte_eth_dev_udp_tunnel_port_delete;
 	rte_eth_dev_vlan_filter;
+	rte_eth_devices;
 	rte_eth_dma_zone_reserve;
+	rte_eth_find_next;
+	rte_eth_find_next_owned_by;
+	rte_eth_iterator_cleanup;
+	rte_eth_iterator_init;
+	rte_eth_iterator_next;
 	rte_eth_led_off;
 	rte_eth_led_on;
 	rte_eth_link;
@@ -75,6 +104,7 @@ DPDK_2.2 {
 	rte_eth_rx_queue_info_get;
 	rte_eth_rx_queue_setup;
 	rte_eth_set_queue_rate_limit;
+	rte_eth_speed_bitflag;
 	rte_eth_stats;
 	rte_eth_stats_get;
 	rte_eth_stats_reset;
@@ -85,66 +115,27 @@ DPDK_2.2 {
 	rte_eth_timesync_read_time;
 	rte_eth_timesync_read_tx_timestamp;
 	rte_eth_timesync_write_time;
-	rte_eth_tx_queue_info_get;
-	rte_eth_tx_queue_setup;
-	rte_eth_xstats_get;
-	rte_eth_xstats_reset;
-
-	local: *;
-};
-
-DPDK_16.04 {
-	global:
-
-	rte_eth_dev_get_supported_ptypes;
-	rte_eth_dev_l2_tunnel_eth_type_conf;
-	rte_eth_dev_l2_tunnel_offload_set;
-	rte_eth_dev_set_vlan_ether_type;
-	rte_eth_dev_udp_tunnel_port_add;
-	rte_eth_dev_udp_tunnel_port_delete;
-	rte_eth_speed_bitflag;
 	rte_eth_tx_buffer_count_callback;
 	rte_eth_tx_buffer_drop_callback;
 	rte_eth_tx_buffer_init;
 	rte_eth_tx_buffer_set_err_callback;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
-	global:
-
-	rte_eth_add_first_rx_callback;
-	rte_eth_dev_get_name_by_port;
-	rte_eth_dev_get_port_by_name;
-	rte_eth_xstats_get_names;
-
-} DPDK_16.04;
-
-DPDK_17.02 {
-	global:
-
-	_rte_eth_dev_reset;
-	rte_eth_dev_fw_version_get;
-
-} DPDK_16.07;
-
-DPDK_17.05 {
-	global:
-
-	rte_eth_dev_attach_secondary;
-	rte_eth_find_next;
 	rte_eth_tx_done_cleanup;
+	rte_eth_tx_queue_info_get;
+	rte_eth_tx_queue_setup;
+	rte_eth_xstats_get;
 	rte_eth_xstats_get_by_id;
 	rte_eth_xstats_get_id_by_name;
+	rte_eth_xstats_get_names;
 	rte_eth_xstats_get_names_by_id;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
-	global:
-
-	_rte_eth_dev_callback_process;
-	rte_eth_dev_adjust_nb_rx_tx_desc;
+	rte_eth_xstats_reset;
+	rte_flow_copy;
+	rte_flow_create;
+	rte_flow_destroy;
+	rte_flow_error_set;
+	rte_flow_flush;
+	rte_flow_isolate;
+	rte_flow_query;
+	rte_flow_validate;
 	rte_tm_capabilities_get;
 	rte_tm_get_number_of_leaf_nodes;
 	rte_tm_hierarchy_commit;
@@ -176,65 +167,8 @@ DPDK_17.08 {
 	rte_tm_wred_profile_add;
 	rte_tm_wred_profile_delete;
 
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_eth_dev_get_sec_ctx;
-	rte_eth_dev_pool_ops_supported;
-	rte_eth_dev_reset;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_eth_dev_filter_ctrl;
-
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_eth_dev_count_avail;
-	rte_eth_dev_probing_finish;
-	rte_eth_find_next_owned_by;
-	rte_flow_copy;
-	rte_flow_create;
-	rte_flow_destroy;
-	rte_flow_error_set;
-	rte_flow_flush;
-	rte_flow_isolate;
-	rte_flow_query;
-	rte_flow_validate;
-
-} DPDK_18.02;
-
-DPDK_18.08 {
-	global:
-
-	rte_eth_dev_logtype;
-
-} DPDK_18.05;
-
-DPDK_18.11 {
-	global:
-
-	rte_eth_dev_rx_offload_name;
-	rte_eth_dev_tx_offload_name;
-	rte_eth_iterator_cleanup;
-	rte_eth_iterator_init;
-	rte_eth_iterator_next;
-
-} DPDK_18.08;
-
-DPDK_19.05 {
-	global:
-
-	rte_eth_dev_count_total;
-
-} DPDK_18.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_eventdev/rte_eventdev_version.map b/lib/librte_eventdev/rte_eventdev_version.map
index 76b3021d3a..edfc15282d 100644
--- a/lib/librte_eventdev/rte_eventdev_version.map
+++ b/lib/librte_eventdev/rte_eventdev_version.map
@@ -1,61 +1,38 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
-	rte_eventdevs;
-
+	rte_event_crypto_adapter_caps_get;
+	rte_event_crypto_adapter_create;
+	rte_event_crypto_adapter_create_ext;
+	rte_event_crypto_adapter_event_port_get;
+	rte_event_crypto_adapter_free;
+	rte_event_crypto_adapter_queue_pair_add;
+	rte_event_crypto_adapter_queue_pair_del;
+	rte_event_crypto_adapter_service_id_get;
+	rte_event_crypto_adapter_start;
+	rte_event_crypto_adapter_stats_get;
+	rte_event_crypto_adapter_stats_reset;
+	rte_event_crypto_adapter_stop;
+	rte_event_dequeue_timeout_ticks;
+	rte_event_dev_attr_get;
+	rte_event_dev_close;
+	rte_event_dev_configure;
 	rte_event_dev_count;
+	rte_event_dev_dump;
 	rte_event_dev_get_dev_id;
-	rte_event_dev_socket_id;
 	rte_event_dev_info_get;
-	rte_event_dev_configure;
+	rte_event_dev_selftest;
+	rte_event_dev_service_id_get;
+	rte_event_dev_socket_id;
 	rte_event_dev_start;
 	rte_event_dev_stop;
-	rte_event_dev_close;
-	rte_event_dev_dump;
+	rte_event_dev_stop_flush_callback_register;
 	rte_event_dev_xstats_by_name_get;
 	rte_event_dev_xstats_get;
 	rte_event_dev_xstats_names_get;
 	rte_event_dev_xstats_reset;
-
-	rte_event_port_default_conf_get;
-	rte_event_port_setup;
-	rte_event_port_link;
-	rte_event_port_unlink;
-	rte_event_port_links_get;
-
-	rte_event_queue_default_conf_get;
-	rte_event_queue_setup;
-
-	rte_event_dequeue_timeout_ticks;
-
-	rte_event_pmd_allocate;
-	rte_event_pmd_release;
-	rte_event_pmd_vdev_init;
-	rte_event_pmd_vdev_uninit;
-	rte_event_pmd_pci_probe;
-	rte_event_pmd_pci_remove;
-
-	local: *;
-};
-
-DPDK_17.08 {
-	global:
-
-	rte_event_ring_create;
-	rte_event_ring_free;
-	rte_event_ring_init;
-	rte_event_ring_lookup;
-} DPDK_17.05;
-
-DPDK_17.11 {
-	global:
-
-	rte_event_dev_attr_get;
-	rte_event_dev_service_id_get;
-	rte_event_port_attr_get;
-	rte_event_queue_attr_get;
-
 	rte_event_eth_rx_adapter_caps_get;
+	rte_event_eth_rx_adapter_cb_register;
 	rte_event_eth_rx_adapter_create;
 	rte_event_eth_rx_adapter_create_ext;
 	rte_event_eth_rx_adapter_free;
@@ -63,38 +40,9 @@ DPDK_17.11 {
 	rte_event_eth_rx_adapter_queue_del;
 	rte_event_eth_rx_adapter_service_id_get;
 	rte_event_eth_rx_adapter_start;
+	rte_event_eth_rx_adapter_stats_get;
 	rte_event_eth_rx_adapter_stats_reset;
 	rte_event_eth_rx_adapter_stop;
-} DPDK_17.08;
-
-DPDK_18.02 {
-	global:
-
-	rte_event_dev_selftest;
-} DPDK_17.11;
-
-DPDK_18.05 {
-	global:
-
-	rte_event_dev_stop_flush_callback_register;
-} DPDK_18.02;
-
-DPDK_19.05 {
-	global:
-
-	rte_event_crypto_adapter_caps_get;
-	rte_event_crypto_adapter_create;
-	rte_event_crypto_adapter_create_ext;
-	rte_event_crypto_adapter_event_port_get;
-	rte_event_crypto_adapter_free;
-	rte_event_crypto_adapter_queue_pair_add;
-	rte_event_crypto_adapter_queue_pair_del;
-	rte_event_crypto_adapter_service_id_get;
-	rte_event_crypto_adapter_start;
-	rte_event_crypto_adapter_stats_get;
-	rte_event_crypto_adapter_stats_reset;
-	rte_event_crypto_adapter_stop;
-	rte_event_port_unlinks_in_progress;
 	rte_event_eth_tx_adapter_caps_get;
 	rte_event_eth_tx_adapter_create;
 	rte_event_eth_tx_adapter_create_ext;
@@ -107,6 +55,26 @@ DPDK_19.05 {
 	rte_event_eth_tx_adapter_stats_get;
 	rte_event_eth_tx_adapter_stats_reset;
 	rte_event_eth_tx_adapter_stop;
+	rte_event_pmd_allocate;
+	rte_event_pmd_pci_probe;
+	rte_event_pmd_pci_remove;
+	rte_event_pmd_release;
+	rte_event_pmd_vdev_init;
+	rte_event_pmd_vdev_uninit;
+	rte_event_port_attr_get;
+	rte_event_port_default_conf_get;
+	rte_event_port_link;
+	rte_event_port_links_get;
+	rte_event_port_setup;
+	rte_event_port_unlink;
+	rte_event_port_unlinks_in_progress;
+	rte_event_queue_attr_get;
+	rte_event_queue_default_conf_get;
+	rte_event_queue_setup;
+	rte_event_ring_create;
+	rte_event_ring_free;
+	rte_event_ring_init;
+	rte_event_ring_lookup;
 	rte_event_timer_adapter_caps_get;
 	rte_event_timer_adapter_create;
 	rte_event_timer_adapter_create_ext;
@@ -121,11 +89,7 @@ DPDK_19.05 {
 	rte_event_timer_arm_burst;
 	rte_event_timer_arm_tmo_tick_burst;
 	rte_event_timer_cancel_burst;
-} DPDK_18.05;
+	rte_eventdevs;
 
-DPDK_19.08 {
-	global:
-
-	rte_event_eth_rx_adapter_cb_register;
-	rte_event_eth_rx_adapter_stats_get;
-} DPDK_19.05;
+	local: *;
+};
diff --git a/lib/librte_gro/rte_gro_version.map b/lib/librte_gro/rte_gro_version.map
index 1606b6dc72..9f6fe79e57 100644
--- a/lib/librte_gro/rte_gro_version.map
+++ b/lib/librte_gro/rte_gro_version.map
@@ -1,4 +1,4 @@
-DPDK_17.08 {
+DPDK_20.0 {
 	global:
 
 	rte_gro_ctx_create;
diff --git a/lib/librte_gso/rte_gso_version.map b/lib/librte_gso/rte_gso_version.map
index e1fd453edb..8505a59c27 100644
--- a/lib/librte_gso/rte_gso_version.map
+++ b/lib/librte_gso/rte_gso_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_gso_segment;
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
index 734ae28b04..138c130c1b 100644
--- a/lib/librte_hash/rte_hash_version.map
+++ b/lib/librte_hash/rte_hash_version.map
@@ -1,58 +1,33 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_fbk_hash_create;
 	rte_fbk_hash_find_existing;
 	rte_fbk_hash_free;
 	rte_hash_add_key;
+	rte_hash_add_key_data;
 	rte_hash_add_key_with_hash;
+	rte_hash_add_key_with_hash_data;
+	rte_hash_count;
 	rte_hash_create;
 	rte_hash_del_key;
 	rte_hash_del_key_with_hash;
 	rte_hash_find_existing;
 	rte_hash_free;
+	rte_hash_get_key_with_position;
 	rte_hash_hash;
+	rte_hash_iterate;
 	rte_hash_lookup;
 	rte_hash_lookup_bulk;
-	rte_hash_lookup_with_hash;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_hash_add_key_data;
-	rte_hash_add_key_with_hash_data;
-	rte_hash_iterate;
 	rte_hash_lookup_bulk_data;
 	rte_hash_lookup_data;
+	rte_hash_lookup_with_hash;
 	rte_hash_lookup_with_hash_data;
 	rte_hash_reset;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
 	rte_hash_set_cmp_func;
 
-} DPDK_2.1;
-
-DPDK_16.07 {
-	global:
-
-	rte_hash_get_key_with_position;
-
-} DPDK_2.2;
-
-
-DPDK_18.08 {
-	global:
-
-	rte_hash_count;
-
-} DPDK_16.07;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_ip_frag/rte_ip_frag_version.map b/lib/librte_ip_frag/rte_ip_frag_version.map
index a193007c61..5dd34f828c 100644
--- a/lib/librte_ip_frag/rte_ip_frag_version.map
+++ b/lib/librte_ip_frag/rte_ip_frag_version.map
@@ -1,8 +1,9 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_ip_frag_free_death_row;
 	rte_ip_frag_table_create;
+	rte_ip_frag_table_destroy;
 	rte_ip_frag_table_statistics_dump;
 	rte_ipv4_frag_reassemble_packet;
 	rte_ipv4_fragment_packet;
@@ -12,13 +13,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_17.08 {
-	global:
-
-	rte_ip_frag_table_destroy;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_jobstats/rte_jobstats_version.map b/lib/librte_jobstats/rte_jobstats_version.map
index f89441438e..dbd2664ae2 100644
--- a/lib/librte_jobstats/rte_jobstats_version.map
+++ b/lib/librte_jobstats/rte_jobstats_version.map
@@ -1,6 +1,7 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_jobstats_abort;
 	rte_jobstats_context_finish;
 	rte_jobstats_context_init;
 	rte_jobstats_context_reset;
@@ -17,10 +18,3 @@ DPDK_2.0 {
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_jobstats_abort;
-
-} DPDK_2.0;
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
index c877dc6aaa..9cd3cedc54 100644
--- a/lib/librte_kni/rte_kni_version.map
+++ b/lib/librte_kni/rte_kni_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_kni_alloc;
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
index 8f4b4e3f8f..3ba0f4b59c 100644
--- a/lib/librte_kvargs/rte_kvargs_version.map
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_kvargs_count;
@@ -15,4 +15,4 @@ EXPERIMENTAL {
 	rte_kvargs_parse_delim;
 	rte_kvargs_strcmp;
 
-} DPDK_2.0;
+};
diff --git a/lib/librte_latencystats/rte_latencystats_version.map b/lib/librte_latencystats/rte_latencystats_version.map
index ac8403e821..e04e63463f 100644
--- a/lib/librte_latencystats/rte_latencystats_version.map
+++ b/lib/librte_latencystats/rte_latencystats_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_latencystats_get;
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
index 90beac853d..500f58b806 100644
--- a/lib/librte_lpm/rte_lpm_version.map
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -1,13 +1,6 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
-	rte_lpm_add;
-	rte_lpm_create;
-	rte_lpm_delete;
-	rte_lpm_delete_all;
-	rte_lpm_find_existing;
-	rte_lpm_free;
-	rte_lpm_is_rule_present;
 	rte_lpm6_add;
 	rte_lpm6_create;
 	rte_lpm6_delete;
@@ -18,29 +11,13 @@ DPDK_2.0 {
 	rte_lpm6_is_rule_present;
 	rte_lpm6_lookup;
 	rte_lpm6_lookup_bulk_func;
+	rte_lpm_add;
+	rte_lpm_create;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_is_rule_present;
 
 	local: *;
 };
-
-DPDK_16.04 {
-	global:
-
-	rte_lpm_add;
-	rte_lpm_find_existing;
-	rte_lpm_create;
-	rte_lpm_free;
-	rte_lpm_is_rule_present;
-	rte_lpm_delete;
-	rte_lpm_delete_all;
-
-} DPDK_2.0;
-
-DPDK_17.05 {
-	global:
-
-	rte_lpm6_add;
-	rte_lpm6_is_rule_present;
-	rte_lpm6_lookup;
-	rte_lpm6_lookup_bulk_func;
-
-} DPDK_16.04;
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
index 263dc0a21e..3bbb476975 100644
--- a/lib/librte_mbuf/rte_mbuf_version.map
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -1,26 +1,7 @@
-DPDK_2.0 {
-	global:
-
-	rte_get_rx_ol_flag_name;
-	rte_get_tx_ol_flag_name;
-	rte_mbuf_sanity_check;
-	rte_pktmbuf_dump;
-	rte_pktmbuf_init;
-	rte_pktmbuf_pool_init;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_pktmbuf_pool_create;
-
-} DPDK_2.0;
-
-DPDK_16.11 {
+DPDK_20.0 {
 	global:
 
+	__rte_pktmbuf_linearize;
 	__rte_pktmbuf_read;
 	rte_get_ptype_inner_l2_name;
 	rte_get_ptype_inner_l3_name;
@@ -31,28 +12,24 @@ DPDK_16.11 {
 	rte_get_ptype_name;
 	rte_get_ptype_tunnel_name;
 	rte_get_rx_ol_flag_list;
+	rte_get_rx_ol_flag_name;
 	rte_get_tx_ol_flag_list;
-
-} DPDK_2.1;
-
-DPDK_18.08 {
-	global:
-
+	rte_get_tx_ol_flag_name;
 	rte_mbuf_best_mempool_ops;
 	rte_mbuf_platform_mempool_ops;
+	rte_mbuf_sanity_check;
 	rte_mbuf_set_platform_mempool_ops;
 	rte_mbuf_set_user_mempool_ops;
 	rte_mbuf_user_mempool_ops;
-	rte_pktmbuf_pool_create_by_ops;
-} DPDK_16.11;
-
-DPDK_19.11 {
-	global:
-
-	__rte_pktmbuf_linearize;
 	rte_pktmbuf_clone;
+	rte_pktmbuf_dump;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_create;
+	rte_pktmbuf_pool_create_by_ops;
+	rte_pktmbuf_pool_init;
 
-} DPDK_18.08;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
@@ -68,4 +45,4 @@ EXPERIMENTAL {
 	rte_pktmbuf_copy;
 	rte_pktmbuf_free_bulk;
 
-} DPDK_18.08;
+};
diff --git a/lib/librte_member/rte_member_version.map b/lib/librte_member/rte_member_version.map
index 019e4cd962..87780ae611 100644
--- a/lib/librte_member/rte_member_version.map
+++ b/lib/librte_member/rte_member_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_member_add;
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
index ce9e791e78..d002dfc46f 100644
--- a/lib/librte_mempool/rte_mempool_version.map
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -1,57 +1,39 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_mempool_audit;
-	rte_mempool_calc_obj_size;
-	rte_mempool_create;
-	rte_mempool_dump;
-	rte_mempool_list_dump;
-	rte_mempool_lookup;
-	rte_mempool_walk;
-
-	local: *;
-};
-
-DPDK_16.07 {
-	global:
-
 	rte_mempool_avail_count;
 	rte_mempool_cache_create;
 	rte_mempool_cache_flush;
 	rte_mempool_cache_free;
+	rte_mempool_calc_obj_size;
 	rte_mempool_check_cookies;
+	rte_mempool_contig_blocks_check_cookies;
+	rte_mempool_create;
 	rte_mempool_create_empty;
 	rte_mempool_default_cache;
+	rte_mempool_dump;
 	rte_mempool_free;
 	rte_mempool_generic_get;
 	rte_mempool_generic_put;
 	rte_mempool_in_use_count;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
 	rte_mempool_mem_iter;
 	rte_mempool_obj_iter;
+	rte_mempool_op_calc_mem_size_default;
+	rte_mempool_op_populate_default;
 	rte_mempool_ops_table;
 	rte_mempool_populate_anon;
 	rte_mempool_populate_default;
+	rte_mempool_populate_iova;
 	rte_mempool_populate_virt;
 	rte_mempool_register_ops;
 	rte_mempool_set_ops_byname;
+	rte_mempool_walk;
 
-} DPDK_2.0;
-
-DPDK_17.11 {
-	global:
-
-	rte_mempool_populate_iova;
-
-} DPDK_16.07;
-
-DPDK_18.05 {
-	global:
-
-	rte_mempool_contig_blocks_check_cookies;
-	rte_mempool_op_calc_mem_size_default;
-	rte_mempool_op_populate_default;
-
-} DPDK_17.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
index 4b460d5803..46410b0369 100644
--- a/lib/librte_meter/rte_meter_version.map
+++ b/lib/librte_meter/rte_meter_version.map
@@ -1,21 +1,16 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_meter_srtcm_color_aware_check;
 	rte_meter_srtcm_color_blind_check;
 	rte_meter_srtcm_config;
+	rte_meter_srtcm_profile_config;
 	rte_meter_trtcm_color_aware_check;
 	rte_meter_trtcm_color_blind_check;
 	rte_meter_trtcm_config;
-
-	local: *;
-};
-
-DPDK_18.08 {
-	global:
-
-	rte_meter_srtcm_profile_config;
 	rte_meter_trtcm_profile_config;
+
+	local: *;
 };
 
 EXPERIMENTAL {
diff --git a/lib/librte_metrics/rte_metrics_version.map b/lib/librte_metrics/rte_metrics_version.map
index 6ac99a44a1..85663f356e 100644
--- a/lib/librte_metrics/rte_metrics_version.map
+++ b/lib/librte_metrics/rte_metrics_version.map
@@ -1,4 +1,4 @@
-DPDK_17.05 {
+DPDK_20.0 {
 	global:
 
 	rte_metrics_get_names;
diff --git a/lib/librte_net/rte_net_version.map b/lib/librte_net/rte_net_version.map
index fffc4a3723..8a4e75a3a0 100644
--- a/lib/librte_net/rte_net_version.map
+++ b/lib/librte_net/rte_net_version.map
@@ -1,25 +1,14 @@
-DPDK_16.11 {
-	global:
-	rte_net_get_ptype;
-
-	local: *;
-};
-
-DPDK_17.05 {
-	global:
-
-	rte_net_crc_calc;
-	rte_net_crc_set_alg;
-
-} DPDK_16.11;
-
-DPDK_19.08 {
+DPDK_20.0 {
 	global:
 
 	rte_eth_random_addr;
 	rte_ether_format_addr;
+	rte_net_crc_calc;
+	rte_net_crc_set_alg;
+	rte_net_get_ptype;
 
-} DPDK_17.05;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_pci/rte_pci_version.map b/lib/librte_pci/rte_pci_version.map
index 03790cb0f0..67eb845796 100644
--- a/lib/librte_pci/rte_pci_version.map
+++ b/lib/librte_pci/rte_pci_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	pci_map_resource;
diff --git a/lib/librte_pdump/rte_pdump_version.map b/lib/librte_pdump/rte_pdump_version.map
index 3e744f3012..6d02ccce6d 100644
--- a/lib/librte_pdump/rte_pdump_version.map
+++ b/lib/librte_pdump/rte_pdump_version.map
@@ -1,4 +1,4 @@
-DPDK_16.07 {
+DPDK_20.0 {
 	global:
 
 	rte_pdump_disable;
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
index 420f065d6e..64d38afecd 100644
--- a/lib/librte_pipeline/rte_pipeline_version.map
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -1,6 +1,8 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_pipeline_ah_packet_drop;
+	rte_pipeline_ah_packet_hijack;
 	rte_pipeline_check;
 	rte_pipeline_create;
 	rte_pipeline_flush;
@@ -9,42 +11,22 @@ DPDK_2.0 {
 	rte_pipeline_port_in_create;
 	rte_pipeline_port_in_disable;
 	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_stats_read;
 	rte_pipeline_port_out_create;
 	rte_pipeline_port_out_packet_insert;
+	rte_pipeline_port_out_stats_read;
 	rte_pipeline_run;
 	rte_pipeline_table_create;
 	rte_pipeline_table_default_entry_add;
 	rte_pipeline_table_default_entry_delete;
 	rte_pipeline_table_entry_add;
-	rte_pipeline_table_entry_delete;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_pipeline_port_in_stats_read;
-	rte_pipeline_port_out_stats_read;
-	rte_pipeline_table_stats_read;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
 	rte_pipeline_table_entry_add_bulk;
+	rte_pipeline_table_entry_delete;
 	rte_pipeline_table_entry_delete_bulk;
+	rte_pipeline_table_stats_read;
 
-} DPDK_2.1;
-
-DPDK_16.04 {
-	global:
-
-	rte_pipeline_ah_packet_hijack;
-	rte_pipeline_ah_packet_drop;
-
-} DPDK_2.2;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
index d5989721d7..18c6154672 100644
--- a/lib/librte_port/rte_port_version.map
+++ b/lib/librte_port/rte_port_version.map
@@ -1,65 +1,35 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_nodrop_ops;
 	rte_port_ethdev_writer_ops;
+	rte_port_fd_reader_ops;
+	rte_port_fd_writer_nodrop_ops;
+	rte_port_fd_writer_ops;
+	rte_port_kni_reader_ops;
+	rte_port_kni_writer_nodrop_ops;
+	rte_port_kni_writer_ops;
+	rte_port_ring_multi_reader_ops;
+	rte_port_ring_multi_writer_nodrop_ops;
+	rte_port_ring_multi_writer_ops;
 	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_reader_ipv6_frag_ops;
 	rte_port_ring_reader_ops;
 	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_writer_ipv6_ras_ops;
+	rte_port_ring_writer_nodrop_ops;
 	rte_port_ring_writer_ops;
 	rte_port_sched_reader_ops;
 	rte_port_sched_writer_ops;
 	rte_port_sink_ops;
 	rte_port_source_ops;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_port_ethdev_writer_nodrop_ops;
-	rte_port_ring_reader_ipv6_frag_ops;
-	rte_port_ring_writer_ipv6_ras_ops;
-	rte_port_ring_writer_nodrop_ops;
-
-} DPDK_2.0;
-
-DPDK_2.2 {
-	global:
-
-	rte_port_ring_multi_reader_ops;
-	rte_port_ring_multi_writer_ops;
-	rte_port_ring_multi_writer_nodrop_ops;
-
-} DPDK_2.1;
-
-DPDK_16.07 {
-	global:
-
-	rte_port_kni_reader_ops;
-	rte_port_kni_writer_ops;
-	rte_port_kni_writer_nodrop_ops;
-
-} DPDK_2.2;
-
-DPDK_16.11 {
-	global:
-
-	rte_port_fd_reader_ops;
-	rte_port_fd_writer_ops;
-	rte_port_fd_writer_nodrop_ops;
-
-} DPDK_16.07;
-
-DPDK_18.11 {
-	global:
-
 	rte_port_sym_crypto_reader_ops;
-	rte_port_sym_crypto_writer_ops;
 	rte_port_sym_crypto_writer_nodrop_ops;
+	rte_port_sym_crypto_writer_ops;
 
-} DPDK_16.11;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
index 7729838137..55a168f56e 100644
--- a/lib/librte_power/rte_power_version.map
+++ b/lib/librte_power/rte_power_version.map
@@ -1,39 +1,27 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_power_exit;
+	rte_power_freq_disable_turbo;
 	rte_power_freq_down;
+	rte_power_freq_enable_turbo;
 	rte_power_freq_max;
 	rte_power_freq_min;
 	rte_power_freq_up;
 	rte_power_freqs;
+	rte_power_get_capabilities;
 	rte_power_get_env;
 	rte_power_get_freq;
+	rte_power_guest_channel_send_msg;
 	rte_power_init;
 	rte_power_set_env;
 	rte_power_set_freq;
+	rte_power_turbo_status;
 	rte_power_unset_env;
 
 	local: *;
 };
 
-DPDK_17.11 {
-	global:
-
-	rte_power_guest_channel_send_msg;
-	rte_power_freq_disable_turbo;
-	rte_power_freq_enable_turbo;
-	rte_power_turbo_status;
-
-} DPDK_2.0;
-
-DPDK_18.08 {
-	global:
-
-	rte_power_get_capabilities;
-
-} DPDK_17.11;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_rawdev/rte_rawdev_version.map b/lib/librte_rawdev/rte_rawdev_version.map
index b61dbff11c..d847c9e0d3 100644
--- a/lib/librte_rawdev/rte_rawdev_version.map
+++ b/lib/librte_rawdev/rte_rawdev_version.map
@@ -1,4 +1,4 @@
-DPDK_18.08 {
+DPDK_20.0 {
 	global:
 
 	rte_rawdev_close;
@@ -17,8 +17,8 @@ DPDK_18.08 {
 	rte_rawdev_pmd_release;
 	rte_rawdev_queue_conf_get;
 	rte_rawdev_queue_count;
-	rte_rawdev_queue_setup;
 	rte_rawdev_queue_release;
+	rte_rawdev_queue_setup;
 	rte_rawdev_reset;
 	rte_rawdev_selftest;
 	rte_rawdev_set_attr;
diff --git a/lib/librte_reorder/rte_reorder_version.map b/lib/librte_reorder/rte_reorder_version.map
index 0a8a54de83..cf444062df 100644
--- a/lib/librte_reorder/rte_reorder_version.map
+++ b/lib/librte_reorder/rte_reorder_version.map
@@ -1,13 +1,13 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_reorder_create;
-	rte_reorder_init;
+	rte_reorder_drain;
 	rte_reorder_find_existing;
-	rte_reorder_reset;
 	rte_reorder_free;
+	rte_reorder_init;
 	rte_reorder_insert;
-	rte_reorder_drain;
+	rte_reorder_reset;
 
 	local: *;
 };
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
index 510c1386e0..89d84bcf48 100644
--- a/lib/librte_ring/rte_ring_version.map
+++ b/lib/librte_ring/rte_ring_version.map
@@ -1,8 +1,9 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_ring_create;
 	rte_ring_dump;
+	rte_ring_free;
 	rte_ring_get_memsize;
 	rte_ring_init;
 	rte_ring_list_dump;
@@ -11,13 +12,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_2.2 {
-	global:
-
-	rte_ring_free;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
index f33761e63e..cefd990367 100644
--- a/lib/librte_sched/rte_sched_version.map
+++ b/lib/librte_sched/rte_sched_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_approx;
@@ -14,6 +14,9 @@ DPDK_2.0 {
 	rte_sched_port_enqueue;
 	rte_sched_port_free;
 	rte_sched_port_get_memory_footprint;
+	rte_sched_port_pkt_read_color;
+	rte_sched_port_pkt_read_tree_path;
+	rte_sched_port_pkt_write;
 	rte_sched_queue_read_stats;
 	rte_sched_subport_config;
 	rte_sched_subport_read_stats;
@@ -21,15 +24,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_2.1 {
-	global:
-
-	rte_sched_port_pkt_write;
-	rte_sched_port_pkt_read_tree_path;
-	rte_sched_port_pkt_read_color;
-
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_security/rte_security_version.map b/lib/librte_security/rte_security_version.map
index 53267bf3cc..b07314bbf4 100644
--- a/lib/librte_security/rte_security_version.map
+++ b/lib/librte_security/rte_security_version.map
@@ -1,4 +1,4 @@
-DPDK_18.11 {
+DPDK_20.0 {
 	global:
 
 	rte_security_attach_session;
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
index 6237252bec..40f72b1fe8 100644
--- a/lib/librte_table/rte_table_version.map
+++ b/lib/librte_table/rte_table_version.map
@@ -1,4 +1,4 @@
-DPDK_17.11 {
+DPDK_20.0 {
 	global:
 
 	rte_table_acl_ops;
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
index 72f75c8181..2a59d3f081 100644
--- a/lib/librte_timer/rte_timer_version.map
+++ b/lib/librte_timer/rte_timer_version.map
@@ -1,4 +1,4 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
 	rte_timer_dump_stats;
@@ -14,16 +14,6 @@ DPDK_2.0 {
 	local: *;
 };
 
-DPDK_19.05 {
-	global:
-
-	rte_timer_dump_stats;
-	rte_timer_manage;
-	rte_timer_reset;
-	rte_timer_stop;
-	rte_timer_subsystem_init;
-} DPDK_2.0;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
index ce517b1271..c512377fe6 100644
--- a/lib/librte_vhost/rte_vhost_version.map
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -1,64 +1,34 @@
-DPDK_2.0 {
+DPDK_20.0 {
 	global:
 
+	rte_vhost_avail_entries;
 	rte_vhost_dequeue_burst;
 	rte_vhost_driver_callback_register;
-	rte_vhost_driver_register;
-	rte_vhost_enable_guest_notification;
-	rte_vhost_enqueue_burst;
-
-	local: *;
-};
-
-DPDK_2.1 {
-	global:
-
-	rte_vhost_driver_unregister;
-
-} DPDK_2.0;
-
-DPDK_16.07 {
-	global:
-
-	rte_vhost_avail_entries;
-	rte_vhost_get_ifname;
-	rte_vhost_get_numa_node;
-	rte_vhost_get_queue_num;
-
-} DPDK_2.1;
-
-DPDK_17.05 {
-	global:
-
 	rte_vhost_driver_disable_features;
 	rte_vhost_driver_enable_features;
 	rte_vhost_driver_get_features;
+	rte_vhost_driver_register;
 	rte_vhost_driver_set_features;
 	rte_vhost_driver_start;
+	rte_vhost_driver_unregister;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_enqueue_burst;
+	rte_vhost_get_ifname;
 	rte_vhost_get_mem_table;
 	rte_vhost_get_mtu;
 	rte_vhost_get_negotiated_features;
+	rte_vhost_get_numa_node;
+	rte_vhost_get_queue_num;
 	rte_vhost_get_vhost_vring;
 	rte_vhost_get_vring_num;
 	rte_vhost_gpa_to_vva;
 	rte_vhost_log_used_vring;
 	rte_vhost_log_write;
-
-} DPDK_16.07;
-
-DPDK_17.08 {
-	global:
-
 	rte_vhost_rx_queue_count;
-
-} DPDK_17.05;
-
-DPDK_18.02 {
-	global:
-
 	rte_vhost_vring_call;
 
-} DPDK_17.08;
+	local: *;
+};
 
 EXPERIMENTAL {
 	global:
-- 
2.17.1

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps
  2019-11-06 13:58  3%   ` David Marchand
@ 2019-11-06 15:27  0%     ` Rajesh Ravi
  0 siblings, 0 replies; 200+ results
From: Rajesh Ravi @ 2019-11-06 15:27 UTC (permalink / raw)
  To: David Marchand
  Cc: Burakov, Anatoly, dev, Bruce Richardson, Ajit Khaparde,
	Jonathan Richardson, Scott Branden, Vikram Mysore Prakash,
	Srinath Mannam, Thomas Monjalon

Thanks Anatoly & David.
The main patch provided  by Anatoly is not compatible with DPDK 19.02.
So I had to make following patch and verified it to be working with DPDK
19.02 & SPDK 19.07 combination.

------------------------------------------------------------------------------------------------------------------------------------------------------------------

diff --git a/lib/librte_eal/common/include/rte_eal_memconfig.h
b/lib/librte_eal/common/include/rte_eal_memconfig.h
index 84aabe3..49934f5 100644
--- a/lib/librte_eal/common/include/rte_eal_memconfig.h
+++ b/lib/librte_eal/common/include/rte_eal_memconfig.h
@@ -35,6 +35,7 @@ struct rte_memseg_list {
  volatile uint32_t version; /**< version number for multiprocess sync. */
  size_t len; /**< Length of memory area covered by this memseg list. */
  unsigned int external; /**< 1 if this list points to external memory */
+ unsigned int heap; /**< 1 if this list points to a heap */
  struct rte_fbarray memseg_arr;
 };

diff --git a/lib/librte_eal/common/rte_malloc.c
b/lib/librte_eal/common/rte_malloc.c
index b39de3c..4d31bf7 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -368,6 +368,7 @@ void rte_free(void *addr)

  rte_spinlock_lock(&heap->lock);
  ret = malloc_heap_add_external_memory(heap, msl);
+ msl->heap = 1; /* mark it as heap segment */
  rte_spinlock_unlock(&heap->lock);

 unlock:
diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c
b/lib/librte_eal/linuxapp/eal/eal_memory.c
index 1b96b57..33dd923 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -836,6 +836,7 @@ void numa_error(char *where)
  msl->page_sz = page_sz;
  msl->socket_id = socket_id;
  msl->base_va = NULL;
+ msl->heap = 1; /* mark it as a heap segment */

  RTE_LOG(DEBUG, EAL, "Memseg list allocated: 0x%zxkB at socket %i\n",
  (size_t)page_sz >> 10, socket_id);
@@ -1410,6 +1411,7 @@ void numa_error(char *where)
  msl->page_sz = page_sz;
  msl->socket_id = 0;
  msl->len = internal_config.memory;
+ msl->heap = 1;

  /* we're in single-file segments mode, so only the segment list
  * fd needs to be set up.
@@ -1682,6 +1684,7 @@ void numa_error(char *where)
  mem_sz = msl->len;
  munmap(msl->base_va, mem_sz);
  msl->base_va = NULL;
+ msl->heap = 0;

  /* destroy backing fbarray */
  rte_fbarray_destroy(&msl->memseg_arr);
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c
b/lib/librte_eal/linuxapp/eal/eal_vfio.c
index 61b54f9..3bb3e6b 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
@@ -1238,7 +1238,16 @@ static int vfio_dma_mem_map(struct vfio_config
*vfio_cfg, uint64_t vaddr,
 {
  int *vfio_container_fd = arg;

- if (msl->external & !internal_config.iso_cmem)
+ /* skip external memory that isn't a heap */
+ if (msl->external && !msl->heap)
+ return 0;
+
+ /* skip any segments with invalid IOVA addresses */
+ if (ms->iova == RTE_BAD_IOVA)
+ return 0;
+
+ /* if IOVA mode is VA, we've already mapped the internal segments */
+ if (!msl->external && rte_eal_iova_mode() == RTE_IOVA_VA)
  return 0;

  return vfio_type1_dma_mem_map(*vfio_container_fd, ms->addr_64, ms->iova,
@@ -1362,9 +1371,19 @@ static int vfio_dma_mem_map(struct vfio_config
*vfio_cfg, uint64_t vaddr,
 {
  int *vfio_container_fd = arg;

- if (msl->external)
+ /* skip external memory that isn't a heap */
+ if (msl->external && !msl->heap)
  return 0;

+ /* skip any segments with invalid IOVA addresses */
+ if (ms->iova == RTE_BAD_IOVA)
+ return 0;
+
+#if 0
+ if (ms->addr_64 == param->addr_64)
+ return 0;
+#endif
+
  return vfio_spapr_dma_do_map(*vfio_container_fd, ms->addr_64, ms->iova,
  ms->len, 1);
 }
@@ -1381,6 +1400,12 @@ struct spapr_walk_param {
  uint64_t max = ms->iova + ms->len;

  if (msl->external)
+ /* skip external memory that isn't a heap */
+ if (msl->external && !msl->heap)
+ return 0;
+
+ /* skip any segments with invalid IOVA addresses */
+ if (ms->iova == RTE_BAD_IOVA)
  return 0;

  if (max > param->window_size) {

------------------------------------------------------------------------------------------------------------------------------------------------------------------

Regards,
Rajesh

On Wed, Nov 6, 2019 at 7:28 PM David Marchand <david.marchand@redhat.com>
wrote:

> On Tue, Nov 5, 2019 at 6:15 PM Burakov, Anatoly
> <anatoly.burakov@intel.com> wrote:
> >
> > On 05-Nov-19 3:15 PM, Anatoly Burakov wrote:
> > > Currently, externally created heaps are supposed to be automatically
> > > mapped for VFIO DMA by EAL, however they only do so if, at the time of
> > > heap creation, VFIO is initialized and has at least one device
> > > available. If no devices are available at the time of heap creation (or
> > > if devices were available, but were since hot-unplugged, thus dropping
> > > all VFIO container mappings), then VFIO mapping code would have skipped
> > > over externally allocated heaps.
> > >
> > > The fix is two-fold. First, we allow externally allocated memory
> > > segments to be marked as "heap" segments. This allows us to distinguish
> > > between external memory segments that were created via heap API, from
> > > those that were created via rte_extmem_register() API.
> > >
> > > Then, we fix the VFIO code to only skip non-heap external segments.
> > > Also, since external heaps are not guaranteed to have valid IOVA
> > > addresses, we will skip those which have invalid IOVA addresses as
> well.
> > >
> > > Fixes: 0f526d674f8e ("malloc: separate creating memseg list and malloc
> heap")
> > >
> > > Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> > > ---
> > >
> > > Notes:
> > >      This cannot be backported to older releases as it breaks the
> > >      API and ABI. A separate fix is in the works for stable.
> > >
> >
> > Alternative, non-breaking implementation available (which will be slower
> > due to O(N) memseg list heaps lookups):
> >
> > http://patches.dpdk.org/patch/62486/
> >
> > I'm fine with either option being merged.
> >
> > The more perfect solution would've been to rename "msl->external" into
> > "msl->flags" and have various flags for memseg lists, but it's too late
> > to break the API now.
>
> Either way is fine for me (between the 18.11 and the master patches you
> sent).
> Breaking the ABI is acceptable, but I agree the API is another story.
>
> If the code seems better to you with the additional heap flag, let's go
> for it.
>
> I would still like to hear from Rajesh though, since he seems to be
> the first to hit this issue.
>
>
> --
> David Marchand
>
>

-- 
Regards,
Rajesh

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: add option --iso-cmem for external custom memory
  @ 2019-11-05 14:10  0%                       ` Rajesh Ravi
  0 siblings, 0 replies; 200+ results
From: Rajesh Ravi @ 2019-11-05 14:10 UTC (permalink / raw)
  To: Burakov, Anatoly
  Cc: Ajit Khaparde, dev, Jonathan Richardson, Scott Branden,
	Vikram Mysore Prakash, Srinath Mannam

Thanks a lot Anatoly.
Will the same solution work with  DPDK 19.02 as well? We 're actually using
DPDK 19.02 for memory allocations for SPDK 19.07.
DPDK 19.11 may not be supported by SPDK 19.07 we 're currently using.

I 'll definitely test if the patch works with DPDK 19.02

Thanks again for your time and help.

Regards,
Rajesh




On Tue, Nov 5, 2019 at 5:11 PM Burakov, Anatoly <anatoly.burakov@intel.com>
wrote:

> On 04-Nov-19 10:25 AM, Burakov, Anatoly wrote:
> > On 30-Oct-19 7:50 PM, Rajesh Ravi wrote:
> >> Thanks Anatoly.
> >> Please find  inline below:
> >>
> >> [Anatoly] vfio_mem_event_callback() is called every time memory is
> >> added to a
> >> heap. That includes internal and external memory
> >>
> >> [Rajesh] malloc_heap_add_external_memory() does call
> >> eal_memalloc_mem_event_notify [ instead of vfio_mem_event_callback() ]
> >>                But, no callback function is getting called from inside
> >> eal_memalloc_mem_event_notify()
> >>                execution flow is not entering inside following loop:
> >>
> >> /TAILQ_FOREACH(entry, &mem_event_callback_list, next) {/
> >> /                 RTE_LOG(DEBUG, EAL, "Calling mem event callback
> >> '%s:%p'\n",
> >>                           entry->name, entry->arg);
> >>                   entry->clb(event, start, len, entry->arg);
> >>                }/
> >>
> >> Do you mean to say,  we are supposed to explicitly register a callback
> >> which separately builds  iommu tables in addition to calling
> >> rte_malloc_heap_memory_add()  API?
> >
> > Hi,
> >
> > No, the callback in VFIO should be registered automatically [1] at EAL
> > initialization (or, more precisely, when default container is
> > initialized). Does that not happen in your case?
> >
> > [1]
> http://git.dpdk.org/dpdk/tree/lib/librte_eal/linux/eal/eal_vfio.c#n791
> >
>
> Hi Rajesh,
>
> I think i figured it out. It is a defect in design of how external
> memory heaps are handled.
>
> When VFIO initializes, it will find first VFIO-bound device, initialize
> the container, and set up DMA mappings. Then, you can add more memory
> through creating custom memory regions without adding them to heap
> (mmap() + rte_extmem_register() + rte_dev_dma_map()), or with adding
> them to heap (mmap() + rte_malloc_heap_add_memory()).
>
> The problem is, memory registered through rte_dev_dma_map() will get
> added into a list of user maps, while heap memory will not - the
> assumption is that the DMA mapping will happen through the callback, but
> there is no record left anywhere that this memory is supposed to be mapped.
>
> This makes it so that, if there are no VFIO-bound devices at startup,
> then you create a heap, and *then* you hotplug a device, the heap will
> not be mapped because (as you have correctly pointed out) type1_map()
> skips it, and it's not present in a list of user mem maps either,
> because it is heap memory, so EAL is supposed to handle it by itself and
> not through user map list.
>
> There could be two fixes here. The easiest one is to just add another
> flag to the memseglist - that will work for 19.11, and that's what i
> intend on doing since we're breaking ABI anyway.
>
> For older releases, a different approach would be required (i think
> scanning heaps is best we can do here) in order to keep the ABI and not
> introduce new stuff into rte_memseg_list.
>
> I'll submit a patch shortly, it would be great if you could test it.
>
> --
> Thanks,
> Anatoly
>


-- 
Regards,
Rajesh

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v6 10/10] buildtools: add ABI versioning check script
                       ` (10 preceding siblings ...)
  2019-11-06 16:54  2%   ` [dpdk-dev] [PATCH v6 09/10] build: change ABI version to 20.0 Anatoly Burakov
@ 2019-11-06 16:54 23%   ` Anatoly Burakov
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand, Pawel Modrak

From: Marcin Baran <marcinx.baran@intel.com>

Add a shell script that checks whether built libraries are
versioned with expected ABI (current ABI, current ABI + 1,
or EXPERIMENTAL).

The following command was used to verify current source tree
(assuming build directory is in ./build):

find ./build/lib ./build/drivers -name  \*.so \
	-exec ./buildtools/check-abi-version.sh {} \; -print

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - Moved this to the end of the patchset
    - Fixed bug when ABI symbols were not found because the .so
      did not declare any public symbols

 buildtools/check-abi-version.sh | 54 +++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100755 buildtools/check-abi-version.sh

diff --git a/buildtools/check-abi-version.sh b/buildtools/check-abi-version.sh
new file mode 100755
index 0000000000..29aea97735
--- /dev/null
+++ b/buildtools/check-abi-version.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+# Check whether library symbols have correct
+# version (provided ABI number or provided ABI
+# number + 1 or EXPERIMENTAL).
+# Args:
+#   $1: path of the library .so file
+#   $2: ABI major version number to check
+#       (defaults to ABI_VERSION file value)
+
+if [ -z "$1" ]; then
+    echo "Script checks whether library symbols have"
+    echo "correct version (ABI_VER/ABI_VER+1/EXPERIMENTAL)"
+    echo "Usage:"
+    echo "  $0 SO_FILE_PATH [ABI_VER]"
+    exit 1
+fi
+
+LIB="$1"
+DEFAULT_ABI=$(cat "$(dirname \
+            $(readlink -f $0))/../config/ABI_VERSION" | \
+            cut -d'.' -f 1)
+ABIVER="DPDK_${2-$DEFAULT_ABI}"
+NEXT_ABIVER="DPDK_$((${2-$DEFAULT_ABI}+1))"
+
+ret=0
+
+# get output of objdump
+OBJ_DUMP_OUTPUT=`objdump -TC --section=.text ${LIB} 2>&1 | grep ".text"`
+
+# there may not be any .text sections in the .so file, in which case exit early
+echo "${OBJ_DUMP_OUTPUT}" | grep "not found in any input file" -q
+if [ "$?" -eq 0 ]; then
+    exit 0
+fi
+
+# we have symbols, so let's see if the versions are correct
+for SYM in `echo "${OBJ_DUMP_OUTPUT}" | awk '{print $(NF-1) "-" $NF}'`
+do
+    version=$(echo $SYM | cut -d'-' -f 1)
+    symbol=$(echo $SYM | cut -d'-' -f 2)
+    case $version in (*"$ABIVER"*|*"$NEXT_ABIVER"*|"EXPERIMENTAL")
+        ;;
+    (*)
+        echo "Warning: symbol $symbol ($version) should be annotated " \
+             "as ABI version $ABIVER / $NEXT_ABIVER, or EXPERIMENTAL."
+        ret=1
+    ;;
+    esac
+done
+
+exit $ret
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v6 08/10] drivers/octeontx: add missing public symbol
                       ` (8 preceding siblings ...)
  2019-11-06 16:54  6%   ` [dpdk-dev] [PATCH v6 07/10] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
@ 2019-11-06 16:54  3%   ` Anatoly Burakov
  2019-11-06 16:54  2%   ` [dpdk-dev] [PATCH v6 09/10] build: change ABI version to 20.0 Anatoly Burakov
  2019-11-06 16:54 23%   ` [dpdk-dev] [PATCH v6 10/10] buildtools: add ABI versioning check script Anatoly Burakov
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Jerin Jacob, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand, pbhagavatula, stable

The logtype symbol was missing from the .map file. Add it.

Fixes: d8dd31652cf4 ("common/octeontx: move mbox to common folder")
Cc: pbhagavatula@caviumnetworks.com
Cc: stable@dpdk.org

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - add this patch to avoid compile breakage when bumping ABI

 drivers/common/octeontx/rte_common_octeontx_version.map | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/common/octeontx/rte_common_octeontx_version.map b/drivers/common/octeontx/rte_common_octeontx_version.map
index f04b3b7f8a..a9b3cff9bc 100644
--- a/drivers/common/octeontx/rte_common_octeontx_version.map
+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
@@ -1,6 +1,7 @@
 DPDK_18.05 {
 	global:
 
+	octeontx_logtype_mbox;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
 	octeontx_mbox_send;
-- 
2.17.1

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v6 07/10] distributor: rename v2.0 ABI to _single suffix
                       ` (7 preceding siblings ...)
  2019-11-06 16:54  4%   ` [dpdk-dev] [PATCH v6 06/10] distributor: " Anatoly Burakov
@ 2019-11-06 16:54  6%   ` Anatoly Burakov
  2019-11-06 16:54  3%   ` [dpdk-dev] [PATCH v6 08/10] drivers/octeontx: add missing public symbol Anatoly Burakov
                     ` (2 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, David Hunt, john.mcnamara, ray.kinsella,
	bruce.richardson, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

The original ABI versioning was slightly misleading in that the
DPDK 2.0 ABI was really a single mode for the distributor, and is
used as such throughout the distributor code.

Fix this by renaming all _v20 API's to _single API's, and remove
symbol versioning.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
---

Notes:
    v4:
    - Changed it back to how it was with v2
    - Removed remaining v2.0 symbols
    
    v3:
    - Removed single mode from distributor as per Dave's comments
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_distributor/Makefile               |  2 +-
 lib/librte_distributor/distributor_private.h  | 10 ++--
 lib/librte_distributor/meson.build            |  2 +-
 lib/librte_distributor/rte_distributor.c      | 24 +++++-----
 ...ributor_v20.c => rte_distributor_single.c} | 48 +++++++++----------
 ...ributor_v20.h => rte_distributor_single.h} | 26 +++++-----
 .../rte_distributor_version.map               | 18 +------
 7 files changed, 58 insertions(+), 72 deletions(-)
 rename lib/librte_distributor/{rte_distributor_v20.c => rte_distributor_single.c} (88%)
 rename lib/librte_distributor/{rte_distributor_v20.h => rte_distributor_single.h} (89%)

diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 0ef80dcff4..d9d0089166 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -15,7 +15,7 @@ EXPORT_MAP := rte_distributor_version.map
 LIBABIVER := 1
 
 # all source are stored in SRCS-y
-SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_v20.c
+SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_single.c
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor.c
 ifeq ($(CONFIG_RTE_ARCH_X86),y)
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor_match_sse.c
diff --git a/lib/librte_distributor/distributor_private.h b/lib/librte_distributor/distributor_private.h
index c89371123e..489aef2acb 100644
--- a/lib/librte_distributor/distributor_private.h
+++ b/lib/librte_distributor/distributor_private.h
@@ -55,7 +55,7 @@ extern "C" {
  * the next cache line to worker 0, we pad this out to three cache lines.
  * Only 64-bits of the memory is actually used though.
  */
-union rte_distributor_buffer_v20 {
+union rte_distributor_buffer_single {
 	volatile int64_t bufptr64;
 	char pad[RTE_CACHE_LINE_SIZE*3];
 } __rte_cache_aligned;
@@ -80,8 +80,8 @@ struct rte_distributor_returned_pkts {
 	struct rte_mbuf *mbufs[RTE_DISTRIB_MAX_RETURNS];
 };
 
-struct rte_distributor_v20 {
-	TAILQ_ENTRY(rte_distributor_v20) next;    /**< Next in list. */
+struct rte_distributor_single {
+	TAILQ_ENTRY(rte_distributor_single) next;    /**< Next in list. */
 
 	char name[RTE_DISTRIBUTOR_NAMESIZE];  /**< Name of the ring. */
 	unsigned int num_workers;             /**< Number of workers polling */
@@ -96,7 +96,7 @@ struct rte_distributor_v20 {
 
 	struct rte_distributor_backlog backlog[RTE_DISTRIB_MAX_WORKERS];
 
-	union rte_distributor_buffer_v20 bufs[RTE_DISTRIB_MAX_WORKERS];
+	union rte_distributor_buffer_single bufs[RTE_DISTRIB_MAX_WORKERS];
 
 	struct rte_distributor_returned_pkts returns;
 };
@@ -154,7 +154,7 @@ struct rte_distributor {
 
 	enum rte_distributor_match_function dist_match_fn;
 
-	struct rte_distributor_v20 *d_v20;
+	struct rte_distributor_single *d_single;
 };
 
 void
diff --git a/lib/librte_distributor/meson.build b/lib/librte_distributor/meson.build
index c9617d7b14..50b91887b5 100644
--- a/lib/librte_distributor/meson.build
+++ b/lib/librte_distributor/meson.build
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-sources = files('rte_distributor.c', 'rte_distributor_v20.c')
+sources = files('rte_distributor.c', 'rte_distributor_single.c')
 if arch_subdir == 'x86'
 	sources += files('rte_distributor_match_sse.c')
 else
diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index a4c8ff6a96..6c5b0c86e8 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -17,7 +17,7 @@
 #include <rte_tailq.h>
 
 #include "rte_distributor.h"
-#include "rte_distributor_v20.h"
+#include "rte_distributor_single.h"
 #include "distributor_private.h"
 
 TAILQ_HEAD(rte_dist_burst_list, rte_distributor);
@@ -42,7 +42,7 @@ rte_distributor_request_pkt(struct rte_distributor *d,
 	volatile int64_t *retptr64;
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
-		rte_distributor_request_pkt_v20(d->d_v20,
+		rte_distributor_request_pkt_single(d->d_single,
 			worker_id, oldpkt[0]);
 		return;
 	}
@@ -93,7 +93,8 @@ rte_distributor_poll_pkt(struct rte_distributor *d,
 	unsigned int i;
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
-		pkts[0] = rte_distributor_poll_pkt_v20(d->d_v20, worker_id);
+		pkts[0] = rte_distributor_poll_pkt_single(d->d_single,
+			worker_id);
 		return (pkts[0]) ? 1 : 0;
 	}
 
@@ -133,7 +134,7 @@ rte_distributor_get_pkt(struct rte_distributor *d,
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
 		if (return_count <= 1) {
-			pkts[0] = rte_distributor_get_pkt_v20(d->d_v20,
+			pkts[0] = rte_distributor_get_pkt_single(d->d_single,
 				worker_id, oldpkt[0]);
 			return (pkts[0]) ? 1 : 0;
 		} else
@@ -163,7 +164,7 @@ rte_distributor_return_pkt(struct rte_distributor *d,
 
 	if (unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {
 		if (num == 1)
-			return rte_distributor_return_pkt_v20(d->d_v20,
+			return rte_distributor_return_pkt_single(d->d_single,
 				worker_id, oldpkt[0]);
 		else
 			return -EINVAL;
@@ -354,7 +355,8 @@ rte_distributor_process(struct rte_distributor *d,
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_process_v20(d->d_v20, mbufs, num_mbufs);
+		return rte_distributor_process_single(d->d_single,
+			mbufs, num_mbufs);
 	}
 
 	if (unlikely(num_mbufs == 0)) {
@@ -494,7 +496,7 @@ rte_distributor_returned_pkts(struct rte_distributor *d,
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_returned_pkts_v20(d->d_v20,
+		return rte_distributor_returned_pkts_single(d->d_single,
 				mbufs, max_mbufs);
 	}
 
@@ -537,7 +539,7 @@ rte_distributor_flush(struct rte_distributor *d)
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		return rte_distributor_flush_v20(d->d_v20);
+		return rte_distributor_flush_single(d->d_single);
 	}
 
 	flushed = total_outstanding(d);
@@ -568,7 +570,7 @@ rte_distributor_clear_returns(struct rte_distributor *d)
 
 	if (d->alg_type == RTE_DIST_ALG_SINGLE) {
 		/* Call the old API */
-		rte_distributor_clear_returns_v20(d->d_v20);
+		rte_distributor_clear_returns_single(d->d_single);
 		return;
 	}
 
@@ -610,9 +612,9 @@ rte_distributor_create(const char *name,
 			rte_errno = ENOMEM;
 			return NULL;
 		}
-		d->d_v20 = rte_distributor_create_v20(name,
+		d->d_single = rte_distributor_create_single(name,
 				socket_id, num_workers);
-		if (d->d_v20 == NULL) {
+		if (d->d_single == NULL) {
 			free(d);
 			/* rte_errno will have been set */
 			return NULL;
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_single.c
similarity index 88%
rename from lib/librte_distributor/rte_distributor_v20.c
rename to lib/librte_distributor/rte_distributor_single.c
index 53fa16d27d..91d8824c64 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_single.c
@@ -15,10 +15,10 @@
 #include <rte_pause.h>
 #include <rte_tailq.h>
 
-#include "rte_distributor_v20.h"
+#include "rte_distributor_single.h"
 #include "distributor_private.h"
 
-TAILQ_HEAD(rte_distributor_list, rte_distributor_v20);
+TAILQ_HEAD(rte_distributor_list, rte_distributor_single);
 
 static struct rte_tailq_elem rte_distributor_tailq = {
 	.name = "RTE_DISTRIBUTOR",
@@ -28,10 +28,10 @@ EAL_REGISTER_TAILQ(rte_distributor_tailq)
 /**** APIs called by workers ****/
 
 void
-rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_request_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	int64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_GET_BUF;
 	while (unlikely(__atomic_load_n(&buf->bufptr64, __ATOMIC_RELAXED)
@@ -43,10 +43,10 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 }
 
 struct rte_mbuf *
-rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_poll_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	/* Sync with distributor. Acquire bufptr64. */
 	if (__atomic_load_n(&buf->bufptr64, __ATOMIC_ACQUIRE)
 		& RTE_DISTRIB_GET_BUF)
@@ -58,21 +58,21 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 }
 
 struct rte_mbuf *
-rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_get_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
 	struct rte_mbuf *ret;
-	rte_distributor_request_pkt_v20(d, worker_id, oldpkt);
-	while ((ret = rte_distributor_poll_pkt_v20(d, worker_id)) == NULL)
+	rte_distributor_request_pkt_single(d, worker_id, oldpkt);
+	while ((ret = rte_distributor_poll_pkt_single(d, worker_id)) == NULL)
 		rte_pause();
 	return ret;
 }
 
 int
-rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_return_pkt_single(struct rte_distributor_single *d,
 		unsigned worker_id, struct rte_mbuf *oldpkt)
 {
-	union rte_distributor_buffer_v20 *buf = &d->bufs[worker_id];
+	union rte_distributor_buffer_single *buf = &d->bufs[worker_id];
 	uint64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_RETURN_BUF;
 	/* Sync with distributor on RETURN_BUF flag. */
@@ -104,7 +104,7 @@ backlog_pop(struct rte_distributor_backlog *bl)
 
 /* stores a packet returned from a worker inside the returns array */
 static inline void
-store_return(uintptr_t oldbuf, struct rte_distributor_v20 *d,
+store_return(uintptr_t oldbuf, struct rte_distributor_single *d,
 		unsigned *ret_start, unsigned *ret_count)
 {
 	/* store returns in a circular buffer - code is branch-free */
@@ -115,7 +115,7 @@ store_return(uintptr_t oldbuf, struct rte_distributor_v20 *d,
 }
 
 static inline void
-handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
+handle_worker_shutdown(struct rte_distributor_single *d, unsigned int wkr)
 {
 	d->in_flight_tags[wkr] = 0;
 	d->in_flight_bitmask &= ~(1UL << wkr);
@@ -146,7 +146,7 @@ handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
 		 * Note that the tags were set before first level call
 		 * to rte_distributor_process.
 		 */
-		rte_distributor_process_v20(d, pkts, i);
+		rte_distributor_process_single(d, pkts, i);
 		bl->count = bl->start = 0;
 	}
 }
@@ -156,7 +156,7 @@ handle_worker_shutdown(struct rte_distributor_v20 *d, unsigned int wkr)
  * to do a partial flush.
  */
 static int
-process_returns(struct rte_distributor_v20 *d)
+process_returns(struct rte_distributor_single *d)
 {
 	unsigned wkr;
 	unsigned flushed = 0;
@@ -201,7 +201,7 @@ process_returns(struct rte_distributor_v20 *d)
 
 /* process a set of packets to distribute them to workers */
 int
-rte_distributor_process_v20(struct rte_distributor_v20 *d,
+rte_distributor_process_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned num_mbufs)
 {
 	unsigned next_idx = 0;
@@ -317,7 +317,7 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 
 /* return to the caller, packets returned from workers */
 int
-rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
+rte_distributor_returned_pkts_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned max_mbufs)
 {
 	struct rte_distributor_returned_pkts *returns = &d->returns;
@@ -339,7 +339,7 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
  * being worked on or queued up in a backlog.
  */
 static inline unsigned
-total_outstanding(const struct rte_distributor_v20 *d)
+total_outstanding(const struct rte_distributor_single *d)
 {
 	unsigned wkr, total_outstanding;
 
@@ -354,19 +354,19 @@ total_outstanding(const struct rte_distributor_v20 *d)
 /* flush the distributor, so that there are no outstanding packets in flight or
  * queued up. */
 int
-rte_distributor_flush_v20(struct rte_distributor_v20 *d)
+rte_distributor_flush_single(struct rte_distributor_single *d)
 {
 	const unsigned flushed = total_outstanding(d);
 
 	while (total_outstanding(d) > 0)
-		rte_distributor_process_v20(d, NULL, 0);
+		rte_distributor_process_single(d, NULL, 0);
 
 	return flushed;
 }
 
 /* clears the internal returns array in the distributor */
 void
-rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
+rte_distributor_clear_returns_single(struct rte_distributor_single *d)
 {
 	d->returns.start = d->returns.count = 0;
 #ifndef __OPTIMIZE__
@@ -375,12 +375,12 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 }
 
 /* creates a distributor instance */
-struct rte_distributor_v20 *
-rte_distributor_create_v20(const char *name,
+struct rte_distributor_single *
+rte_distributor_create_single(const char *name,
 		unsigned socket_id,
 		unsigned num_workers)
 {
-	struct rte_distributor_v20 *d;
+	struct rte_distributor_single *d;
 	struct rte_distributor_list *distributor_list;
 	char mz_name[RTE_MEMZONE_NAMESIZE];
 	const struct rte_memzone *mz;
diff --git a/lib/librte_distributor/rte_distributor_v20.h b/lib/librte_distributor/rte_distributor_single.h
similarity index 89%
rename from lib/librte_distributor/rte_distributor_v20.h
rename to lib/librte_distributor/rte_distributor_single.h
index 12865658ba..2f80aa43d1 100644
--- a/lib/librte_distributor/rte_distributor_v20.h
+++ b/lib/librte_distributor/rte_distributor_single.h
@@ -2,8 +2,8 @@
  * Copyright(c) 2010-2014 Intel Corporation
  */
 
-#ifndef _RTE_DISTRIB_V20_H_
-#define _RTE_DISTRIB_V20_H_
+#ifndef _RTE_DISTRIB_SINGLE_H_
+#define _RTE_DISTRIB_SINGLE_H_
 
 /**
  * @file
@@ -19,7 +19,7 @@ extern "C" {
 
 #define RTE_DISTRIBUTOR_NAMESIZE 32 /**< Length of name for instance */
 
-struct rte_distributor_v20;
+struct rte_distributor_single;
 struct rte_mbuf;
 
 /**
@@ -38,8 +38,8 @@ struct rte_mbuf;
  * @return
  *   The newly created distributor instance
  */
-struct rte_distributor_v20 *
-rte_distributor_create_v20(const char *name, unsigned int socket_id,
+struct rte_distributor_single *
+rte_distributor_create_single(const char *name, unsigned int socket_id,
 		unsigned int num_workers);
 
 /*  *** APIS to be called on the distributor lcore ***  */
@@ -74,7 +74,7 @@ rte_distributor_create_v20(const char *name, unsigned int socket_id,
  *   The number of mbufs processed.
  */
 int
-rte_distributor_process_v20(struct rte_distributor_v20 *d,
+rte_distributor_process_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs);
 
 /**
@@ -92,7 +92,7 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
  *   The number of mbufs returned in the mbufs array.
  */
 int
-rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
+rte_distributor_returned_pkts_single(struct rte_distributor_single *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs);
 
 /**
@@ -107,7 +107,7 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
  *   The number of queued/in-flight packets that were completed by this call.
  */
 int
-rte_distributor_flush_v20(struct rte_distributor_v20 *d);
+rte_distributor_flush_single(struct rte_distributor_single *d);
 
 /**
  * Clears the array of returned packets used as the source for the
@@ -119,7 +119,7 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d);
  *   The distributor instance to be used
  */
 void
-rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d);
+rte_distributor_clear_returns_single(struct rte_distributor_single *d);
 
 /*  *** APIS to be called on the worker lcores ***  */
 /*
@@ -148,7 +148,7 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d);
  *   A new packet to be processed by the worker thread.
  */
 struct rte_mbuf *
-rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_get_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *oldpkt);
 
 /**
@@ -164,7 +164,7 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
  *   The previous packet being processed by the worker
  */
 int
-rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_return_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *mbuf);
 
 /**
@@ -188,7 +188,7 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
  *   The previous packet, if any, being processed by the worker
  */
 void
-rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_request_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id, struct rte_mbuf *oldpkt);
 
 /**
@@ -208,7 +208,7 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
  *   packet is yet available.
  */
 struct rte_mbuf *
-rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
+rte_distributor_poll_pkt_single(struct rte_distributor_single *d,
 		unsigned int worker_id);
 
 #ifdef __cplusplus
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
index 3a285b394e..00e26b4804 100644
--- a/lib/librte_distributor/rte_distributor_version.map
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -1,19 +1,3 @@
-DPDK_2.0 {
-	global:
-
-	rte_distributor_clear_returns;
-	rte_distributor_create;
-	rte_distributor_flush;
-	rte_distributor_get_pkt;
-	rte_distributor_poll_pkt;
-	rte_distributor_process;
-	rte_distributor_request_pkt;
-	rte_distributor_return_pkt;
-	rte_distributor_returned_pkts;
-
-	local: *;
-};
-
 DPDK_17.05 {
 	global:
 
@@ -26,4 +10,4 @@ DPDK_17.05 {
 	rte_distributor_request_pkt;
 	rte_distributor_return_pkt;
 	rte_distributor_returned_pkts;
-} DPDK_2.0;
+};
-- 
2.17.1

^ permalink raw reply	[relevance 6%]

* [dpdk-dev] [PATCH v6 06/10] distributor: remove deprecated code
                       ` (6 preceding siblings ...)
  2019-11-06 16:54  2%   ` [dpdk-dev] [PATCH v6 05/10] lpm: " Anatoly Burakov
@ 2019-11-06 16:54  4%   ` Anatoly Burakov
  2019-11-06 16:54  6%   ` [dpdk-dev] [PATCH v6 07/10] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
                     ` (3 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, David Hunt, john.mcnamara, ray.kinsella,
	bruce.richardson, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
---

Notes:
    v5:
    - Fixed shared library linking error due to versioning still enabled
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage
    
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_distributor/rte_distributor.c      | 56 +++--------------
 .../rte_distributor_v1705.h                   | 61 -------------------
 lib/librte_distributor/rte_distributor_v20.c  |  9 ---
 3 files changed, 9 insertions(+), 117 deletions(-)
 delete mode 100644 lib/librte_distributor/rte_distributor_v1705.h

diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index 7df97df92d..a4c8ff6a96 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -18,7 +18,6 @@
 
 #include "rte_distributor.h"
 #include "rte_distributor_v20.h"
-#include "rte_distributor_v1705.h"
 #include "distributor_private.h"
 
 TAILQ_HEAD(rte_dist_burst_list, rte_distributor);
@@ -33,7 +32,7 @@ EAL_REGISTER_TAILQ(rte_dist_burst_tailq)
 /**** Burst Packet APIs called by workers ****/
 
 void
-rte_distributor_request_pkt_v1705(struct rte_distributor *d,
+rte_distributor_request_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt,
 		unsigned int count)
 {
@@ -83,14 +82,9 @@ rte_distributor_request_pkt_v1705(struct rte_distributor *d,
 	__atomic_store_n(retptr64, *retptr64 | RTE_DISTRIB_GET_BUF,
 			__ATOMIC_RELEASE);
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_request_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(void rte_distributor_request_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt,
-		unsigned int count),
-		rte_distributor_request_pkt_v1705);
 
 int
-rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
+rte_distributor_poll_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts)
 {
 	struct rte_distributor_buffer *buf = &d->bufs[worker_id];
@@ -129,13 +123,9 @@ rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
 
 	return count;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_poll_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_poll_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **pkts),
-		rte_distributor_poll_pkt_v1705);
 
 int
-rte_distributor_get_pkt_v1705(struct rte_distributor *d,
+rte_distributor_get_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **pkts,
 		struct rte_mbuf **oldpkt, unsigned int return_count)
 {
@@ -163,14 +153,9 @@ rte_distributor_get_pkt_v1705(struct rte_distributor *d,
 	}
 	return count;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_get_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_get_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **pkts,
-		struct rte_mbuf **oldpkt, unsigned int return_count),
-		rte_distributor_get_pkt_v1705);
 
 int
-rte_distributor_return_pkt_v1705(struct rte_distributor *d,
+rte_distributor_return_pkt(struct rte_distributor *d,
 		unsigned int worker_id, struct rte_mbuf **oldpkt, int num)
 {
 	struct rte_distributor_buffer *buf = &d->bufs[worker_id];
@@ -202,10 +187,6 @@ rte_distributor_return_pkt_v1705(struct rte_distributor *d,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_return_pkt, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_return_pkt(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt, int num),
-		rte_distributor_return_pkt_v1705);
 
 /**** APIs called on distributor core ***/
 
@@ -360,7 +341,7 @@ release(struct rte_distributor *d, unsigned int wkr)
 
 /* process a set of packets to distribute them to workers */
 int
-rte_distributor_process_v1705(struct rte_distributor *d,
+rte_distributor_process(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int num_mbufs)
 {
 	unsigned int next_idx = 0;
@@ -500,14 +481,10 @@ rte_distributor_process_v1705(struct rte_distributor *d,
 
 	return num_mbufs;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_process, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_process(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int num_mbufs),
-		rte_distributor_process_v1705);
 
 /* return to the caller, packets returned from workers */
 int
-rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
+rte_distributor_returned_pkts(struct rte_distributor *d,
 		struct rte_mbuf **mbufs, unsigned int max_mbufs)
 {
 	struct rte_distributor_returned_pkts *returns = &d->returns;
@@ -532,10 +509,6 @@ rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
 
 	return retval;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_returned_pkts, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_returned_pkts(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int max_mbufs),
-		rte_distributor_returned_pkts_v1705);
 
 /*
  * Return the number of packets in-flight in a distributor, i.e. packets
@@ -557,7 +530,7 @@ total_outstanding(const struct rte_distributor *d)
  * queued up.
  */
 int
-rte_distributor_flush_v1705(struct rte_distributor *d)
+rte_distributor_flush(struct rte_distributor *d)
 {
 	unsigned int flushed;
 	unsigned int wkr;
@@ -586,13 +559,10 @@ rte_distributor_flush_v1705(struct rte_distributor *d)
 
 	return flushed;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_flush, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_distributor_flush(struct rte_distributor *d),
-		rte_distributor_flush_v1705);
 
 /* clears the internal returns array in the distributor */
 void
-rte_distributor_clear_returns_v1705(struct rte_distributor *d)
+rte_distributor_clear_returns(struct rte_distributor *d)
 {
 	unsigned int wkr;
 
@@ -608,13 +578,10 @@ rte_distributor_clear_returns_v1705(struct rte_distributor *d)
 		__atomic_store_n(&(d->bufs[wkr].retptr64[0]), 0,
 				__ATOMIC_RELEASE);
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_clear_returns, _v1705, 17.05);
-MAP_STATIC_SYMBOL(void rte_distributor_clear_returns(struct rte_distributor *d),
-		rte_distributor_clear_returns_v1705);
 
 /* creates a distributor instance */
 struct rte_distributor *
-rte_distributor_create_v1705(const char *name,
+rte_distributor_create(const char *name,
 		unsigned int socket_id,
 		unsigned int num_workers,
 		unsigned int alg_type)
@@ -688,8 +655,3 @@ rte_distributor_create_v1705(const char *name,
 
 	return d;
 }
-BIND_DEFAULT_SYMBOL(rte_distributor_create, _v1705, 17.05);
-MAP_STATIC_SYMBOL(struct rte_distributor *rte_distributor_create(
-		const char *name, unsigned int socket_id,
-		unsigned int num_workers, unsigned int alg_type),
-		rte_distributor_create_v1705);
diff --git a/lib/librte_distributor/rte_distributor_v1705.h b/lib/librte_distributor/rte_distributor_v1705.h
deleted file mode 100644
index df4d9e8150..0000000000
--- a/lib/librte_distributor/rte_distributor_v1705.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef _RTE_DISTRIB_V1705_H_
-#define _RTE_DISTRIB_V1705_H_
-
-/**
- * @file
- * RTE distributor
- *
- * The distributor is a component which is designed to pass packets
- * one-at-a-time to workers, with dynamic load balancing.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct rte_distributor *
-rte_distributor_create_v1705(const char *name, unsigned int socket_id,
-		unsigned int num_workers,
-		unsigned int alg_type);
-
-int
-rte_distributor_process_v1705(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int num_mbufs);
-
-int
-rte_distributor_returned_pkts_v1705(struct rte_distributor *d,
-		struct rte_mbuf **mbufs, unsigned int max_mbufs);
-
-int
-rte_distributor_flush_v1705(struct rte_distributor *d);
-
-void
-rte_distributor_clear_returns_v1705(struct rte_distributor *d);
-
-int
-rte_distributor_get_pkt_v1705(struct rte_distributor *d,
-	unsigned int worker_id, struct rte_mbuf **pkts,
-	struct rte_mbuf **oldpkt, unsigned int retcount);
-
-int
-rte_distributor_return_pkt_v1705(struct rte_distributor *d,
-	unsigned int worker_id, struct rte_mbuf **oldpkt, int num);
-
-void
-rte_distributor_request_pkt_v1705(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **oldpkt,
-		unsigned int count);
-
-int
-rte_distributor_poll_pkt_v1705(struct rte_distributor *d,
-		unsigned int worker_id, struct rte_mbuf **mbufs);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_v20.c
index db6c49258a..53fa16d27d 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_v20.c
@@ -41,7 +41,6 @@ rte_distributor_request_pkt_v20(struct rte_distributor_v20 *d,
 	/* Sync with distributor on GET_BUF flag. */
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 }
-VERSION_SYMBOL(rte_distributor_request_pkt, _v20, 2.0);
 
 struct rte_mbuf *
 rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
@@ -57,7 +56,6 @@ rte_distributor_poll_pkt_v20(struct rte_distributor_v20 *d,
 	int64_t ret = buf->bufptr64 >> RTE_DISTRIB_FLAG_BITS;
 	return (struct rte_mbuf *)((uintptr_t)ret);
 }
-VERSION_SYMBOL(rte_distributor_poll_pkt, _v20, 2.0);
 
 struct rte_mbuf *
 rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
@@ -69,7 +67,6 @@ rte_distributor_get_pkt_v20(struct rte_distributor_v20 *d,
 		rte_pause();
 	return ret;
 }
-VERSION_SYMBOL(rte_distributor_get_pkt, _v20, 2.0);
 
 int
 rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
@@ -82,7 +79,6 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
 	return 0;
 }
-VERSION_SYMBOL(rte_distributor_return_pkt, _v20, 2.0);
 
 /**** APIs called on distributor core ***/
 
@@ -318,7 +314,6 @@ rte_distributor_process_v20(struct rte_distributor_v20 *d,
 	d->returns.count = ret_count;
 	return num_mbufs;
 }
-VERSION_SYMBOL(rte_distributor_process, _v20, 2.0);
 
 /* return to the caller, packets returned from workers */
 int
@@ -339,7 +334,6 @@ rte_distributor_returned_pkts_v20(struct rte_distributor_v20 *d,
 
 	return retval;
 }
-VERSION_SYMBOL(rte_distributor_returned_pkts, _v20, 2.0);
 
 /* return the number of packets in-flight in a distributor, i.e. packets
  * being worked on or queued up in a backlog.
@@ -369,7 +363,6 @@ rte_distributor_flush_v20(struct rte_distributor_v20 *d)
 
 	return flushed;
 }
-VERSION_SYMBOL(rte_distributor_flush, _v20, 2.0);
 
 /* clears the internal returns array in the distributor */
 void
@@ -380,7 +373,6 @@ rte_distributor_clear_returns_v20(struct rte_distributor_v20 *d)
 	memset(d->returns.mbufs, 0, sizeof(d->returns.mbufs));
 #endif
 }
-VERSION_SYMBOL(rte_distributor_clear_returns, _v20, 2.0);
 
 /* creates a distributor instance */
 struct rte_distributor_v20 *
@@ -424,4 +416,3 @@ rte_distributor_create_v20(const char *name,
 
 	return d;
 }
-VERSION_SYMBOL(rte_distributor_create, _v20, 2.0);
-- 
2.17.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v6 05/10] lpm: remove deprecated code
                       ` (5 preceding siblings ...)
  2019-11-06 16:54  4%   ` [dpdk-dev] [PATCH v6 04/10] timer: remove deprecated code Anatoly Burakov
@ 2019-11-06 16:54  2%   ` Anatoly Burakov
  2019-11-06 16:54  4%   ` [dpdk-dev] [PATCH v6 06/10] distributor: " Anatoly Burakov
                     ` (4 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Bruce Richardson, Vladimir Medvedkin,
	john.mcnamara, ray.kinsella, thomas, david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_lpm/rte_lpm.c  | 996 ++------------------------------------
 lib/librte_lpm/rte_lpm.h  |  88 ----
 lib/librte_lpm/rte_lpm6.c | 132 +----
 lib/librte_lpm/rte_lpm6.h |  25 -
 4 files changed, 48 insertions(+), 1193 deletions(-)

diff --git a/lib/librte_lpm/rte_lpm.c b/lib/librte_lpm/rte_lpm.c
index c96395e269..b78c487447 100644
--- a/lib/librte_lpm/rte_lpm.c
+++ b/lib/librte_lpm/rte_lpm.c
@@ -90,34 +90,8 @@ depth_to_range(uint8_t depth)
 /*
  * Find an existing lpm table and return a pointer to it.
  */
-struct rte_lpm_v20 *
-rte_lpm_find_existing_v20(const char *name)
-{
-	struct rte_lpm_v20 *l = NULL;
-	struct rte_tailq_entry *te;
-	struct rte_lpm_list *lpm_list;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	rte_mcfg_tailq_read_lock();
-	TAILQ_FOREACH(te, lpm_list, next) {
-		l = te->data;
-		if (strncmp(name, l->name, RTE_LPM_NAMESIZE) == 0)
-			break;
-	}
-	rte_mcfg_tailq_read_unlock();
-
-	if (te == NULL) {
-		rte_errno = ENOENT;
-		return NULL;
-	}
-
-	return l;
-}
-VERSION_SYMBOL(rte_lpm_find_existing, _v20, 2.0);
-
 struct rte_lpm *
-rte_lpm_find_existing_v1604(const char *name)
+rte_lpm_find_existing(const char *name)
 {
 	struct rte_lpm *l = NULL;
 	struct rte_tailq_entry *te;
@@ -140,88 +114,12 @@ rte_lpm_find_existing_v1604(const char *name)
 
 	return l;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_find_existing, _v1604, 16.04);
-MAP_STATIC_SYMBOL(struct rte_lpm *rte_lpm_find_existing(const char *name),
-		rte_lpm_find_existing_v1604);
 
 /*
  * Allocates memory for LPM object
  */
-struct rte_lpm_v20 *
-rte_lpm_create_v20(const char *name, int socket_id, int max_rules,
-		__rte_unused int flags)
-{
-	char mem_name[RTE_LPM_NAMESIZE];
-	struct rte_lpm_v20 *lpm = NULL;
-	struct rte_tailq_entry *te;
-	uint32_t mem_size;
-	struct rte_lpm_list *lpm_list;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	RTE_BUILD_BUG_ON(sizeof(struct rte_lpm_tbl_entry_v20) != 2);
-
-	/* Check user arguments. */
-	if ((name == NULL) || (socket_id < -1) || (max_rules == 0)) {
-		rte_errno = EINVAL;
-		return NULL;
-	}
-
-	snprintf(mem_name, sizeof(mem_name), "LPM_%s", name);
-
-	/* Determine the amount of memory to allocate. */
-	mem_size = sizeof(*lpm) + (sizeof(lpm->rules_tbl[0]) * max_rules);
-
-	rte_mcfg_tailq_write_lock();
-
-	/* guarantee there's no existing */
-	TAILQ_FOREACH(te, lpm_list, next) {
-		lpm = te->data;
-		if (strncmp(name, lpm->name, RTE_LPM_NAMESIZE) == 0)
-			break;
-	}
-
-	if (te != NULL) {
-		lpm = NULL;
-		rte_errno = EEXIST;
-		goto exit;
-	}
-
-	/* allocate tailq entry */
-	te = rte_zmalloc("LPM_TAILQ_ENTRY", sizeof(*te), 0);
-	if (te == NULL) {
-		RTE_LOG(ERR, LPM, "Failed to allocate tailq entry\n");
-		rte_errno = ENOMEM;
-		goto exit;
-	}
-
-	/* Allocate memory to store the LPM data structures. */
-	lpm = rte_zmalloc_socket(mem_name, mem_size,
-			RTE_CACHE_LINE_SIZE, socket_id);
-	if (lpm == NULL) {
-		RTE_LOG(ERR, LPM, "LPM memory allocation failed\n");
-		rte_free(te);
-		rte_errno = ENOMEM;
-		goto exit;
-	}
-
-	/* Save user arguments. */
-	lpm->max_rules = max_rules;
-	strlcpy(lpm->name, name, sizeof(lpm->name));
-
-	te->data = lpm;
-
-	TAILQ_INSERT_TAIL(lpm_list, te, next);
-
-exit:
-	rte_mcfg_tailq_write_unlock();
-
-	return lpm;
-}
-VERSION_SYMBOL(rte_lpm_create, _v20, 2.0);
-
 struct rte_lpm *
-rte_lpm_create_v1604(const char *name, int socket_id,
+rte_lpm_create(const char *name, int socket_id,
 		const struct rte_lpm_config *config)
 {
 	char mem_name[RTE_LPM_NAMESIZE];
@@ -321,45 +219,12 @@ rte_lpm_create_v1604(const char *name, int socket_id,
 
 	return lpm;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_create, _v1604, 16.04);
-MAP_STATIC_SYMBOL(
-	struct rte_lpm *rte_lpm_create(const char *name, int socket_id,
-			const struct rte_lpm_config *config), rte_lpm_create_v1604);
 
 /*
  * Deallocates memory for given LPM table.
  */
 void
-rte_lpm_free_v20(struct rte_lpm_v20 *lpm)
-{
-	struct rte_lpm_list *lpm_list;
-	struct rte_tailq_entry *te;
-
-	/* Check user arguments. */
-	if (lpm == NULL)
-		return;
-
-	lpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);
-
-	rte_mcfg_tailq_write_lock();
-
-	/* find our tailq entry */
-	TAILQ_FOREACH(te, lpm_list, next) {
-		if (te->data == (void *) lpm)
-			break;
-	}
-	if (te != NULL)
-		TAILQ_REMOVE(lpm_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	rte_free(lpm);
-	rte_free(te);
-}
-VERSION_SYMBOL(rte_lpm_free, _v20, 2.0);
-
-void
-rte_lpm_free_v1604(struct rte_lpm *lpm)
+rte_lpm_free(struct rte_lpm *lpm)
 {
 	struct rte_lpm_list *lpm_list;
 	struct rte_tailq_entry *te;
@@ -387,9 +252,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm)
 	rte_free(lpm);
 	rte_free(te);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_free, _v1604, 16.04);
-MAP_STATIC_SYMBOL(void rte_lpm_free(struct rte_lpm *lpm),
-		rte_lpm_free_v1604);
 
 /*
  * Adds a rule to the rule table.
@@ -402,79 +264,7 @@ MAP_STATIC_SYMBOL(void rte_lpm_free(struct rte_lpm *lpm),
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static int32_t
-rule_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth,
-	uint8_t next_hop)
-{
-	uint32_t rule_gindex, rule_index, last_rule;
-	int i;
-
-	VERIFY_DEPTH(depth);
-
-	/* Scan through rule group to see if rule already exists. */
-	if (lpm->rule_info[depth - 1].used_rules > 0) {
-
-		/* rule_gindex stands for rule group index. */
-		rule_gindex = lpm->rule_info[depth - 1].first_rule;
-		/* Initialise rule_index to point to start of rule group. */
-		rule_index = rule_gindex;
-		/* Last rule = Last used rule in this rule group. */
-		last_rule = rule_gindex + lpm->rule_info[depth - 1].used_rules;
-
-		for (; rule_index < last_rule; rule_index++) {
-
-			/* If rule already exists update its next_hop and return. */
-			if (lpm->rules_tbl[rule_index].ip == ip_masked) {
-				lpm->rules_tbl[rule_index].next_hop = next_hop;
-
-				return rule_index;
-			}
-		}
-
-		if (rule_index == lpm->max_rules)
-			return -ENOSPC;
-	} else {
-		/* Calculate the position in which the rule will be stored. */
-		rule_index = 0;
-
-		for (i = depth - 1; i > 0; i--) {
-			if (lpm->rule_info[i - 1].used_rules > 0) {
-				rule_index = lpm->rule_info[i - 1].first_rule
-						+ lpm->rule_info[i - 1].used_rules;
-				break;
-			}
-		}
-		if (rule_index == lpm->max_rules)
-			return -ENOSPC;
-
-		lpm->rule_info[depth - 1].first_rule = rule_index;
-	}
-
-	/* Make room for the new rule in the array. */
-	for (i = RTE_LPM_MAX_DEPTH; i > depth; i--) {
-		if (lpm->rule_info[i - 1].first_rule
-				+ lpm->rule_info[i - 1].used_rules == lpm->max_rules)
-			return -ENOSPC;
-
-		if (lpm->rule_info[i - 1].used_rules > 0) {
-			lpm->rules_tbl[lpm->rule_info[i - 1].first_rule
-				+ lpm->rule_info[i - 1].used_rules]
-					= lpm->rules_tbl[lpm->rule_info[i - 1].first_rule];
-			lpm->rule_info[i - 1].first_rule++;
-		}
-	}
-
-	/* Add the new rule. */
-	lpm->rules_tbl[rule_index].ip = ip_masked;
-	lpm->rules_tbl[rule_index].next_hop = next_hop;
-
-	/* Increment the used rules counter for this rule group. */
-	lpm->rule_info[depth - 1].used_rules++;
-
-	return rule_index;
-}
-
-static int32_t
-rule_add_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
+rule_add(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 	uint32_t next_hop)
 {
 	uint32_t rule_gindex, rule_index, last_rule;
@@ -550,30 +340,7 @@ rule_add_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static void
-rule_delete_v20(struct rte_lpm_v20 *lpm, int32_t rule_index, uint8_t depth)
-{
-	int i;
-
-	VERIFY_DEPTH(depth);
-
-	lpm->rules_tbl[rule_index] =
-			lpm->rules_tbl[lpm->rule_info[depth - 1].first_rule
-				+ lpm->rule_info[depth - 1].used_rules - 1];
-
-	for (i = depth; i < RTE_LPM_MAX_DEPTH; i++) {
-		if (lpm->rule_info[i].used_rules > 0) {
-			lpm->rules_tbl[lpm->rule_info[i].first_rule - 1] =
-				lpm->rules_tbl[lpm->rule_info[i].first_rule
-					+ lpm->rule_info[i].used_rules - 1];
-			lpm->rule_info[i].first_rule--;
-		}
-	}
-
-	lpm->rule_info[depth - 1].used_rules--;
-}
-
-static void
-rule_delete_v1604(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
+rule_delete(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
 {
 	int i;
 
@@ -600,28 +367,7 @@ rule_delete_v1604(struct rte_lpm *lpm, int32_t rule_index, uint8_t depth)
  * NOTE: Valid range for depth parameter is 1 .. 32 inclusive.
  */
 static int32_t
-rule_find_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth)
-{
-	uint32_t rule_gindex, last_rule, rule_index;
-
-	VERIFY_DEPTH(depth);
-
-	rule_gindex = lpm->rule_info[depth - 1].first_rule;
-	last_rule = rule_gindex + lpm->rule_info[depth - 1].used_rules;
-
-	/* Scan used rules at given depth to find rule. */
-	for (rule_index = rule_gindex; rule_index < last_rule; rule_index++) {
-		/* If rule is found return the rule index. */
-		if (lpm->rules_tbl[rule_index].ip == ip_masked)
-			return rule_index;
-	}
-
-	/* If rule is not found return -EINVAL. */
-	return -EINVAL;
-}
-
-static int32_t
-rule_find_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
+rule_find(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
 {
 	uint32_t rule_gindex, last_rule, rule_index;
 
@@ -645,42 +391,7 @@ rule_find_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth)
  * Find, clean and allocate a tbl8.
  */
 static int32_t
-tbl8_alloc_v20(struct rte_lpm_tbl_entry_v20 *tbl8)
-{
-	uint32_t group_idx; /* tbl8 group index. */
-	struct rte_lpm_tbl_entry_v20 *tbl8_entry;
-
-	/* Scan through tbl8 to find a free (i.e. INVALID) tbl8 group. */
-	for (group_idx = 0; group_idx < RTE_LPM_TBL8_NUM_GROUPS;
-			group_idx++) {
-		tbl8_entry = &tbl8[group_idx * RTE_LPM_TBL8_GROUP_NUM_ENTRIES];
-		/* If a free tbl8 group is found clean it and set as VALID. */
-		if (!tbl8_entry->valid_group) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = INVALID,
-				.depth = 0,
-				.valid_group = VALID,
-			};
-			new_tbl8_entry.next_hop = 0;
-
-			memset(&tbl8_entry[0], 0,
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES *
-					sizeof(tbl8_entry[0]));
-
-			__atomic_store(tbl8_entry, &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-
-			/* Return group index for allocated tbl8 group. */
-			return group_idx;
-		}
-	}
-
-	/* If there are no tbl8 groups free then return error. */
-	return -ENOSPC;
-}
-
-static int32_t
-tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
+tbl8_alloc(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
 {
 	uint32_t group_idx; /* tbl8 group index. */
 	struct rte_lpm_tbl_entry *tbl8_entry;
@@ -714,22 +425,7 @@ tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)
 }
 
 static void
-tbl8_free_v20(struct rte_lpm_tbl_entry_v20 *tbl8, uint32_t tbl8_group_start)
-{
-	/* Set tbl8 group invalid*/
-	struct rte_lpm_tbl_entry_v20 zero_tbl8_entry = {
-		.valid = INVALID,
-		.depth = 0,
-		.valid_group = INVALID,
-	};
-	zero_tbl8_entry.next_hop = 0;
-
-	__atomic_store(&tbl8[tbl8_group_start], &zero_tbl8_entry,
-			__ATOMIC_RELAXED);
-}
-
-static void
-tbl8_free_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
+tbl8_free(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
 {
 	/* Set tbl8 group invalid*/
 	struct rte_lpm_tbl_entry zero_tbl8_entry = {0};
@@ -739,78 +435,7 @@ tbl8_free_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t tbl8_group_start)
 }
 
 static __rte_noinline int32_t
-add_depth_small_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	uint32_t tbl24_index, tbl24_range, tbl8_index, tbl8_group_end, i, j;
-
-	/* Calculate the index into Table24. */
-	tbl24_index = ip >> 8;
-	tbl24_range = depth_to_range(depth);
-
-	for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-		/*
-		 * For invalid OR valid and non-extended tbl 24 entries set
-		 * entry.
-		 */
-		if (!lpm->tbl24[i].valid || (lpm->tbl24[i].valid_group == 0 &&
-				lpm->tbl24[i].depth <= depth)) {
-
-			struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-				.valid = VALID,
-				.valid_group = 0,
-				.depth = depth,
-			};
-			new_tbl24_entry.next_hop = next_hop;
-
-			/* Setting tbl24 entry in one go to avoid race
-			 * conditions
-			 */
-			__atomic_store(&lpm->tbl24[i], &new_tbl24_entry,
-					__ATOMIC_RELEASE);
-
-			continue;
-		}
-
-		if (lpm->tbl24[i].valid_group == 1) {
-			/* If tbl24 entry is valid and extended calculate the
-			 *  index into tbl8.
-			 */
-			tbl8_index = lpm->tbl24[i].group_idx *
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-			tbl8_group_end = tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-			for (j = tbl8_index; j < tbl8_group_end; j++) {
-				if (!lpm->tbl8[j].valid ||
-						lpm->tbl8[j].depth <= depth) {
-					struct rte_lpm_tbl_entry_v20
-						new_tbl8_entry = {
-						.valid = VALID,
-						.valid_group = VALID,
-						.depth = depth,
-					};
-					new_tbl8_entry.next_hop = next_hop;
-
-					/*
-					 * Setting tbl8 entry in one go to avoid
-					 * race conditions
-					 */
-					__atomic_store(&lpm->tbl8[j],
-						&new_tbl8_entry,
-						__ATOMIC_RELAXED);
-
-					continue;
-				}
-			}
-		}
-	}
-
-	return 0;
-}
-
-static __rte_noinline int32_t
-add_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+add_depth_small(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
 #define group_idx next_hop
@@ -882,150 +507,7 @@ add_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 }
 
 static __rte_noinline int32_t
-add_depth_big_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked, uint8_t depth,
-		uint8_t next_hop)
-{
-	uint32_t tbl24_index;
-	int32_t tbl8_group_index, tbl8_group_start, tbl8_group_end, tbl8_index,
-		tbl8_range, i;
-
-	tbl24_index = (ip_masked >> 8);
-	tbl8_range = depth_to_range(depth);
-
-	if (!lpm->tbl24[tbl24_index].valid) {
-		/* Search for a free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v20(lpm->tbl8);
-
-		/* Check tbl8 allocation was successful. */
-		if (tbl8_group_index < 0) {
-			return tbl8_group_index;
-		}
-
-		/* Find index into tbl8 and range. */
-		tbl8_index = (tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES) +
-				(ip_masked & 0xFF);
-
-		/* Set tbl8 entry. */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop = next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		/*
-		 * Update tbl24 entry to point to new tbl8 entry. Note: The
-		 * ext_flag and tbl8_index need to be updated simultaneously,
-		 * so assign whole structure in one go
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.group_idx = (uint8_t)tbl8_group_index,
-			.valid = VALID,
-			.valid_group = 1,
-			.depth = 0,
-		};
-
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
-
-	} /* If valid entry but not extended calculate the index into Table8. */
-	else if (lpm->tbl24[tbl24_index].valid_group == 0) {
-		/* Search for free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v20(lpm->tbl8);
-
-		if (tbl8_group_index < 0) {
-			return tbl8_group_index;
-		}
-
-		tbl8_group_start = tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-		tbl8_group_end = tbl8_group_start +
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-		/* Populate new tbl8 with tbl24 value. */
-		for (i = tbl8_group_start; i < tbl8_group_end; i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = lpm->tbl24[tbl24_index].depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop =
-				lpm->tbl24[tbl24_index].next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-
-		/* Insert new rule into the tbl8 entry. */
-		for (i = tbl8_index; i < tbl8_index + tbl8_range; i++) {
-			struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-				.valid = VALID,
-				.depth = depth,
-				.valid_group = lpm->tbl8[i].valid_group,
-			};
-			new_tbl8_entry.next_hop = next_hop;
-			__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
-		}
-
-		/*
-		 * Update tbl24 entry to point to new tbl8 entry. Note: The
-		 * ext_flag and tbl8_index need to be updated simultaneously,
-		 * so assign whole structure in one go.
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-				.group_idx = (uint8_t)tbl8_group_index,
-				.valid = VALID,
-				.valid_group = 1,
-				.depth = 0,
-		};
-
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
-
-	} else { /*
-		* If it is valid, extended entry calculate the index into tbl8.
-		*/
-		tbl8_group_index = lpm->tbl24[tbl24_index].group_idx;
-		tbl8_group_start = tbl8_group_index *
-				RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-
-			if (!lpm->tbl8[i].valid ||
-					lpm->tbl8[i].depth <= depth) {
-				struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-					.valid = VALID,
-					.depth = depth,
-					.valid_group = lpm->tbl8[i].valid_group,
-				};
-				new_tbl8_entry.next_hop = next_hop;
-				/*
-				 * Setting tbl8 entry in one go to avoid race
-				 * condition
-				 */
-				__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
-
-				continue;
-			}
-		}
-	}
-
-	return 0;
-}
-
-static __rte_noinline int32_t
-add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
+add_depth_big(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 		uint32_t next_hop)
 {
 #define group_idx next_hop
@@ -1038,7 +520,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 
 	if (!lpm->tbl24[tbl24_index].valid) {
 		/* Search for a free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);
+		tbl8_group_index = tbl8_alloc(lpm->tbl8, lpm->number_tbl8s);
 
 		/* Check tbl8 allocation was successful. */
 		if (tbl8_group_index < 0) {
@@ -1084,7 +566,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
 	} /* If valid entry but not extended calculate the index into Table8. */
 	else if (lpm->tbl24[tbl24_index].valid_group == 0) {
 		/* Search for free tbl8 group. */
-		tbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);
+		tbl8_group_index = tbl8_alloc(lpm->tbl8, lpm->number_tbl8s);
 
 		if (tbl8_group_index < 0) {
 			return tbl8_group_index;
@@ -1178,48 +660,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,
  * Add a route
  */
 int
-rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	int32_t rule_index, status = 0;
-	uint32_t ip_masked;
-
-	/* Check user arguments. */
-	if ((lpm == NULL) || (depth < 1) || (depth > RTE_LPM_MAX_DEPTH))
-		return -EINVAL;
-
-	ip_masked = ip & depth_to_mask(depth);
-
-	/* Add the rule to the rule table. */
-	rule_index = rule_add_v20(lpm, ip_masked, depth, next_hop);
-
-	/* If the is no space available for new rule return error. */
-	if (rule_index < 0) {
-		return rule_index;
-	}
-
-	if (depth <= MAX_DEPTH_TBL24) {
-		status = add_depth_small_v20(lpm, ip_masked, depth, next_hop);
-	} else { /* If depth > RTE_LPM_MAX_DEPTH_TBL24 */
-		status = add_depth_big_v20(lpm, ip_masked, depth, next_hop);
-
-		/*
-		 * If add fails due to exhaustion of tbl8 extensions delete
-		 * rule that was added to rule table.
-		 */
-		if (status < 0) {
-			rule_delete_v20(lpm, rule_index, depth);
-
-			return status;
-		}
-	}
-
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm_add, _v20, 2.0);
-
-int
-rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint32_t next_hop)
 {
 	int32_t rule_index, status = 0;
@@ -1232,7 +673,7 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 	ip_masked = ip & depth_to_mask(depth);
 
 	/* Add the rule to the rule table. */
-	rule_index = rule_add_v1604(lpm, ip_masked, depth, next_hop);
+	rule_index = rule_add(lpm, ip_masked, depth, next_hop);
 
 	/* If the is no space available for new rule return error. */
 	if (rule_index < 0) {
@@ -1240,16 +681,16 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 	}
 
 	if (depth <= MAX_DEPTH_TBL24) {
-		status = add_depth_small_v1604(lpm, ip_masked, depth, next_hop);
+		status = add_depth_small(lpm, ip_masked, depth, next_hop);
 	} else { /* If depth > RTE_LPM_MAX_DEPTH_TBL24 */
-		status = add_depth_big_v1604(lpm, ip_masked, depth, next_hop);
+		status = add_depth_big(lpm, ip_masked, depth, next_hop);
 
 		/*
 		 * If add fails due to exhaustion of tbl8 extensions delete
 		 * rule that was added to rule table.
 		 */
 		if (status < 0) {
-			rule_delete_v1604(lpm, rule_index, depth);
+			rule_delete(lpm, rule_index, depth);
 
 			return status;
 		}
@@ -1257,42 +698,12 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_add, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_add(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth, uint32_t next_hop), rte_lpm_add_v1604);
 
 /*
  * Look for a rule in the high-level rules table
  */
 int
-rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-uint8_t *next_hop)
-{
-	uint32_t ip_masked;
-	int32_t rule_index;
-
-	/* Check user arguments. */
-	if ((lpm == NULL) ||
-		(next_hop == NULL) ||
-		(depth < 1) || (depth > RTE_LPM_MAX_DEPTH))
-		return -EINVAL;
-
-	/* Look for the rule using rule_find. */
-	ip_masked = ip & depth_to_mask(depth);
-	rule_index = rule_find_v20(lpm, ip_masked, depth);
-
-	if (rule_index >= 0) {
-		*next_hop = lpm->rules_tbl[rule_index].next_hop;
-		return 1;
-	}
-
-	/* If rule is not found return 0. */
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm_is_rule_present, _v20, 2.0);
-
-int
-rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
+rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop)
 {
 	uint32_t ip_masked;
@@ -1306,7 +717,7 @@ uint32_t *next_hop)
 
 	/* Look for the rule using rule_find. */
 	ip_masked = ip & depth_to_mask(depth);
-	rule_index = rule_find_v1604(lpm, ip_masked, depth);
+	rule_index = rule_find(lpm, ip_masked, depth);
 
 	if (rule_index >= 0) {
 		*next_hop = lpm->rules_tbl[rule_index].next_hop;
@@ -1316,12 +727,9 @@ uint32_t *next_hop)
 	/* If rule is not found return 0. */
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_is_rule_present, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth, uint32_t *next_hop), rte_lpm_is_rule_present_v1604);
 
 static int32_t
-find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
+find_previous_rule(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 		uint8_t *sub_rule_depth)
 {
 	int32_t rule_index;
@@ -1331,7 +739,7 @@ find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 	for (prev_depth = (uint8_t)(depth - 1); prev_depth > 0; prev_depth--) {
 		ip_masked = ip & depth_to_mask(prev_depth);
 
-		rule_index = rule_find_v20(lpm, ip_masked, prev_depth);
+		rule_index = rule_find(lpm, ip_masked, prev_depth);
 
 		if (rule_index >= 0) {
 			*sub_rule_depth = prev_depth;
@@ -1343,133 +751,7 @@ find_previous_rule_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
 }
 
 static int32_t
-find_previous_rule_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-		uint8_t *sub_rule_depth)
-{
-	int32_t rule_index;
-	uint32_t ip_masked;
-	uint8_t prev_depth;
-
-	for (prev_depth = (uint8_t)(depth - 1); prev_depth > 0; prev_depth--) {
-		ip_masked = ip & depth_to_mask(prev_depth);
-
-		rule_index = rule_find_v1604(lpm, ip_masked, prev_depth);
-
-		if (rule_index >= 0) {
-			*sub_rule_depth = prev_depth;
-			return rule_index;
-		}
-	}
-
-	return -1;
-}
-
-static int32_t
-delete_depth_small_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked,
-	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
-{
-	uint32_t tbl24_range, tbl24_index, tbl8_group_index, tbl8_index, i, j;
-
-	/* Calculate the range and index into Table24. */
-	tbl24_range = depth_to_range(depth);
-	tbl24_index = (ip_masked >> 8);
-
-	/*
-	 * Firstly check the sub_rule_index. A -1 indicates no replacement rule
-	 * and a positive number indicates a sub_rule_index.
-	 */
-	if (sub_rule_index < 0) {
-		/*
-		 * If no replacement rule exists then invalidate entries
-		 * associated with this rule.
-		 */
-		for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-
-			if (lpm->tbl24[i].valid_group == 0 &&
-					lpm->tbl24[i].depth <= depth) {
-				struct rte_lpm_tbl_entry_v20
-					zero_tbl24_entry = {
-						.valid = INVALID,
-						.depth = 0,
-						.valid_group = 0,
-					};
-					zero_tbl24_entry.next_hop = 0;
-				__atomic_store(&lpm->tbl24[i],
-					&zero_tbl24_entry, __ATOMIC_RELEASE);
-			} else if (lpm->tbl24[i].valid_group == 1) {
-				/*
-				 * If TBL24 entry is extended, then there has
-				 * to be a rule with depth >= 25 in the
-				 * associated TBL8 group.
-				 */
-
-				tbl8_group_index = lpm->tbl24[i].group_idx;
-				tbl8_index = tbl8_group_index *
-						RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-				for (j = tbl8_index; j < (tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
-
-					if (lpm->tbl8[j].depth <= depth)
-						lpm->tbl8[j].valid = INVALID;
-				}
-			}
-		}
-	} else {
-		/*
-		 * If a replacement rule exists then modify entries
-		 * associated with this rule.
-		 */
-
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.next_hop = lpm->rules_tbl[sub_rule_index].next_hop,
-			.valid = VALID,
-			.valid_group = 0,
-			.depth = sub_rule_depth,
-		};
-
-		struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-			.valid = VALID,
-			.valid_group = VALID,
-			.depth = sub_rule_depth,
-		};
-		new_tbl8_entry.next_hop =
-				lpm->rules_tbl[sub_rule_index].next_hop;
-
-		for (i = tbl24_index; i < (tbl24_index + tbl24_range); i++) {
-
-			if (lpm->tbl24[i].valid_group == 0 &&
-					lpm->tbl24[i].depth <= depth) {
-				__atomic_store(&lpm->tbl24[i], &new_tbl24_entry,
-						__ATOMIC_RELEASE);
-			} else  if (lpm->tbl24[i].valid_group == 1) {
-				/*
-				 * If TBL24 entry is extended, then there has
-				 * to be a rule with depth >= 25 in the
-				 * associated TBL8 group.
-				 */
-
-				tbl8_group_index = lpm->tbl24[i].group_idx;
-				tbl8_index = tbl8_group_index *
-						RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-				for (j = tbl8_index; j < (tbl8_index +
-					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
-
-					if (lpm->tbl8[j].depth <= depth)
-						__atomic_store(&lpm->tbl8[j],
-							&new_tbl8_entry,
-							__ATOMIC_RELAXED);
-				}
-			}
-		}
-	}
-
-	return 0;
-}
-
-static int32_t
-delete_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
+delete_depth_small(struct rte_lpm *lpm, uint32_t ip_masked,
 	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
 {
 #define group_idx next_hop
@@ -1576,7 +858,7 @@ delete_depth_small_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
  * thus can be recycled
  */
 static int32_t
-tbl8_recycle_check_v20(struct rte_lpm_tbl_entry_v20 *tbl8,
+tbl8_recycle_check(struct rte_lpm_tbl_entry *tbl8,
 		uint32_t tbl8_group_start)
 {
 	uint32_t tbl8_group_end, i;
@@ -1623,140 +905,7 @@ tbl8_recycle_check_v20(struct rte_lpm_tbl_entry_v20 *tbl8,
 }
 
 static int32_t
-tbl8_recycle_check_v1604(struct rte_lpm_tbl_entry *tbl8,
-		uint32_t tbl8_group_start)
-{
-	uint32_t tbl8_group_end, i;
-	tbl8_group_end = tbl8_group_start + RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-
-	/*
-	 * Check the first entry of the given tbl8. If it is invalid we know
-	 * this tbl8 does not contain any rule with a depth < RTE_LPM_MAX_DEPTH
-	 *  (As they would affect all entries in a tbl8) and thus this table
-	 *  can not be recycled.
-	 */
-	if (tbl8[tbl8_group_start].valid) {
-		/*
-		 * If first entry is valid check if the depth is less than 24
-		 * and if so check the rest of the entries to verify that they
-		 * are all of this depth.
-		 */
-		if (tbl8[tbl8_group_start].depth <= MAX_DEPTH_TBL24) {
-			for (i = (tbl8_group_start + 1); i < tbl8_group_end;
-					i++) {
-
-				if (tbl8[i].depth !=
-						tbl8[tbl8_group_start].depth) {
-
-					return -EEXIST;
-				}
-			}
-			/* If all entries are the same return the tb8 index */
-			return tbl8_group_start;
-		}
-
-		return -EEXIST;
-	}
-	/*
-	 * If the first entry is invalid check if the rest of the entries in
-	 * the tbl8 are invalid.
-	 */
-	for (i = (tbl8_group_start + 1); i < tbl8_group_end; i++) {
-		if (tbl8[i].valid)
-			return -EEXIST;
-	}
-	/* If no valid entries are found then return -EINVAL. */
-	return -EINVAL;
-}
-
-static int32_t
-delete_depth_big_v20(struct rte_lpm_v20 *lpm, uint32_t ip_masked,
-	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
-{
-	uint32_t tbl24_index, tbl8_group_index, tbl8_group_start, tbl8_index,
-			tbl8_range, i;
-	int32_t tbl8_recycle_index;
-
-	/*
-	 * Calculate the index into tbl24 and range. Note: All depths larger
-	 * than MAX_DEPTH_TBL24 are associated with only one tbl24 entry.
-	 */
-	tbl24_index = ip_masked >> 8;
-
-	/* Calculate the index into tbl8 and range. */
-	tbl8_group_index = lpm->tbl24[tbl24_index].group_idx;
-	tbl8_group_start = tbl8_group_index * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;
-	tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
-	tbl8_range = depth_to_range(depth);
-
-	if (sub_rule_index < 0) {
-		/*
-		 * Loop through the range of entries on tbl8 for which the
-		 * rule_to_delete must be removed or modified.
-		 */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (lpm->tbl8[i].depth <= depth)
-				lpm->tbl8[i].valid = INVALID;
-		}
-	} else {
-		/* Set new tbl8 entry. */
-		struct rte_lpm_tbl_entry_v20 new_tbl8_entry = {
-			.valid = VALID,
-			.depth = sub_rule_depth,
-			.valid_group = lpm->tbl8[tbl8_group_start].valid_group,
-		};
-
-		new_tbl8_entry.next_hop =
-				lpm->rules_tbl[sub_rule_index].next_hop;
-		/*
-		 * Loop through the range of entries on tbl8 for which the
-		 * rule_to_delete must be modified.
-		 */
-		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (lpm->tbl8[i].depth <= depth)
-				__atomic_store(&lpm->tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
-		}
-	}
-
-	/*
-	 * Check if there are any valid entries in this tbl8 group. If all
-	 * tbl8 entries are invalid we can free the tbl8 and invalidate the
-	 * associated tbl24 entry.
-	 */
-
-	tbl8_recycle_index = tbl8_recycle_check_v20(lpm->tbl8, tbl8_group_start);
-
-	if (tbl8_recycle_index == -EINVAL) {
-		/* Set tbl24 before freeing tbl8 to avoid race condition.
-		 * Prevent the free of the tbl8 group from hoisting.
-		 */
-		lpm->tbl24[tbl24_index].valid = 0;
-		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v20(lpm->tbl8, tbl8_group_start);
-	} else if (tbl8_recycle_index > -1) {
-		/* Update tbl24 entry. */
-		struct rte_lpm_tbl_entry_v20 new_tbl24_entry = {
-			.next_hop = lpm->tbl8[tbl8_recycle_index].next_hop,
-			.valid = VALID,
-			.valid_group = 0,
-			.depth = lpm->tbl8[tbl8_recycle_index].depth,
-		};
-
-		/* Set tbl24 before freeing tbl8 to avoid race condition.
-		 * Prevent the free of the tbl8 group from hoisting.
-		 */
-		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELAXED);
-		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v20(lpm->tbl8, tbl8_group_start);
-	}
-
-	return 0;
-}
-
-static int32_t
-delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
+delete_depth_big(struct rte_lpm *lpm, uint32_t ip_masked,
 	uint8_t depth, int32_t sub_rule_index, uint8_t sub_rule_depth)
 {
 #define group_idx next_hop
@@ -1811,7 +960,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 	 * associated tbl24 entry.
 	 */
 
-	tbl8_recycle_index = tbl8_recycle_check_v1604(lpm->tbl8, tbl8_group_start);
+	tbl8_recycle_index = tbl8_recycle_check(lpm->tbl8, tbl8_group_start);
 
 	if (tbl8_recycle_index == -EINVAL) {
 		/* Set tbl24 before freeing tbl8 to avoid race condition.
@@ -1819,7 +968,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 		 */
 		lpm->tbl24[tbl24_index].valid = 0;
 		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v1604(lpm->tbl8, tbl8_group_start);
+		tbl8_free(lpm->tbl8, tbl8_group_start);
 	} else if (tbl8_recycle_index > -1) {
 		/* Update tbl24 entry. */
 		struct rte_lpm_tbl_entry new_tbl24_entry = {
@@ -1835,7 +984,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
 		__atomic_store(&lpm->tbl24[tbl24_index], &new_tbl24_entry,
 				__ATOMIC_RELAXED);
 		__atomic_thread_fence(__ATOMIC_RELEASE);
-		tbl8_free_v1604(lpm->tbl8, tbl8_group_start);
+		tbl8_free(lpm->tbl8, tbl8_group_start);
 	}
 #undef group_idx
 	return 0;
@@ -1845,7 +994,7 @@ delete_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked,
  * Deletes a rule
  */
 int
-rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
+rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
 {
 	int32_t rule_to_delete_index, sub_rule_index;
 	uint32_t ip_masked;
@@ -1864,7 +1013,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 	 * Find the index of the input rule, that needs to be deleted, in the
 	 * rule table.
 	 */
-	rule_to_delete_index = rule_find_v20(lpm, ip_masked, depth);
+	rule_to_delete_index = rule_find(lpm, ip_masked, depth);
 
 	/*
 	 * Check if rule_to_delete_index was found. If no rule was found the
@@ -1874,7 +1023,7 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 		return -EINVAL;
 
 	/* Delete the rule from the rule table. */
-	rule_delete_v20(lpm, rule_to_delete_index, depth);
+	rule_delete(lpm, rule_to_delete_index, depth);
 
 	/*
 	 * Find rule to replace the rule_to_delete. If there is no rule to
@@ -1882,100 +1031,26 @@ rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth)
 	 * entries associated with this rule.
 	 */
 	sub_rule_depth = 0;
-	sub_rule_index = find_previous_rule_v20(lpm, ip, depth, &sub_rule_depth);
+	sub_rule_index = find_previous_rule(lpm, ip, depth, &sub_rule_depth);
 
 	/*
 	 * If the input depth value is less than 25 use function
 	 * delete_depth_small otherwise use delete_depth_big.
 	 */
 	if (depth <= MAX_DEPTH_TBL24) {
-		return delete_depth_small_v20(lpm, ip_masked, depth,
+		return delete_depth_small(lpm, ip_masked, depth,
 				sub_rule_index, sub_rule_depth);
 	} else { /* If depth > MAX_DEPTH_TBL24 */
-		return delete_depth_big_v20(lpm, ip_masked, depth, sub_rule_index,
+		return delete_depth_big(lpm, ip_masked, depth, sub_rule_index,
 				sub_rule_depth);
 	}
 }
-VERSION_SYMBOL(rte_lpm_delete, _v20, 2.0);
-
-int
-rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
-{
-	int32_t rule_to_delete_index, sub_rule_index;
-	uint32_t ip_masked;
-	uint8_t sub_rule_depth;
-	/*
-	 * Check input arguments. Note: IP must be a positive integer of 32
-	 * bits in length therefore it need not be checked.
-	 */
-	if ((lpm == NULL) || (depth < 1) || (depth > RTE_LPM_MAX_DEPTH)) {
-		return -EINVAL;
-	}
-
-	ip_masked = ip & depth_to_mask(depth);
-
-	/*
-	 * Find the index of the input rule, that needs to be deleted, in the
-	 * rule table.
-	 */
-	rule_to_delete_index = rule_find_v1604(lpm, ip_masked, depth);
-
-	/*
-	 * Check if rule_to_delete_index was found. If no rule was found the
-	 * function rule_find returns -EINVAL.
-	 */
-	if (rule_to_delete_index < 0)
-		return -EINVAL;
-
-	/* Delete the rule from the rule table. */
-	rule_delete_v1604(lpm, rule_to_delete_index, depth);
-
-	/*
-	 * Find rule to replace the rule_to_delete. If there is no rule to
-	 * replace the rule_to_delete we return -1 and invalidate the table
-	 * entries associated with this rule.
-	 */
-	sub_rule_depth = 0;
-	sub_rule_index = find_previous_rule_v1604(lpm, ip, depth, &sub_rule_depth);
-
-	/*
-	 * If the input depth value is less than 25 use function
-	 * delete_depth_small otherwise use delete_depth_big.
-	 */
-	if (depth <= MAX_DEPTH_TBL24) {
-		return delete_depth_small_v1604(lpm, ip_masked, depth,
-				sub_rule_index, sub_rule_depth);
-	} else { /* If depth > MAX_DEPTH_TBL24 */
-		return delete_depth_big_v1604(lpm, ip_masked, depth, sub_rule_index,
-				sub_rule_depth);
-	}
-}
-BIND_DEFAULT_SYMBOL(rte_lpm_delete, _v1604, 16.04);
-MAP_STATIC_SYMBOL(int rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip,
-		uint8_t depth), rte_lpm_delete_v1604);
 
 /*
  * Delete all rules from the LPM table.
  */
 void
-rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm)
-{
-	/* Zero rule information. */
-	memset(lpm->rule_info, 0, sizeof(lpm->rule_info));
-
-	/* Zero tbl24. */
-	memset(lpm->tbl24, 0, sizeof(lpm->tbl24));
-
-	/* Zero tbl8. */
-	memset(lpm->tbl8, 0, sizeof(lpm->tbl8));
-
-	/* Delete all rules form the rules table. */
-	memset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);
-}
-VERSION_SYMBOL(rte_lpm_delete_all, _v20, 2.0);
-
-void
-rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
+rte_lpm_delete_all(struct rte_lpm *lpm)
 {
 	/* Zero rule information. */
 	memset(lpm->rule_info, 0, sizeof(lpm->rule_info));
@@ -1990,6 +1065,3 @@ rte_lpm_delete_all_v1604(struct rte_lpm *lpm)
 	/* Delete all rules form the rules table. */
 	memset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm_delete_all, _v1604, 16.04);
-MAP_STATIC_SYMBOL(void rte_lpm_delete_all(struct rte_lpm *lpm),
-		rte_lpm_delete_all_v1604);
diff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h
index 26303e6288..b9d49ac879 100644
--- a/lib/librte_lpm/rte_lpm.h
+++ b/lib/librte_lpm/rte_lpm.h
@@ -64,31 +64,6 @@ extern "C" {
 
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
 /** @internal Tbl24 entry structure. */
-__extension__
-struct rte_lpm_tbl_entry_v20 {
-	/**
-	 * Stores Next hop (tbl8 or tbl24 when valid_group is not set) or
-	 * a group index pointing to a tbl8 structure (tbl24 only, when
-	 * valid_group is set)
-	 */
-	RTE_STD_C11
-	union {
-		uint8_t next_hop;
-		uint8_t group_idx;
-	};
-	/* Using single uint8_t to store 3 values. */
-	uint8_t valid     :1;   /**< Validation flag. */
-	/**
-	 * For tbl24:
-	 *  - valid_group == 0: entry stores a next hop
-	 *  - valid_group == 1: entry stores a group_index pointing to a tbl8
-	 * For tbl8:
-	 *  - valid_group indicates whether the current tbl8 is in use or not
-	 */
-	uint8_t valid_group :1;
-	uint8_t depth       :6; /**< Rule depth. */
-} __rte_aligned(sizeof(uint16_t));
-
 __extension__
 struct rte_lpm_tbl_entry {
 	/**
@@ -111,16 +86,6 @@ struct rte_lpm_tbl_entry {
 };
 
 #else
-__extension__
-struct rte_lpm_tbl_entry_v20 {
-	uint8_t depth       :6;
-	uint8_t valid_group :1;
-	uint8_t valid       :1;
-	union {
-		uint8_t group_idx;
-		uint8_t next_hop;
-	};
-} __rte_aligned(sizeof(uint16_t));
 
 __extension__
 struct rte_lpm_tbl_entry {
@@ -141,11 +106,6 @@ struct rte_lpm_config {
 };
 
 /** @internal Rule structure. */
-struct rte_lpm_rule_v20 {
-	uint32_t ip; /**< Rule IP address. */
-	uint8_t  next_hop; /**< Rule next hop. */
-};
-
 struct rte_lpm_rule {
 	uint32_t ip; /**< Rule IP address. */
 	uint32_t next_hop; /**< Rule next hop. */
@@ -158,21 +118,6 @@ struct rte_lpm_rule_info {
 };
 
 /** @internal LPM structure. */
-struct rte_lpm_v20 {
-	/* LPM metadata. */
-	char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
-	uint32_t max_rules; /**< Max. balanced rules per lpm. */
-	struct rte_lpm_rule_info rule_info[RTE_LPM_MAX_DEPTH]; /**< Rule info table. */
-
-	/* LPM Tables. */
-	struct rte_lpm_tbl_entry_v20 tbl24[RTE_LPM_TBL24_NUM_ENTRIES]
-			__rte_cache_aligned; /**< LPM tbl24 table. */
-	struct rte_lpm_tbl_entry_v20 tbl8[RTE_LPM_TBL8_NUM_ENTRIES]
-			__rte_cache_aligned; /**< LPM tbl8 table. */
-	struct rte_lpm_rule_v20 rules_tbl[]
-			__rte_cache_aligned; /**< LPM rules. */
-};
-
 struct rte_lpm {
 	/* LPM metadata. */
 	char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
@@ -209,11 +154,6 @@ struct rte_lpm {
 struct rte_lpm *
 rte_lpm_create(const char *name, int socket_id,
 		const struct rte_lpm_config *config);
-struct rte_lpm_v20 *
-rte_lpm_create_v20(const char *name, int socket_id, int max_rules, int flags);
-struct rte_lpm *
-rte_lpm_create_v1604(const char *name, int socket_id,
-		const struct rte_lpm_config *config);
 
 /**
  * Find an existing LPM object and return a pointer to it.
@@ -227,10 +167,6 @@ rte_lpm_create_v1604(const char *name, int socket_id,
  */
 struct rte_lpm *
 rte_lpm_find_existing(const char *name);
-struct rte_lpm_v20 *
-rte_lpm_find_existing_v20(const char *name);
-struct rte_lpm *
-rte_lpm_find_existing_v1604(const char *name);
 
 /**
  * Free an LPM object.
@@ -242,10 +178,6 @@ rte_lpm_find_existing_v1604(const char *name);
  */
 void
 rte_lpm_free(struct rte_lpm *lpm);
-void
-rte_lpm_free_v20(struct rte_lpm_v20 *lpm);
-void
-rte_lpm_free_v1604(struct rte_lpm *lpm);
 
 /**
  * Add a rule to the LPM table.
@@ -263,12 +195,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm);
  */
 int
 rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint32_t next_hop);
-int
-rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-		uint8_t next_hop);
-int
-rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-		uint32_t next_hop);
 
 /**
  * Check if a rule is present in the LPM table,
@@ -288,12 +214,6 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 int
 rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
 uint32_t *next_hop);
-int
-rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth,
-uint8_t *next_hop);
-int
-rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
-uint32_t *next_hop);
 
 /**
  * Delete a rule from the LPM table.
@@ -309,10 +229,6 @@ uint32_t *next_hop);
  */
 int
 rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
-int
-rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth);
-int
-rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
 
 /**
  * Delete all rules from the LPM table.
@@ -322,10 +238,6 @@ rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth);
  */
 void
 rte_lpm_delete_all(struct rte_lpm *lpm);
-void
-rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm);
-void
-rte_lpm_delete_all_v1604(struct rte_lpm *lpm);
 
 /**
  * Lookup an IP into the LPM table.
diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c
index e20f824602..c46e557e23 100644
--- a/lib/librte_lpm/rte_lpm6.c
+++ b/lib/librte_lpm/rte_lpm6.c
@@ -809,18 +809,6 @@ add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl,
 	return 1;
 }
 
-/*
- * Add a route
- */
-int
-rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t next_hop)
-{
-	return rte_lpm6_add_v1705(lpm, ip, depth, next_hop);
-}
-VERSION_SYMBOL(rte_lpm6_add, _v20, 2.0);
-
-
 /*
  * Simulate adding a route to LPM
  *
@@ -842,7 +830,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 
 	/* Inspect the first three bytes through tbl24 on the first step. */
 	ret = simulate_add_step(lpm, lpm->tbl24, &tbl_next, masked_ip,
-			ADD_FIRST_BYTE, 1, depth, &need_tbl_nb);
+		ADD_FIRST_BYTE, 1, depth, &need_tbl_nb);
 	total_need_tbl_nb = need_tbl_nb;
 	/*
 	 * Inspect one by one the rest of the bytes until
@@ -851,7 +839,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && ret == 1; i++) {
 		tbl = tbl_next;
 		ret = simulate_add_step(lpm, tbl, &tbl_next, masked_ip, 1,
-				(uint8_t)(i+1), depth, &need_tbl_nb);
+			(uint8_t)(i + 1), depth, &need_tbl_nb);
 		total_need_tbl_nb += need_tbl_nb;
 	}
 
@@ -862,9 +850,12 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth)
 	return 0;
 }
 
+/*
+ * Add a route
+ */
 int
-rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t next_hop)
+rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
+	uint32_t next_hop)
 {
 	struct rte_lpm6_tbl_entry *tbl;
 	struct rte_lpm6_tbl_entry *tbl_next = NULL;
@@ -896,8 +887,8 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 	/* Inspect the first three bytes through tbl24 on the first step. */
 	tbl = lpm->tbl24;
 	status = add_step(lpm, tbl, TBL24_IND, &tbl_next, &tbl_next_num,
-			masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop,
-			is_new_rule);
+		masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop,
+		is_new_rule);
 	assert(status >= 0);
 
 	/*
@@ -907,17 +898,13 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 	for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && status == 1; i++) {
 		tbl = tbl_next;
 		status = add_step(lpm, tbl, tbl_next_num, &tbl_next,
-				&tbl_next_num, masked_ip, 1, (uint8_t)(i+1),
-				depth, next_hop, is_new_rule);
+			&tbl_next_num, masked_ip, 1, (uint8_t)(i + 1),
+			depth, next_hop, is_new_rule);
 		assert(status >= 0);
 	}
 
 	return status;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_add, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip,
-				uint8_t depth, uint32_t next_hop),
-		rte_lpm6_add_v1705);
 
 /*
  * Takes a pointer to a table entry and inspect one level.
@@ -956,25 +943,7 @@ lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl,
  * Looks up an IP
  */
 int
-rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop)
-{
-	uint32_t next_hop32 = 0;
-	int32_t status;
-
-	/* DEBUG: Check user input arguments. */
-	if (next_hop == NULL)
-		return -EINVAL;
-
-	status = rte_lpm6_lookup_v1705(lpm, ip, &next_hop32);
-	if (status == 0)
-		*next_hop = (uint8_t)next_hop32;
-
-	return status;
-}
-VERSION_SYMBOL(rte_lpm6_lookup, _v20, 2.0);
-
-int
-rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
+rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
 		uint32_t *next_hop)
 {
 	const struct rte_lpm6_tbl_entry *tbl;
@@ -1001,56 +970,12 @@ rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
 
 	return status;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_lookup, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip,
-				uint32_t *next_hop), rte_lpm6_lookup_v1705);
 
 /*
  * Looks up a group of IP addresses
  */
 int
-rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int16_t * next_hops, unsigned n)
-{
-	unsigned i;
-	const struct rte_lpm6_tbl_entry *tbl;
-	const struct rte_lpm6_tbl_entry *tbl_next = NULL;
-	uint32_t tbl24_index, next_hop;
-	uint8_t first_byte;
-	int status;
-
-	/* DEBUG: Check user input arguments. */
-	if ((lpm == NULL) || (ips == NULL) || (next_hops == NULL))
-		return -EINVAL;
-
-	for (i = 0; i < n; i++) {
-		first_byte = LOOKUP_FIRST_BYTE;
-		tbl24_index = (ips[i][0] << BYTES2_SIZE) |
-				(ips[i][1] << BYTE_SIZE) | ips[i][2];
-
-		/* Calculate pointer to the first entry to be inspected */
-		tbl = &lpm->tbl24[tbl24_index];
-
-		do {
-			/* Continue inspecting following levels until success or failure */
-			status = lookup_step(lpm, tbl, &tbl_next, ips[i], first_byte++,
-					&next_hop);
-			tbl = tbl_next;
-		} while (status == 1);
-
-		if (status < 0)
-			next_hops[i] = -1;
-		else
-			next_hops[i] = (int16_t)next_hop;
-	}
-
-	return 0;
-}
-VERSION_SYMBOL(rte_lpm6_lookup_bulk_func, _v20, 2.0);
-
-int
-rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
+rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n)
 {
@@ -1090,37 +1015,12 @@ rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
 
 	return 0;
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_lookup_bulk_func, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
-				uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-				int32_t *next_hops, unsigned int n),
-		rte_lpm6_lookup_bulk_func_v1705);
 
 /*
  * Look for a rule in the high-level rules table
  */
 int
-rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t *next_hop)
-{
-	uint32_t next_hop32 = 0;
-	int32_t status;
-
-	/* DEBUG: Check user input arguments. */
-	if (next_hop == NULL)
-		return -EINVAL;
-
-	status = rte_lpm6_is_rule_present_v1705(lpm, ip, depth, &next_hop32);
-	if (status > 0)
-		*next_hop = (uint8_t)next_hop32;
-
-	return status;
-
-}
-VERSION_SYMBOL(rte_lpm6_is_rule_present, _v20, 2.0);
-
-int
-rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
+rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop)
 {
 	uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE];
@@ -1136,10 +1036,6 @@ rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 
 	return rule_find(lpm, masked_ip, depth, next_hop);
 }
-BIND_DEFAULT_SYMBOL(rte_lpm6_is_rule_present, _v1705, 17.05);
-MAP_STATIC_SYMBOL(int rte_lpm6_is_rule_present(struct rte_lpm6 *lpm,
-				uint8_t *ip, uint8_t depth, uint32_t *next_hop),
-		rte_lpm6_is_rule_present_v1705);
 
 /*
  * Delete a rule from the rule table.
diff --git a/lib/librte_lpm/rte_lpm6.h b/lib/librte_lpm/rte_lpm6.h
index 5d59ccb1fe..37dfb20249 100644
--- a/lib/librte_lpm/rte_lpm6.h
+++ b/lib/librte_lpm/rte_lpm6.h
@@ -96,12 +96,6 @@ rte_lpm6_free(struct rte_lpm6 *lpm);
 int
 rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t next_hop);
-int
-rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t next_hop);
-int
-rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t next_hop);
 
 /**
  * Check if a rule is present in the LPM table,
@@ -121,12 +115,6 @@ rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 int
 rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
 		uint32_t *next_hop);
-int
-rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint8_t *next_hop);
-int
-rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
-		uint32_t *next_hop);
 
 /**
  * Delete a rule from the LPM table.
@@ -184,11 +172,6 @@ rte_lpm6_delete_all(struct rte_lpm6 *lpm);
  */
 int
 rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip, uint32_t *next_hop);
-int
-rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop);
-int
-rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
-		uint32_t *next_hop);
 
 /**
  * Lookup multiple IP addresses in an LPM table.
@@ -210,14 +193,6 @@ int
 rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
 		int32_t *next_hops, unsigned int n);
-int
-rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int16_t *next_hops, unsigned int n);
-int
-rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
-		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
-		int32_t *next_hops, unsigned int n);
 
 #ifdef __cplusplus
 }
-- 
2.17.1

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v6 04/10] timer: remove deprecated code
                       ` (4 preceding siblings ...)
  2019-11-06 16:54 23%   ` [dpdk-dev] [PATCH v6 03/10] buildtools: add ABI update shell script Anatoly Burakov
@ 2019-11-06 16:54  4%   ` Anatoly Burakov
  2019-11-06 16:54  2%   ` [dpdk-dev] [PATCH v6 05/10] lpm: " Anatoly Burakov
                     ` (5 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Robert Sanford, Erik Gabriel Carrillo,
	john.mcnamara, ray.kinsella, bruce.richardson, thomas,
	david.marchand

From: Marcin Baran <marcinx.baran@intel.com>

Remove code for old ABI versions ahead of ABI version bump.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
---

Notes:
    v2:
    - Moved this to before ABI version bump to avoid compile breakage

 lib/librte_timer/rte_timer.c | 90 ++----------------------------------
 lib/librte_timer/rte_timer.h | 15 ------
 2 files changed, 5 insertions(+), 100 deletions(-)

diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c
index 3834c94732..ca88454ff6 100644
--- a/lib/librte_timer/rte_timer.c
+++ b/lib/librte_timer/rte_timer.c
@@ -68,9 +68,6 @@ static struct rte_timer_data *rte_timer_data_arr;
 static const uint32_t default_data_id;
 static uint32_t rte_timer_subsystem_initialized;
 
-/* For maintaining older interfaces for a period */
-static struct rte_timer_data default_timer_data;
-
 /* when debug is enabled, store some statistics */
 #ifdef RTE_LIBRTE_TIMER_DEBUG
 #define __TIMER_STAT_ADD(priv_timer, name, n) do {			\
@@ -131,22 +128,6 @@ rte_timer_data_dealloc(uint32_t id)
 	return 0;
 }
 
-void
-rte_timer_subsystem_init_v20(void)
-{
-	unsigned lcore_id;
-	struct priv_timer *priv_timer = default_timer_data.priv_timer;
-
-	/* since priv_timer is static, it's zeroed by default, so only init some
-	 * fields.
-	 */
-	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++) {
-		rte_spinlock_init(&priv_timer[lcore_id].list_lock);
-		priv_timer[lcore_id].prev_lcore = lcore_id;
-	}
-}
-VERSION_SYMBOL(rte_timer_subsystem_init, _v20, 2.0);
-
 /* Init the timer library. Allocate an array of timer data structs in shared
  * memory, and allocate the zeroth entry for use with original timer
  * APIs. Since the intersection of the sets of lcore ids in primary and
@@ -154,7 +135,7 @@ VERSION_SYMBOL(rte_timer_subsystem_init, _v20, 2.0);
  * multiple processes.
  */
 int
-rte_timer_subsystem_init_v1905(void)
+rte_timer_subsystem_init(void)
 {
 	const struct rte_memzone *mz;
 	struct rte_timer_data *data;
@@ -209,9 +190,6 @@ rte_timer_subsystem_init_v1905(void)
 
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_timer_subsystem_init(void),
-		  rte_timer_subsystem_init_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_subsystem_init, _v1905, 19.05);
 
 void
 rte_timer_subsystem_finalize(void)
@@ -552,42 +530,13 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t expire,
 
 /* Reset and start the timer associated with the timer handle tim */
 int
-rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
-		    enum rte_timer_type type, unsigned int tim_lcore,
-		    rte_timer_cb_t fct, void *arg)
-{
-	uint64_t cur_time = rte_get_timer_cycles();
-	uint64_t period;
-
-	if (unlikely((tim_lcore != (unsigned)LCORE_ID_ANY) &&
-			!(rte_lcore_is_enabled(tim_lcore) ||
-			  rte_lcore_has_role(tim_lcore, ROLE_SERVICE))))
-		return -1;
-
-	if (type == PERIODICAL)
-		period = ticks;
-	else
-		period = 0;
-
-	return __rte_timer_reset(tim,  cur_time + ticks, period, tim_lcore,
-			  fct, arg, 0, &default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_reset, _v20, 2.0);
-
-int
-rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
+rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		      enum rte_timer_type type, unsigned int tim_lcore,
 		      rte_timer_cb_t fct, void *arg)
 {
 	return rte_timer_alt_reset(default_data_id, tim, ticks, type,
 				   tim_lcore, fct, arg);
 }
-MAP_STATIC_SYMBOL(int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
-				      enum rte_timer_type type,
-				      unsigned int tim_lcore,
-				      rte_timer_cb_t fct, void *arg),
-		  rte_timer_reset_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_reset, _v1905, 19.05);
 
 int
 rte_timer_alt_reset(uint32_t timer_data_id, struct rte_timer *tim,
@@ -658,20 +607,10 @@ __rte_timer_stop(struct rte_timer *tim, int local_is_locked,
 
 /* Stop the timer associated with the timer handle tim */
 int
-rte_timer_stop_v20(struct rte_timer *tim)
-{
-	return __rte_timer_stop(tim, 0, &default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_stop, _v20, 2.0);
-
-int
-rte_timer_stop_v1905(struct rte_timer *tim)
+rte_timer_stop(struct rte_timer *tim)
 {
 	return rte_timer_alt_stop(default_data_id, tim);
 }
-MAP_STATIC_SYMBOL(int rte_timer_stop(struct rte_timer *tim),
-		  rte_timer_stop_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_stop, _v1905, 19.05);
 
 int
 rte_timer_alt_stop(uint32_t timer_data_id, struct rte_timer *tim)
@@ -817,15 +756,8 @@ __rte_timer_manage(struct rte_timer_data *timer_data)
 	priv_timer[lcore_id].running_tim = NULL;
 }
 
-void
-rte_timer_manage_v20(void)
-{
-	__rte_timer_manage(&default_timer_data);
-}
-VERSION_SYMBOL(rte_timer_manage, _v20, 2.0);
-
 int
-rte_timer_manage_v1905(void)
+rte_timer_manage(void)
 {
 	struct rte_timer_data *timer_data;
 
@@ -835,8 +767,6 @@ rte_timer_manage_v1905(void)
 
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_timer_manage(void), rte_timer_manage_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_manage, _v1905, 19.05);
 
 int
 rte_timer_alt_manage(uint32_t timer_data_id,
@@ -1074,21 +1004,11 @@ __rte_timer_dump_stats(struct rte_timer_data *timer_data __rte_unused, FILE *f)
 #endif
 }
 
-void
-rte_timer_dump_stats_v20(FILE *f)
-{
-	__rte_timer_dump_stats(&default_timer_data, f);
-}
-VERSION_SYMBOL(rte_timer_dump_stats, _v20, 2.0);
-
 int
-rte_timer_dump_stats_v1905(FILE *f)
+rte_timer_dump_stats(FILE *f)
 {
 	return rte_timer_alt_dump_stats(default_data_id, f);
 }
-MAP_STATIC_SYMBOL(int rte_timer_dump_stats(FILE *f),
-		  rte_timer_dump_stats_v1905);
-BIND_DEFAULT_SYMBOL(rte_timer_dump_stats, _v1905, 19.05);
 
 int
 rte_timer_alt_dump_stats(uint32_t timer_data_id __rte_unused, FILE *f)
diff --git a/lib/librte_timer/rte_timer.h b/lib/librte_timer/rte_timer.h
index 05d287d8f2..9dc5fc3092 100644
--- a/lib/librte_timer/rte_timer.h
+++ b/lib/librte_timer/rte_timer.h
@@ -181,8 +181,6 @@ int rte_timer_data_dealloc(uint32_t id);
  *      subsystem
  */
 int rte_timer_subsystem_init(void);
-int rte_timer_subsystem_init_v1905(void);
-void rte_timer_subsystem_init_v20(void);
 
 /**
  * @warning
@@ -250,13 +248,6 @@ void rte_timer_init(struct rte_timer *tim);
 int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		    enum rte_timer_type type, unsigned tim_lcore,
 		    rte_timer_cb_t fct, void *arg);
-int rte_timer_reset_v1905(struct rte_timer *tim, uint64_t ticks,
-			  enum rte_timer_type type, unsigned int tim_lcore,
-			  rte_timer_cb_t fct, void *arg);
-int rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
-			enum rte_timer_type type, unsigned int tim_lcore,
-			rte_timer_cb_t fct, void *arg);
-
 
 /**
  * Loop until rte_timer_reset() succeeds.
@@ -313,8 +304,6 @@ rte_timer_reset_sync(struct rte_timer *tim, uint64_t ticks,
  *   - (-1): The timer is in the RUNNING or CONFIG state.
  */
 int rte_timer_stop(struct rte_timer *tim);
-int rte_timer_stop_v1905(struct rte_timer *tim);
-int rte_timer_stop_v20(struct rte_timer *tim);
 
 /**
  * Loop until rte_timer_stop() succeeds.
@@ -358,8 +347,6 @@ int rte_timer_pending(struct rte_timer *tim);
  *   - -EINVAL: timer subsystem not yet initialized
  */
 int rte_timer_manage(void);
-int rte_timer_manage_v1905(void);
-void rte_timer_manage_v20(void);
 
 /**
  * Dump statistics about timers.
@@ -371,8 +358,6 @@ void rte_timer_manage_v20(void);
  *   - -EINVAL: timer subsystem not yet initialized
  */
 int rte_timer_dump_stats(FILE *f);
-int rte_timer_dump_stats_v1905(FILE *f);
-void rte_timer_dump_stats_v20(FILE *f);
 
 /**
  * @warning
-- 
2.17.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v6 03/10] buildtools: add ABI update shell script
                       ` (3 preceding siblings ...)
  2019-11-06 16:54 15%   ` [dpdk-dev] [PATCH v6 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
@ 2019-11-06 16:54 23%   ` Anatoly Burakov
  2019-11-06 16:54  4%   ` [dpdk-dev] [PATCH v6 04/10] timer: remove deprecated code Anatoly Burakov
                     ` (6 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, ray.kinsella, bruce.richardson, thomas, david.marchand

In order to facilitate mass updating of version files, add a shell
script that recurses into lib/ and drivers/ directories and calls
the ABI version update script.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v3:
    - Switch to sh rather than bash, and remove bash-isms
    - Address review comments
    
    v2:
    - Add this patch to split the shell script from previous commit
    - Fixup miscellaneous bugs

 buildtools/update-abi.sh | 42 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100755 buildtools/update-abi.sh

diff --git a/buildtools/update-abi.sh b/buildtools/update-abi.sh
new file mode 100755
index 0000000000..89ba5804a6
--- /dev/null
+++ b/buildtools/update-abi.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+abi_version=$1
+abi_version_file="./config/ABI_VERSION"
+update_path="lib drivers"
+
+if [ -z "$1" ]; then
+      # output to stderr
+      >&2 echo "Please provide ABI version"
+      exit 1
+fi
+
+# check version string format
+echo $abi_version | grep -q -e "^[[:digit:]]\{1,2\}\.[[:digit:]]\{1,2\}$"
+if [ "$?" -ne 0 ]; then
+      # output to stderr
+      >&2 echo "ABI version must be formatted as MAJOR.MINOR version"
+      exit 1
+fi
+
+if [ -n "$2" ]; then
+      abi_version_file=$2
+fi
+
+if [ -n "$3" ]; then
+      # drop $1 and $2
+      shift 2
+      # assign all other arguments as update paths
+      update_path=$@
+fi
+
+echo "New ABI version:" $abi_version
+echo "ABI_VERSION path:" $abi_version_file
+echo "Path to update:" $update_path
+
+echo $abi_version > $abi_version_file
+
+find $update_path -name  \*version.map -exec \
+      ./buildtools/update_version_map_abi.py {} \
+      $abi_version \; -print
-- 
2.17.1

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v6 02/10] buildtools: add script for updating symbols abi version
                       ` (2 preceding siblings ...)
  2019-11-06 16:54  7%   ` [dpdk-dev] [PATCH v6 01/10] config: change ABI versioning to global Anatoly Burakov
@ 2019-11-06 16:54 15%   ` Anatoly Burakov
  2019-11-06 16:54 23%   ` [dpdk-dev] [PATCH v6 03/10] buildtools: add ABI update shell script Anatoly Burakov
                     ` (7 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Pawel Modrak, john.mcnamara, ray.kinsella, bruce.richardson,
	thomas, david.marchand

From: Pawel Modrak <pawelx.modrak@intel.com>

Add a script that automatically merges all stable ABI's under one
ABI section with the new version, while leaving experimental
section exactly as it is.

Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v6:
    - Split map file generation function in two
    - Do not print stable ABI if it wasn't present
    
    v3:
    - Add comments to regex patterns
    
    v2:
    - Reworked script to be pep8-compliant and more reliable

 buildtools/update_version_map_abi.py | 171 +++++++++++++++++++++++++++
 1 file changed, 171 insertions(+)
 create mode 100755 buildtools/update_version_map_abi.py

diff --git a/buildtools/update_version_map_abi.py b/buildtools/update_version_map_abi.py
new file mode 100755
index 0000000000..6dfc856ed3
--- /dev/null
+++ b/buildtools/update_version_map_abi.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+"""
+A Python program to update the ABI version and function names in a DPDK
+lib_*_version.map file. Called from the buildtools/update_abi.sh utility.
+"""
+
+from __future__ import print_function
+import argparse
+import sys
+import re
+
+
+def __parse_map_file(f_in):
+    # match function name, followed by semicolon, followed by EOL, optionally
+    # with whitespace inbetween each item
+    func_line_regex = re.compile(r"\s*"
+                                 r"(?P<func>[a-zA-Z_0-9]+)"
+                                 r"\s*"
+                                 r";"
+                                 r"\s*"
+                                 r"$")
+    # match section name, followed by opening bracked, followed by EOL,
+    # optionally with whitespace inbetween each item
+    section_begin_regex = re.compile(r"\s*"
+                                     r"(?P<version>[a-zA-Z0-9_\.]+)"
+                                     r"\s*"
+                                     r"{"
+                                     r"\s*"
+                                     r"$")
+    # match closing bracket, optionally followed by section name (for when we
+    # inherit from another ABI version), followed by semicolon, followed by
+    # EOL, optionally with whitespace inbetween each item
+    section_end_regex = re.compile(r"\s*"
+                                   r"}"
+                                   r"\s*"
+                                   r"(?P<parent>[a-zA-Z0-9_\.]+)?"
+                                   r"\s*"
+                                   r";"
+                                   r"\s*"
+                                   r"$")
+
+    # for stable ABI, we don't care about which version introduced which
+    # function, we just flatten the list. there are dupes in certain files, so
+    # use a set instead of a list
+    stable_lines = set()
+    # copy experimental section as is
+    experimental_lines = []
+    is_experimental = False
+
+    # gather all functions
+    for line in f_in:
+        # clean up the line
+        line = line.strip('\n').strip()
+
+        # is this an end of section?
+        match = section_end_regex.match(line)
+        if match:
+            # whatever section this was, it's not active any more
+            is_experimental = False
+            continue
+
+        # if we're in the middle of experimental section, we need to copy
+        # the section verbatim, so just add the line
+        if is_experimental:
+            experimental_lines += [line]
+            continue
+
+        # skip empty lines
+        if not line:
+            continue
+
+        # is this a beginning of a new section?
+        match = section_begin_regex.match(line)
+        if match:
+            cur_section = match.group("version")
+            # is it experimental?
+            is_experimental = cur_section == "EXPERIMENTAL"
+            continue
+
+        # is this a function?
+        match = func_line_regex.match(line)
+        if match:
+            stable_lines.add(match.group("func"))
+
+    return stable_lines, experimental_lines
+
+
+def __generate_stable_abi(f_out, abi_version, lines):
+    # print ABI version header
+    print("DPDK_{} {{".format(abi_version), file=f_out)
+
+    # print global section if it exists
+    if lines:
+        print("\tglobal:", file=f_out)
+        # blank line
+        print(file=f_out)
+
+        # print all stable lines, alphabetically sorted
+        for line in sorted(lines):
+            print("\t{};".format(line), file=f_out)
+
+        # another blank line
+        print(file=f_out)
+
+    # print local section
+    print("\tlocal: *;", file=f_out)
+
+    # end stable version
+    print("};", file=f_out)
+
+
+def __generate_experimental_abi(f_out, lines, need_newline):
+    if need_newline:
+        # another blank line
+        print(file=f_out)
+
+    # start experimental section
+    print("EXPERIMENTAL {", file=f_out)
+
+    # print all experimental lines as they were
+    for line in lines:
+        # don't print empty whitespace
+        if not line:
+            print("", file=f_out)
+        else:
+            print("\t{}".format(line), file=f_out)
+
+    # end section
+    print("};", file=f_out)
+
+
+def __main():
+    arg_parser = argparse.ArgumentParser(
+        description='Merge versions in linker version script.')
+
+    arg_parser.add_argument("map_file", type=str,
+                            help='path to linker version script file '
+                                 '(pattern: *version.map)')
+    arg_parser.add_argument("abi_version", type=str,
+                            help='target ABI version (pattern: MAJOR.MINOR)')
+
+    parsed = arg_parser.parse_args()
+
+    if not parsed.map_file.endswith('version.map'):
+        print("Invalid input file: {}".format(parsed.map_file),
+              file=sys.stderr)
+        arg_parser.print_help()
+        sys.exit(1)
+
+    if not re.match(r"\d{1,2}\.\d{1,2}", parsed.abi_version):
+        print("Invalid ABI version: {}".format(parsed.abi_version),
+              file=sys.stderr)
+        arg_parser.print_help()
+        sys.exit(1)
+
+    with open(parsed.map_file) as f_in:
+        stable_lines, experimental_lines = __parse_map_file(f_in)
+
+    with open(parsed.map_file, 'w') as f_out:
+        if stable_lines or not experimental_lines:
+            __generate_stable_abi(f_out, parsed.abi_version, stable_lines)
+        if experimental_lines:
+            __generate_experimental_abi(f_out, experimental_lines,
+                                        bool(stable_lines))
+
+
+if __name__ == "__main__":
+    __main()
-- 
2.17.1

^ permalink raw reply	[relevance 15%]

* [dpdk-dev] [PATCH v6 01/10] config: change ABI versioning to global
      2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
@ 2019-11-06 16:54  7%   ` Anatoly Burakov
  2019-11-06 16:54 15%   ` [dpdk-dev] [PATCH v6 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
                     ` (8 subsequent siblings)
  11 siblings, 0 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev
  Cc: Marcin Baran, Thomas Monjalon, Bruce Richardson, john.mcnamara,
	ray.kinsella, david.marchand, Pawel Modrak

From: Marcin Baran <marcinx.baran@intel.com>

As per new ABI policy, all of the libraries are now versioned using
one global ABI version. Changes in this patch implement the
necessary steps to enable that.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---

Notes:
    v6:
    - Silenced grep error message on trying to grep a directory
    
    v3:
    - Removed Windows support from Makefile changes
    - Removed unneeded path conversions from meson files

 buildtools/meson.build |  2 ++
 config/ABI_VERSION     |  1 +
 config/meson.build     |  4 +++-
 drivers/meson.build    | 20 ++++++++++++--------
 lib/meson.build        | 18 ++++++++++++------
 meson_options.txt      |  2 --
 mk/rte.lib.mk          | 13 ++++---------
 7 files changed, 34 insertions(+), 26 deletions(-)
 create mode 100644 config/ABI_VERSION

diff --git a/buildtools/meson.build b/buildtools/meson.build
index 32c79c1308..78ce69977d 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -12,3 +12,5 @@ if python3.found()
 else
 	map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
 endif
+
+is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
diff --git a/config/ABI_VERSION b/config/ABI_VERSION
new file mode 100644
index 0000000000..9a7c1e503f
--- /dev/null
+++ b/config/ABI_VERSION
@@ -0,0 +1 @@
+20.0
diff --git a/config/meson.build b/config/meson.build
index e1ebdad261..2278b12261 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -18,6 +18,8 @@ endforeach
 # depending on the configuration options
 pver = meson.project_version().split('.')
 major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+abi_version = run_command(find_program('cat', 'more'),
+	files('ABI_VERSION')).stdout().strip()
 
 # extract all version information into the build configuration
 dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
@@ -37,7 +39,7 @@ endif
 
 pmd_subdir_opt = get_option('drivers_install_subdir')
 if pmd_subdir_opt.contains('<VERSION>')
-	pmd_subdir_opt = major_version.join(pmd_subdir_opt.split('<VERSION>'))
+	pmd_subdir_opt = abi_version.join(pmd_subdir_opt.split('<VERSION>'))
 endif
 driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt)
 eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
diff --git a/drivers/meson.build b/drivers/meson.build
index 156d2dc717..b03e0c3159 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -124,12 +124,19 @@ foreach class:dpdk_driver_classes
 					output: out_filename,
 					depends: [pmdinfogen, tmp_lib])
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/@2@_version.map'.format(
+					meson.current_source_dir(),
+					drv_path, lib_name)
+
+			is_experimental = run_command(is_experimental_cmd,
+				files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = '0.1'
+				so_version = '0'
 			else
-				lib_version = major_version
-				so_version = major_version
+				lib_version = abi_version
+				so_version = abi_version
 			endif
 
 			# now build the static driver
@@ -142,9 +149,6 @@ foreach class:dpdk_driver_classes
 				install: true)
 
 			# now build the shared driver
-			version_map = '@0@/@1@/@2@_version.map'.format(
-					meson.current_source_dir(),
-					drv_path, lib_name)
 			shared_lib = shared_library(lib_name,
 				sources,
 				objects: objs,
diff --git a/lib/meson.build b/lib/meson.build
index b2ec9c09a9..3cff2482b1 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -106,12 +106,18 @@ foreach l:libraries
 				cflags += '-DRTE_USE_FUNCTION_VERSIONING'
 			endif
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/rte_@2@_version.map'.format(
+					meson.current_source_dir(), dir_name, name)
+
+			is_experimental = run_command(is_experimental_cmd,
+					files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = '0.1'
+				so_version = '0'
 			else
-				lib_version = major_version
-				so_version = major_version
+				lib_version = abi_version
+				so_version = abi_version
 			endif
 
 			# first build static lib
@@ -127,7 +133,7 @@ foreach l:libraries
 					dependencies: static_deps)
 
 			if not use_function_versioning
-				# use pre-build objects to build shared lib
+				# then use pre-build objects to build shared lib
 				sources = []
 				objs += static_lib.extract_all_objects(recursive: false)
 			else
diff --git a/meson_options.txt b/meson_options.txt
index 89650b0e9c..da6a7f0302 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -30,8 +30,6 @@ option('max_lcores', type: 'integer', value: 128,
 	description: 'maximum number of cores/threads supported by EAL')
 option('max_numa_nodes', type: 'integer', value: 4,
 	description: 'maximum number of NUMA nodes supported by EAL')
-option('per_library_versions', type: 'boolean', value: true,
-	description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
 option('tests', type: 'boolean', value: true,
 	description: 'build unit tests')
 option('use_hpet', type: 'boolean', value: false,
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 4df8849a08..b49af9192b 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -11,20 +11,15 @@ EXTLIB_BUILD ?= n
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
 
-ifneq ($(CONFIG_RTE_MAJOR_ABI),)
-ifneq ($(LIBABIVER),)
-LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
-endif
+ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
+LIBABIVER := $(shell cat $(RTE_SRCDIR)/config/ABI_VERSION)
+else
+LIBABIVER := 0
 endif
 
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 ifeq ($(EXTLIB_BUILD),n)
-ifeq ($(CONFIG_RTE_MAJOR_ABI),)
-ifeq ($(CONFIG_RTE_NEXT_ABI),y)
-LIB := $(LIB).1
-endif
-endif
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 endif
 endif
-- 
2.17.1

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts
    @ 2019-11-06 16:54  8%   ` Anatoly Burakov
  2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
                       ` (10 more replies)
  2019-11-06 16:54  7%   ` [dpdk-dev] [PATCH v6 01/10] config: change ABI versioning to global Anatoly Burakov
                     ` (9 subsequent siblings)
  11 siblings, 11 replies; 200+ results
From: Anatoly Burakov @ 2019-11-06 16:54 UTC (permalink / raw)
  To: dev; +Cc: john.mcnamara, ray.kinsella, bruce.richardson, thomas, david.marchand

This patchset prepares the codebase for the new ABI policy and
adds a few helper scripts.

There are two new scripts for managing ABI versions added. The
first one is a Python script that will read in a .map file,
flatten it and update the ABI version to the ABI version
specified on the command-line.

The second one is a shell script that will run the above mentioned
Python script recursively over the source tree and set the ABI
version to either that which is defined in config/ABI_VERSION, or
a user-specified one.

Example of its usage: buildtools/update-abi.sh 20.0

This will recurse into lib/ and drivers/ directory and update
whatever .map files it can find.

The other shell script that's added is one that can take in a .so
file and ensure that its declared public ABI matches either
current ABI, next ABI, or EXPERIMENTAL. This was moved to the
last commit because it made no sense to have it beforehand.

The source tree was verified to follow the new ABI policy using
the following command (assuming built binaries are in build/):

find ./build/lib ./build/drivers -name  \*.so \
	-exec ./buildtools/check-abi-version.sh {} \; -print

This returns 0.

Changes since v5:
- Addressed David's comments regarding libtool error messages
- Fixed map file generation to not generate empty stable ABI if
  it wasn't there before

Changes since v4:
- Fixed shared library build issue for distributor

Changes since v3:
- Put distributor code back and cleaned it up
- Rebased on latest master and regenerated commit 9

Changes since v2:
- Addressed Bruce's review comments
- Removed single distributor mode as per Dave's suggestion

Changes since v1:
- Reordered patchset to have removal of old ABI's before introducing
  the new one to avoid compile breakages between patches
- Added a new patch fixing missing symbol in octeontx common
- Split script commits into multiple commits and reordered them
- Re-generated the ABI bump commit
- Verified all scripts to work

Anatoly Burakov (2):
  buildtools: add ABI update shell script
  drivers/octeontx: add missing public symbol

Marcin Baran (6):
  config: change ABI versioning to global
  timer: remove deprecated code
  lpm: remove deprecated code
  distributor: remove deprecated code
  distributor: rename v2.0 ABI to _single suffix
  buildtools: add ABI versioning check script

Pawel Modrak (2):
  buildtools: add script for updating symbols abi version
  build: change ABI version to 20.0

 buildtools/check-abi-version.sh               |  54 +
 buildtools/meson.build                        |   2 +
 buildtools/update-abi.sh                      |  42 +
 buildtools/update_version_map_abi.py          | 171 +++
 config/ABI_VERSION                            |   1 +
 config/meson.build                            |   4 +-
 .../rte_pmd_bbdev_fpga_lte_fec_version.map    |   8 +-
 .../null/rte_pmd_bbdev_null_version.map       |   2 +-
 .../rte_pmd_bbdev_turbo_sw_version.map        |   2 +-
 drivers/bus/dpaa/rte_bus_dpaa_version.map     | 113 +-
 drivers/bus/fslmc/rte_bus_fslmc_version.map   | 154 ++-
 drivers/bus/ifpga/rte_bus_ifpga_version.map   |  14 +-
 drivers/bus/pci/rte_bus_pci_version.map       |   2 +-
 drivers/bus/vdev/rte_bus_vdev_version.map     |  12 +-
 drivers/bus/vmbus/rte_bus_vmbus_version.map   |  12 +-
 drivers/common/cpt/rte_common_cpt_version.map |   9 +-
 .../common/dpaax/rte_common_dpaax_version.map |  14 +-
 .../common/mvep/rte_common_mvep_version.map   |   6 +-
 .../octeontx/rte_common_octeontx_version.map  |   7 +-
 .../rte_common_octeontx2_version.map          |  16 +-
 .../compress/isal/rte_pmd_isal_version.map    |   2 +-
 .../rte_pmd_octeontx_compress_version.map     |   2 +-
 drivers/compress/qat/rte_pmd_qat_version.map  |   2 +-
 .../compress/zlib/rte_pmd_zlib_version.map    |   2 +-
 .../aesni_gcm/rte_pmd_aesni_gcm_version.map   |   2 +-
 .../aesni_mb/rte_pmd_aesni_mb_version.map     |   2 +-
 .../crypto/armv8/rte_pmd_armv8_version.map    |   2 +-
 .../caam_jr/rte_pmd_caam_jr_version.map       |   3 +-
 drivers/crypto/ccp/rte_pmd_ccp_version.map    |   3 +-
 .../dpaa2_sec/rte_pmd_dpaa2_sec_version.map   |  10 +-
 .../dpaa_sec/rte_pmd_dpaa_sec_version.map     |  10 +-
 .../crypto/kasumi/rte_pmd_kasumi_version.map  |   2 +-
 .../crypto/mvsam/rte_pmd_mvsam_version.map    |   2 +-
 .../crypto/nitrox/rte_pmd_nitrox_version.map  |   2 +-
 .../null/rte_pmd_null_crypto_version.map      |   2 +-
 .../rte_pmd_octeontx_crypto_version.map       |   3 +-
 .../rte_pmd_octeontx2_crypto_version.map      |   3 +-
 .../openssl/rte_pmd_openssl_version.map       |   2 +-
 .../rte_pmd_crypto_scheduler_version.map      |  19 +-
 .../crypto/snow3g/rte_pmd_snow3g_version.map  |   2 +-
 .../virtio/rte_pmd_virtio_crypto_version.map  |   2 +-
 drivers/crypto/zuc/rte_pmd_zuc_version.map    |   2 +-
 .../event/dpaa/rte_pmd_dpaa_event_version.map |   3 +-
 .../dpaa2/rte_pmd_dpaa2_event_version.map     |   2 +-
 .../event/dsw/rte_pmd_dsw_event_version.map   |   2 +-
 .../rte_pmd_octeontx_event_version.map        |   2 +-
 .../rte_pmd_octeontx2_event_version.map       |   3 +-
 .../event/opdl/rte_pmd_opdl_event_version.map |   2 +-
 .../rte_pmd_skeleton_event_version.map        |   3 +-
 drivers/event/sw/rte_pmd_sw_event_version.map |   2 +-
 .../bucket/rte_mempool_bucket_version.map     |   3 +-
 .../mempool/dpaa/rte_mempool_dpaa_version.map |   2 +-
 .../dpaa2/rte_mempool_dpaa2_version.map       |  12 +-
 .../octeontx/rte_mempool_octeontx_version.map |   2 +-
 .../rte_mempool_octeontx2_version.map         |   4 +-
 .../mempool/ring/rte_mempool_ring_version.map |   3 +-
 .../stack/rte_mempool_stack_version.map       |   3 +-
 drivers/meson.build                           |  20 +-
 .../af_packet/rte_pmd_af_packet_version.map   |   3 +-
 drivers/net/af_xdp/rte_pmd_af_xdp_version.map |   2 +-
 drivers/net/ark/rte_pmd_ark_version.map       |   5 +-
 .../net/atlantic/rte_pmd_atlantic_version.map |   6 -
 drivers/net/avp/rte_pmd_avp_version.map       |   2 +-
 drivers/net/axgbe/rte_pmd_axgbe_version.map   |   2 +-
 drivers/net/bnx2x/rte_pmd_bnx2x_version.map   |   3 +-
 drivers/net/bnxt/rte_pmd_bnxt_version.map     |   4 +-
 drivers/net/bonding/rte_pmd_bond_version.map  |  47 +-
 drivers/net/cxgbe/rte_pmd_cxgbe_version.map   |   3 +-
 drivers/net/dpaa/rte_pmd_dpaa_version.map     |  11 +-
 drivers/net/dpaa2/rte_pmd_dpaa2_version.map   |  12 +-
 drivers/net/e1000/rte_pmd_e1000_version.map   |   3 +-
 drivers/net/ena/rte_pmd_ena_version.map       |   3 +-
 drivers/net/enetc/rte_pmd_enetc_version.map   |   3 +-
 drivers/net/enic/rte_pmd_enic_version.map     |   3 +-
 .../net/failsafe/rte_pmd_failsafe_version.map |   3 +-
 drivers/net/fm10k/rte_pmd_fm10k_version.map   |   3 +-
 drivers/net/hinic/rte_pmd_hinic_version.map   |   3 +-
 drivers/net/hns3/rte_pmd_hns3_version.map     |   4 +-
 drivers/net/i40e/rte_pmd_i40e_version.map     |  65 +-
 drivers/net/iavf/rte_pmd_iavf_version.map     |   3 +-
 drivers/net/ice/rte_pmd_ice_version.map       |   3 +-
 drivers/net/ifc/rte_pmd_ifc_version.map       |   3 +-
 drivers/net/ipn3ke/rte_pmd_ipn3ke_version.map |   3 +-
 drivers/net/ixgbe/rte_pmd_ixgbe_version.map   |  62 +-
 drivers/net/kni/rte_pmd_kni_version.map       |   3 +-
 .../net/liquidio/rte_pmd_liquidio_version.map |   3 +-
 drivers/net/memif/rte_pmd_memif_version.map   |   5 +-
 drivers/net/mlx4/rte_pmd_mlx4_version.map     |   3 +-
 drivers/net/mlx5/rte_pmd_mlx5_version.map     |   2 +-
 drivers/net/mvneta/rte_pmd_mvneta_version.map |   2 +-
 drivers/net/mvpp2/rte_pmd_mvpp2_version.map   |   2 +-
 drivers/net/netvsc/rte_pmd_netvsc_version.map |   4 +-
 drivers/net/nfb/rte_pmd_nfb_version.map       |   3 +-
 drivers/net/nfp/rte_pmd_nfp_version.map       |   2 +-
 drivers/net/null/rte_pmd_null_version.map     |   3 +-
 .../net/octeontx/rte_pmd_octeontx_version.map |  10 +-
 .../octeontx2/rte_pmd_octeontx2_version.map   |   3 +-
 drivers/net/pcap/rte_pmd_pcap_version.map     |   3 +-
 drivers/net/pfe/rte_pmd_pfe_version.map       |   3 +-
 drivers/net/qede/rte_pmd_qede_version.map     |   3 +-
 drivers/net/ring/rte_pmd_ring_version.map     |  10 +-
 drivers/net/sfc/rte_pmd_sfc_version.map       |   3 +-
 .../net/softnic/rte_pmd_softnic_version.map   |   2 +-
 .../net/szedata2/rte_pmd_szedata2_version.map |   2 +-
 drivers/net/tap/rte_pmd_tap_version.map       |   3 +-
 .../net/thunderx/rte_pmd_thunderx_version.map |   3 +-
 .../rte_pmd_vdev_netvsc_version.map           |   3 +-
 drivers/net/vhost/rte_pmd_vhost_version.map   |  11 +-
 drivers/net/virtio/rte_pmd_virtio_version.map |   3 +-
 .../net/vmxnet3/rte_pmd_vmxnet3_version.map   |   3 +-
 .../rte_rawdev_dpaa2_cmdif_version.map        |   3 +-
 .../rte_rawdev_dpaa2_qdma_version.map         |   4 +-
 .../raw/ifpga/rte_rawdev_ifpga_version.map    |   3 +-
 drivers/raw/ioat/rte_rawdev_ioat_version.map  |   3 +-
 drivers/raw/ntb/rte_rawdev_ntb_version.map    |   5 +-
 .../rte_rawdev_octeontx2_dma_version.map      |   3 +-
 .../skeleton/rte_rawdev_skeleton_version.map  |   3 +-
 lib/librte_acl/rte_acl_version.map            |   2 +-
 .../rte_bitratestats_version.map              |   2 +-
 lib/librte_cfgfile/rte_cfgfile_version.map    |  34 +-
 lib/librte_cmdline/rte_cmdline_version.map    |  10 +-
 .../rte_cryptodev_version.map                 | 102 +-
 lib/librte_distributor/Makefile               |   2 +-
 lib/librte_distributor/distributor_private.h  |  10 +-
 lib/librte_distributor/meson.build            |   2 +-
 lib/librte_distributor/rte_distributor.c      |  80 +-
 ...ributor_v20.c => rte_distributor_single.c} |  57 +-
 ...ributor_v20.h => rte_distributor_single.h} |  26 +-
 .../rte_distributor_v1705.h                   |  61 --
 .../rte_distributor_version.map               |  16 +-
 lib/librte_eal/rte_eal_version.map            | 324 ++----
 lib/librte_efd/rte_efd_version.map            |   2 +-
 lib/librte_ethdev/rte_ethdev_version.map      | 160 +--
 lib/librte_eventdev/rte_eventdev_version.map  | 130 +--
 lib/librte_gro/rte_gro_version.map            |   2 +-
 lib/librte_gso/rte_gso_version.map            |   2 +-
 lib/librte_hash/rte_hash_version.map          |  43 +-
 lib/librte_ip_frag/rte_ip_frag_version.map    |  10 +-
 lib/librte_jobstats/rte_jobstats_version.map  |  10 +-
 lib/librte_kni/rte_kni_version.map            |   2 +-
 lib/librte_kvargs/rte_kvargs_version.map      |   4 +-
 .../rte_latencystats_version.map              |   2 +-
 lib/librte_lpm/rte_lpm.c                      | 996 +-----------------
 lib/librte_lpm/rte_lpm.h                      |  88 --
 lib/librte_lpm/rte_lpm6.c                     | 132 +--
 lib/librte_lpm/rte_lpm6.h                     |  25 -
 lib/librte_lpm/rte_lpm_version.map            |  39 +-
 lib/librte_mbuf/rte_mbuf_version.map          |  49 +-
 lib/librte_member/rte_member_version.map      |   2 +-
 lib/librte_mempool/rte_mempool_version.map    |  44 +-
 lib/librte_meter/rte_meter_version.map        |  13 +-
 lib/librte_metrics/rte_metrics_version.map    |   2 +-
 lib/librte_net/rte_net_version.map            |  23 +-
 lib/librte_pci/rte_pci_version.map            |   2 +-
 lib/librte_pdump/rte_pdump_version.map        |   2 +-
 lib/librte_pipeline/rte_pipeline_version.map  |  36 +-
 lib/librte_port/rte_port_version.map          |  64 +-
 lib/librte_power/rte_power_version.map        |  24 +-
 lib/librte_rawdev/rte_rawdev_version.map      |   4 +-
 lib/librte_reorder/rte_reorder_version.map    |   8 +-
 lib/librte_ring/rte_ring_version.map          |  10 +-
 lib/librte_sched/rte_sched_version.map        |  14 +-
 lib/librte_security/rte_security_version.map  |   2 +-
 lib/librte_table/rte_table_version.map        |   2 +-
 lib/librte_timer/rte_timer.c                  |  90 +-
 lib/librte_timer/rte_timer.h                  |  15 -
 lib/librte_timer/rte_timer_version.map        |  12 +-
 lib/librte_vhost/rte_vhost_version.map        |  52 +-
 lib/meson.build                               |  18 +-
 meson_options.txt                             |   2 -
 mk/rte.lib.mk                                 |  13 +-
 171 files changed, 1114 insertions(+), 2943 deletions(-)
 create mode 100755 buildtools/check-abi-version.sh
 create mode 100755 buildtools/update-abi.sh
 create mode 100755 buildtools/update_version_map_abi.py
 create mode 100644 config/ABI_VERSION
 rename lib/librte_distributor/{rte_distributor_v20.c => rte_distributor_single.c} (85%)
 rename lib/librte_distributor/{rte_distributor_v20.h => rte_distributor_single.h} (89%)
 delete mode 100644 lib/librte_distributor/rte_distributor_v1705.h

-- 
2.17.1

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v8 4/4] doc: add maintainer for abi policy
  @ 2019-11-06 16:13  4%   ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2019-11-06 16:13 UTC (permalink / raw)
  To: Ray Kinsella, dev
  Cc: thomas, stephen, Richardson, Bruce, Yigit, Ferruh, Ananyev,
	Konstantin, jerinj, olivier.matz, nhorman, maxime.coquelin,
	Kovacevic, Marko, hemant.agrawal, ktraynor, aconole



> -----Original Message-----
> From: Ray Kinsella <mdr@ashroe.eu>
> Sent: Tuesday, November 5, 2019 3:24 PM
> To: dev@dpdk.org
> Cc: mdr@ashroe.eu; thomas@monjalon.net; stephen@networkplumber.org;
> Richardson, Bruce <bruce.richardson@intel.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; jerinj@marvell.com;
> olivier.matz@6wind.com; nhorman@tuxdriver.com;
> maxime.coquelin@redhat.com; Mcnamara, John <john.mcnamara@intel.com>;
> Kovacevic, Marko <marko.kovacevic@intel.com>; hemant.agrawal@nxp.com;
> ktraynor@redhat.com; aconole@redhat.com
> Subject: [PATCH v8 4/4] doc: add maintainer for abi policy
> 
> Add an entry to the maintainer file for the abi policy.
> 

Acked-by: John McNamara <john.mcnamara@intel.com>


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 3/4] doc: updates to versioning guide for abi versions
  @ 2019-11-06 16:13  4%   ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2019-11-06 16:13 UTC (permalink / raw)
  To: Ray Kinsella, dev
  Cc: thomas, stephen, Richardson, Bruce, Yigit, Ferruh, Ananyev,
	Konstantin, jerinj, olivier.matz, nhorman, maxime.coquelin,
	Kovacevic, Marko, hemant.agrawal, ktraynor, aconole



> -----Original Message-----
> From: Ray Kinsella <mdr@ashroe.eu>
> Sent: Tuesday, November 5, 2019 3:24 PM
> To: dev@dpdk.org
> Cc: mdr@ashroe.eu; thomas@monjalon.net; stephen@networkplumber.org;
> Richardson, Bruce <bruce.richardson@intel.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; jerinj@marvell.com;
> olivier.matz@6wind.com; nhorman@tuxdriver.com;
> maxime.coquelin@redhat.com; Mcnamara, John <john.mcnamara@intel.com>;
> Kovacevic, Marko <marko.kovacevic@intel.com>; hemant.agrawal@nxp.com;
> ktraynor@redhat.com; aconole@redhat.com
> Subject: [PATCH v8 3/4] doc: updates to versioning guide for abi versions
> 
> Updates to the ABI versioning guide, to account for the changes to the
> DPDK ABI/API policy. Fixes for references to abi versioning and policy
> guides.
> 
> Signed-off-by: Ray Kinsella <mdr@ashroe.eu>

Acked-by: John McNamara <john.mcnamara@intel.com>



^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 2/4] doc: changes to abi policy introducing major abi versions
  @ 2019-11-06 16:12  5%   ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2019-11-06 16:12 UTC (permalink / raw)
  To: Ray Kinsella, dev
  Cc: thomas, stephen, Richardson, Bruce, Yigit, Ferruh, Ananyev,
	Konstantin, jerinj, olivier.matz, nhorman, maxime.coquelin,
	Kovacevic, Marko, hemant.agrawal, ktraynor, aconole

> -----Original Message-----
> From: Ray Kinsella <mdr@ashroe.eu>
> Sent: Tuesday, November 5, 2019 3:24 PM
> To: dev@dpdk.org
> Cc: mdr@ashroe.eu; thomas@monjalon.net; stephen@networkplumber.org;
> Richardson, Bruce <bruce.richardson@intel.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; jerinj@marvell.com;
> olivier.matz@6wind.com; nhorman@tuxdriver.com;
> maxime.coquelin@redhat.com; Mcnamara, John <john.mcnamara@intel.com>;
> Kovacevic, Marko <marko.kovacevic@intel.com>; hemant.agrawal@nxp.com;
> ktraynor@redhat.com; aconole@redhat.com
> Subject: [PATCH v8 2/4] doc: changes to abi policy introducing major abi
> versions
> 
> This policy change introduces major ABI versions, these are
> declared every year, typically aligned with the LTS release
> and are supported by subsequent releases in the following year.
> This change is intended to improve ABI stabilty for those projects
> consuming DPDK.
> 
> Signed-off-by: Ray Kinsella <mdr@ashroe.eu>

Acked-by: John McNamara <john.mcnamara@intel.com>



^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v8 1/4] doc: separate versioning.rst into version and policy
  @ 2019-11-06 16:11  0%   ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2019-11-06 16:11 UTC (permalink / raw)
  To: Ray Kinsella, dev
  Cc: thomas, stephen, Richardson, Bruce, Yigit, Ferruh, Ananyev,
	Konstantin, jerinj, olivier.matz, nhorman, maxime.coquelin,
	Kovacevic, Marko, hemant.agrawal, ktraynor, aconole

> -----Original Message-----
> From: Ray Kinsella <mdr@ashroe.eu>
> Sent: Tuesday, November 5, 2019 3:24 PM
> To: dev@dpdk.org
> Cc: mdr@ashroe.eu; thomas@monjalon.net; stephen@networkplumber.org;
> Richardson, Bruce <bruce.richardson@intel.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; jerinj@marvell.com;
> olivier.matz@6wind.com; nhorman@tuxdriver.com;
> maxime.coquelin@redhat.com; Mcnamara, John <john.mcnamara@intel.com>;
> Kovacevic, Marko <marko.kovacevic@intel.com>; hemant.agrawal@nxp.com;
> ktraynor@redhat.com; aconole@redhat.com
> Subject: [PATCH v8 1/4] doc: separate versioning.rst into version and
> policy
> 
> Separate versioning.rst into abi versioning and abi policy guidance, in
> preparation for adding more detail to the abi policy.
> 


Acked-by: John McNamara <john.mcnamara@intel.com>


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 02/10] buildtools: add script for updating symbols abi version
  @ 2019-11-06 15:38  8%     ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2019-11-06 15:38 UTC (permalink / raw)
  To: Anatoly Burakov
  Cc: dev, Pawel Modrak, Mcnamara, John, Kinsella, Ray,
	Bruce Richardson, Thomas Monjalon

On Thu, Oct 24, 2019 at 11:46 AM Anatoly Burakov
<anatoly.burakov@intel.com> wrote:
>
> From: Pawel Modrak <pawelx.modrak@intel.com>
>
> Add a script that automatically merges all stable ABI's under one
> ABI section with the new version, while leaving experimental
> section exactly as it is.
>
> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>
> Notes:
>     v3:
>     - Add comments to regex patterns
>
>     v2:
>     - Reworked script to be pep8-compliant and more reliable
>
>  buildtools/update_version_map_abi.py | 170 +++++++++++++++++++++++++++
>  1 file changed, 170 insertions(+)
>  create mode 100755 buildtools/update_version_map_abi.py
>
> diff --git a/buildtools/update_version_map_abi.py b/buildtools/update_version_map_abi.py
> new file mode 100755
> index 0000000000..50283e6a3d
> --- /dev/null
> +++ b/buildtools/update_version_map_abi.py
> @@ -0,0 +1,170 @@
> +#!/usr/bin/env python
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright(c) 2019 Intel Corporation
> +
> +"""
> +A Python program to update the ABI version and function names in a DPDK
> +lib_*_version.map file. Called from the buildtools/update_abi.sh utility.
> +"""
> +
> +from __future__ import print_function
> +import argparse
> +import sys
> +import re
> +
> +
> +def __parse_map_file(f_in):
> +    # match function name, followed by semicolon, followed by EOL, optionally
> +    # with whitespace inbetween each item
> +    func_line_regex = re.compile(r"\s*"
> +                                 r"(?P<func>[a-zA-Z_0-9]+)"
> +                                 r"\s*"
> +                                 r";"
> +                                 r"\s*"
> +                                 r"$")
> +    # match section name, followed by opening bracked, followed by EOL,
> +    # optionally with whitespace inbetween each item
> +    section_begin_regex = re.compile(r"\s*"
> +                                     r"(?P<version>[a-zA-Z0-9_\.]+)"
> +                                     r"\s*"
> +                                     r"{"
> +                                     r"\s*"
> +                                     r"$")
> +    # match closing bracket, optionally followed by section name (for when we
> +    # inherit from another ABI version), followed by semicolon, followed by
> +    # EOL, optionally with whitespace inbetween each item
> +    section_end_regex = re.compile(r"\s*"
> +                                   r"}"
> +                                   r"\s*"
> +                                   r"(?P<parent>[a-zA-Z0-9_\.]+)?"
> +                                   r"\s*"
> +                                   r";"
> +                                   r"\s*"
> +                                   r"$")
> +
> +    # for stable ABI, we don't care about which version introduced which
> +    # function, we just flatten the list. there are dupes in certain files, so
> +    # use a set instead of a list
> +    stable_lines = set()
> +    # copy experimental section as is
> +    experimental_lines = []
> +    is_experimental = False
> +
> +    # gather all functions
> +    for line in f_in:
> +        # clean up the line
> +        line = line.strip('\n').strip()
> +
> +        # is this an end of section?
> +        match = section_end_regex.match(line)
> +        if match:
> +            # whatever section this was, it's not active any more
> +            is_experimental = False
> +            continue
> +
> +        # if we're in the middle of experimental section, we need to copy
> +        # the section verbatim, so just add the line
> +        if is_experimental:
> +            experimental_lines += [line]
> +            continue
> +
> +        # skip empty lines
> +        if not line:
> +            continue
> +
> +        # is this a beginning of a new section?
> +        match = section_begin_regex.match(line)
> +        if match:
> +            cur_section = match.group("version")
> +            # is it experimental?
> +            is_experimental = cur_section == "EXPERIMENTAL"
> +            continue
> +
> +        # is this a function?
> +        match = func_line_regex.match(line)
> +        if match:
> +            stable_lines.add(match.group("func"))
> +
> +    return stable_lines, experimental_lines
> +
> +
> +def __regenerate_map_file(f_out, abi_version, stable_lines,
> +                          experimental_lines):
> +    # print ABI version header
> +    print("DPDK_{} {{".format(abi_version), file=f_out)

Some libraries are entirely experimental (librte_bpf for example).

https://patchwork.dpdk.org/patch/62018/
+Libraries marked as ``experimental`` are entirely not considered part of an ABI
+version, and may change without warning at any time. Experimental libraries
+always have a major version of ``0`` to indicate they exist outside of
+:ref:`abi_versioning` , with the minor version incremented with each ABI change
+to library.

So you must create a DPDK_XX "stable" block only if the map file
contained a non empty "stable" block before.


--
David Marchand


^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v6 2/3] ipsec: remove redundant replay_win_sz
  2019-11-06 14:27  0%         ` Ananyev, Konstantin
@ 2019-11-06 14:29  0%           ` Akhil Goyal
  0 siblings, 0 replies; 200+ results
From: Akhil Goyal @ 2019-11-06 14:29 UTC (permalink / raw)
  To: Ananyev, Konstantin, Hemant Agrawal, dev


> 
> > > > The rte_security lib has introduced replay_win_sz,
> > > > so it can be removed from the rte_ipsec lib.
> > > >
> > > > The relaved tests,app are also update to reflect
> > > > the usages.
> > > >
> > > > Note that esn and anti-replay fileds were earlier used
> > > > only for ipsec library, they were enabling the libipsec
> > > > by default. With this change esn and anti-replay setting
> > > > will not automatically enabled libipsec.
> > > >
> > > > Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> > > > Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> > > > ---
> > > >  app/test/test_ipsec.c                  | 2 +-
> > > >  doc/guides/rel_notes/release_19_11.rst | 7 +++++--
> > > >  examples/ipsec-secgw/ipsec-secgw.c     | 5 -----
> > > >  examples/ipsec-secgw/ipsec.c           | 4 ++++
> > > >  examples/ipsec-secgw/sa.c              | 2 +-
> > > >  lib/librte_ipsec/Makefile              | 2 +-
> > > >  lib/librte_ipsec/meson.build           | 1 +
> > > >  lib/librte_ipsec/rte_ipsec_sa.h        | 6 ------
> > > >  lib/librte_ipsec/sa.c                  | 4 ++--
> > > >  9 files changed, 15 insertions(+), 18 deletions(-)
> > > >
> > > > diff --git a/app/test/test_ipsec.c b/app/test/test_ipsec.c
> > > > index 4007eff19..7dc83fee7 100644
> > > > --- a/app/test/test_ipsec.c
> > > > +++ b/app/test/test_ipsec.c
> > > > @@ -689,11 +689,11 @@ fill_ipsec_param(uint32_t replay_win_sz,
> uint64_t
> > > flags)
> > > >
> > > >  	prm->userdata = 1;
> > > >  	prm->flags = flags;
> > > > -	prm->replay_win_sz = replay_win_sz;
> > > >
> > > >  	/* setup ipsec xform */
> > > >  	prm->ipsec_xform = ut_params->ipsec_xform;
> > > >  	prm->ipsec_xform.salt = (uint32_t)rte_rand();
> > > > +	prm->ipsec_xform.replay_win_sz = replay_win_sz;
> > > >
> > > >  	/* setup tunnel related fields */
> > > >  	prm->tun.hdr_len = sizeof(ipv4_outer);
> > > > diff --git a/doc/guides/rel_notes/release_19_11.rst
> > > b/doc/guides/rel_notes/release_19_11.rst
> > > > index dcae08002..0504a3443 100644
> > > > --- a/doc/guides/rel_notes/release_19_11.rst
> > > > +++ b/doc/guides/rel_notes/release_19_11.rst
> > > > @@ -369,10 +369,13 @@ ABI Changes
> > > >    align the Ethernet header on receive and all known encapsulations
> > > >    preserve the alignment of the header.
> > > >
> > > > -* security: A new field ''replay_win_sz'' has been added to the structure
> > > > +* security: The field ''replay_win_sz'' has been moved from ipsec library
> > > > +  based ''rte_ipsec_sa_prm'' structure to security library based structure
> > > >    ``rte_security_ipsec_xform``, which specify the Anti replay window size
> > > >    to enable sequence replay attack handling.
> > > >
> > > > +* ipsec: The field ''replay_win_sz'' has been removed from the structure
> > > > +  ''rte_ipsec_sa_prm'' as it has been added to the security library.
> > > >
> > > >  Shared Library Versions
> > > >  -----------------------
> > > > @@ -415,7 +418,7 @@ The libraries prepended with a plus sign were
> > > incremented in this version.
> > > >       librte_gso.so.1
> > > >       librte_hash.so.2
> > > >       librte_ip_frag.so.1
> > > > -     librte_ipsec.so.1
> > > > +   + librte_ipsec.so.2
> > > >       librte_jobstats.so.1
> > > >       librte_kni.so.2
> > > >       librte_kvargs.so.1
> > > > diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-
> > > secgw/ipsec-secgw.c
> > > > index b12936470..3b5aaf683 100644
> > > > --- a/examples/ipsec-secgw/ipsec-secgw.c
> > > > +++ b/examples/ipsec-secgw/ipsec-secgw.c
> > > > @@ -1424,9 +1424,6 @@ print_app_sa_prm(const struct app_sa_prm
> *prm)
> > > >  	printf("librte_ipsec usage: %s\n",
> > > >  		(prm->enable == 0) ? "disabled" : "enabled");
> > > >
> > > > -	if (prm->enable == 0)
> > > > -		return;
> > > > -
> > > >  	printf("replay window size: %u\n", prm->window_size);
> > > >  	printf("ESN: %s\n", (prm->enable_esn == 0) ? "disabled" : "enabled");
> > > >  	printf("SA flags: %#" PRIx64 "\n", prm->flags);
> > > > @@ -1495,11 +1492,9 @@ parse_args(int32_t argc, char **argv)
> > > >  			app_sa_prm.enable = 1;
> > > >  			break;
> > > >  		case 'w':
> > > > -			app_sa_prm.enable = 1;
> > >
> > > That actually will break lib-mode functional tests at:
> > > examples/ipsec-secgw/test/
> > > Due to my laziness I enabled in them library mode via '-w' option,
> > > as that moment legacy mode didn't support replay window...
> > > As these patches already applied, I'll send the fix in a new one in next few.
> >
> > No issues, I will squash your changes with the original patch as it is not applied
> > On master.
> 
> Ok, thanks.
> Patch at:
> http://patches.dpdk.org/patch/62540/ 

Removed the fixes line for this patch. Rebased the tree so that script patch is just after this patch.

Applied
> 
> >
> > >
> > > >  			app_sa_prm.window_size = parse_decimal(optarg);
> > > >  			break;
> > > >  		case 'e':
> > > > -			app_sa_prm.enable = 1;
> > > >  			app_sa_prm.enable_esn = 1;
> > > >  			break;
> > > >  		case 'a':
> > > > diff --git a/examples/ipsec-secgw/ipsec.c b/examples/ipsec-secgw/ipsec.c
> > > > index d7761e966..d4b57121a 100644
> > > > --- a/examples/ipsec-secgw/ipsec.c
> > > > +++ b/examples/ipsec-secgw/ipsec.c
> > > > @@ -49,6 +49,8 @@ set_ipsec_conf(struct ipsec_sa *sa, struct
> > > rte_security_ipsec_xform *ipsec)
> > > >  		/* TODO support for Transport */
> > > >  	}
> > > >  	ipsec->esn_soft_limit = IPSEC_OFFLOAD_ESN_SOFTLIMIT;
> > > > +	ipsec->replay_win_sz = app_sa_prm.window_size;
> > > > +	ipsec->options.esn = app_sa_prm.enable_esn;
> > >
> > > Ok, but what to do for the devices that don't support esn or replay_win_sz?
> > > Should we add some check? Either to the app, or preferably into rte_security
> > > level at  rte_security_session_create()?
> >
> > Ideally app should check the capability of the device before setting it.
> 
> Yes... after another thought - as right now we do create session at run-time,
> probably we need to check these device capabilities at init stage and report an
> error.

Agreed

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 1/3] ethdev: support API to set max LRO packet size
  @ 2019-11-06 14:28  3%   ` Dekel Peled
    1 sibling, 0 replies; 200+ results
From: Dekel Peled @ 2019-11-06 14:28 UTC (permalink / raw)
  To: john.mcnamara, marko.kovacevic, nhorman, ajit.khaparde,
	somnath.kotur, anatoly.burakov, xuanziyang2, cloud.wangxiaoyun,
	zhouguoyang, wenzhuo.lu, konstantin.ananyev, matan, shahafs,
	viacheslavo, rmody, shshaikh, maxime.coquelin, tiwei.bie,
	zhihong.wang, yongwang, thomas, ferruh.yigit, arybchenko,
	jingjing.wu, bernard.iremonger
  Cc: dev

This patch implements [1], to support API for configuration and
validation of max size for LRO aggregated packet.
API change notice [2] is removed, and release notes for 19.11
are updated accordingly.

Various PMDs using LRO offload are updated, the new data members are
initialized to ensure they don't fail validation.

[1] http://patches.dpdk.org/patch/58217/
[2] http://patches.dpdk.org/patch/57492/

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/nics/features.rst             |  2 ++
 doc/guides/rel_notes/deprecation.rst     |  4 ---
 doc/guides/rel_notes/release_19_11.rst   |  8 ++++++
 drivers/net/bnxt/bnxt_ethdev.c           |  1 +
 drivers/net/hinic/hinic_pmd_ethdev.c     |  1 +
 drivers/net/ixgbe/ixgbe_ethdev.c         |  2 ++
 drivers/net/ixgbe/ixgbe_vf_representor.c |  1 +
 drivers/net/mlx5/mlx5.h                  |  3 +++
 drivers/net/mlx5/mlx5_ethdev.c           |  1 +
 drivers/net/mlx5/mlx5_rxq.c              |  1 -
 drivers/net/qede/qede_ethdev.c           |  1 +
 drivers/net/virtio/virtio_ethdev.c       |  1 +
 drivers/net/vmxnet3/vmxnet3_ethdev.c     |  1 +
 lib/librte_ethdev/rte_ethdev.c           | 44 ++++++++++++++++++++++++++++++++
 lib/librte_ethdev/rte_ethdev.h           |  4 +++
 15 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index d966968..4d1bb5a 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -193,10 +193,12 @@ LRO
 Supports Large Receive Offload.
 
 * **[uses]       rte_eth_rxconf,rte_eth_rxmode**: ``offloads:DEV_RX_OFFLOAD_TCP_LRO``.
+  ``dev_conf.rxmode.max_lro_pkt_size``.
 * **[implements] datapath**: ``LRO functionality``.
 * **[implements] rte_eth_dev_data**: ``lro``.
 * **[provides]   mbuf**: ``mbuf.ol_flags:PKT_RX_LRO``, ``mbuf.tso_segsz``.
 * **[provides]   rte_eth_dev_info**: ``rx_offload_capa,rx_queue_offload_capa:DEV_RX_OFFLOAD_TCP_LRO``.
+* **[provides]   rte_eth_dev_info**: ``max_lro_pkt_size``.
 
 
 .. _nic_features_tso:
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index c10dc30..fdec33d 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -87,10 +87,6 @@ Deprecation Notices
   This scheme will allow PMDs to avoid lookup to internal ptype table on Rx and
   thereby improve Rx performance if application wishes do so.
 
-* ethdev: New 32-bit fields may be added for maximum LRO session size, in
-  struct ``rte_eth_dev_info`` for the port capability and in struct
-  ``rte_eth_rxmode`` for the port configuration.
-
 * cryptodev: support for using IV with all sizes is added, J0 still can
   be used but only when IV length in following structs ``rte_crypto_auth_xform``,
   ``rte_crypto_aead_xform`` is set to zero. When IV length is greater or equal
diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
index f96ac38..9bffb16 100644
--- a/doc/guides/rel_notes/release_19_11.rst
+++ b/doc/guides/rel_notes/release_19_11.rst
@@ -380,6 +380,14 @@ ABI Changes
   align the Ethernet header on receive and all known encapsulations
   preserve the alignment of the header.
 
+* ethdev: Added 32-bit fields for maximum LRO aggregated packet size, in
+  struct ``rte_eth_dev_info`` for the port capability and in struct
+  ``rte_eth_rxmode`` for the port configuration.
+  Application should use the new field in struct ``rte_eth_rxmode`` to configure
+  the requested size.
+  PMD should use the new field in struct ``rte_eth_dev_info`` to report the
+  supported port capability.
+
 
 Shared Library Versions
 -----------------------
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 7d9459f..88af61b 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -535,6 +535,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	/* Fast path specifics */
 	dev_info->min_rx_bufsize = 1;
 	dev_info->max_rx_pktlen = BNXT_MAX_PKT_LEN;
+	dev_info->max_lro_pkt_size = BNXT_MAX_PKT_LEN;
 
 	dev_info->rx_offload_capa = BNXT_DEV_RX_OFFLOAD_SUPPORT;
 	if (bp->flags & BNXT_FLAG_PTP_SUPPORTED)
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 9f37a40..b33b2cf 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -727,6 +727,7 @@ static void hinic_get_speed_capa(struct rte_eth_dev *dev, uint32_t *speed_capa)
 	info->max_tx_queues  = nic_dev->nic_cap.max_sqs;
 	info->min_rx_bufsize = HINIC_MIN_RX_BUF_SIZE;
 	info->max_rx_pktlen  = HINIC_MAX_JUMBO_FRAME_SIZE;
+	info->max_lro_pkt_size = HINIC_MAX_JUMBO_FRAME_SIZE;
 	info->max_mac_addrs  = HINIC_MAX_UC_MAC_ADDRS;
 	info->min_mtu = HINIC_MIN_MTU_SIZE;
 	info->max_mtu = HINIC_MAX_MTU_SIZE;
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 3c7624f..863e3b1 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3804,6 +3804,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	}
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL register */
 	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pkt_size = 15872;
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
 	dev_info->max_vfs = pci_dev->max_vfs;
@@ -3927,6 +3928,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
 	dev_info->max_rx_pktlen = 9728; /* includes CRC, cf MAXFRS reg */
+	dev_info->max_lro_pkt_size = 9728;
 	dev_info->max_mtu = dev_info->max_rx_pktlen - IXGBE_ETH_OVERHEAD;
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
diff --git a/drivers/net/ixgbe/ixgbe_vf_representor.c b/drivers/net/ixgbe/ixgbe_vf_representor.c
index dbbef29..28dfa3a 100644
--- a/drivers/net/ixgbe/ixgbe_vf_representor.c
+++ b/drivers/net/ixgbe/ixgbe_vf_representor.c
@@ -48,6 +48,7 @@
 	dev_info->min_rx_bufsize = 1024;
 	/**< Minimum size of RX buffer. */
 	dev_info->max_rx_pktlen = 9728;
+	dev_info->max_lro_pkt_size = 9728;
 	/**< Maximum configurable length of RX pkt. */
 	dev_info->max_rx_queues = IXGBE_VF_MAX_RX_QUEUES;
 	/**< Maximum number of RX queues. */
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index f644998..fdfc99b 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -203,6 +203,9 @@ struct mlx5_hca_attr {
 #define MLX5_LRO_SUPPORTED(dev) \
 	(((struct mlx5_priv *)((dev)->data->dev_private))->config.lro.supported)
 
+/* Maximal size of aggregated LRO packet. */
+#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
+
 /* LRO configurations structure. */
 struct mlx5_lro_config {
 	uint32_t supported:1; /* Whether LRO is supported. */
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index c2bed2f..1443faa 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -606,6 +606,7 @@ struct ethtool_link_settings {
 	/* FIXME: we should ask the device for these values. */
 	info->min_rx_bufsize = 32;
 	info->max_rx_pktlen = 65536;
+	info->max_lro_pkt_size = MLX5_MAX_LRO_SIZE;
 	/*
 	 * Since we need one CQ per QP, the limit is the minimum number
 	 * between the two values.
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 24d0eaa..9423e7b 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -1701,7 +1701,6 @@ struct mlx5_rxq_obj *
 	return 0;
 }
 
-#define MLX5_MAX_LRO_SIZE (UINT8_MAX * 256u)
 #define MLX5_MAX_TCP_HDR_OFFSET ((unsigned int)(sizeof(struct rte_ether_hdr) + \
 					sizeof(struct rte_vlan_hdr) * 2 + \
 					sizeof(struct rte_ipv6_hdr)))
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 575982f..9c960cd 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1277,6 +1277,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
 	dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
 	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
+	dev_info->max_lro_pkt_size = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
 	dev_info->rx_desc_lim = qede_rx_desc_lim;
 	dev_info->tx_desc_lim = qede_tx_desc_lim;
 
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 646de99..fa33c45 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -2435,6 +2435,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
 		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
 	dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
 	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
+	dev_info->max_lro_pkt_size = VIRTIO_MAX_RX_PKTLEN;
 	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
 
 	host_features = VTPCI_OPS(hw)->get_features(hw);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index d1faeaa..d18e8bc 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1161,6 +1161,7 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)
 	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
 	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
 	dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */
+	dev_info->max_lro_pkt_size = 16384;
 	dev_info->speed_capa = ETH_LINK_SPEED_10G;
 	dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS;
 
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 85ab5f0..9cdb4a1 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1156,6 +1156,26 @@ struct rte_eth_dev *
 	return name;
 }
 
+static inline int
+check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
+		   uint32_t dev_info_size)
+{
+	int ret = 0;
+
+	if (config_size > dev_info_size) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "> max allowed value %u\n", port_id, config_size,
+			       dev_info_size);
+		ret = -EINVAL;
+	} else if (config_size < RTE_ETHER_MIN_LEN) {
+		RTE_ETHDEV_LOG(ERR, "Ethdev port_id=%d max_lro_pkt_size %u "
+			       "< min allowed value %u\n", port_id, config_size,
+			       (unsigned int)RTE_ETHER_MIN_LEN);
+		ret = -EINVAL;
+	}
+	return ret;
+}
+
 int
 rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
@@ -1286,6 +1306,18 @@ struct rte_eth_dev *
 							RTE_ETHER_MAX_LEN;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		ret = check_lro_pkt_size(
+				port_id, dev_conf->rxmode.max_lro_pkt_size,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			goto rollback;
+	}
+
 	/* Any requested offloading must be within its device capabilities */
 	if ((dev_conf->rxmode.offloads & dev_info.rx_offload_capa) !=
 	     dev_conf->rxmode.offloads) {
@@ -1790,6 +1822,18 @@ struct rte_eth_dev *
 		return -EINVAL;
 	}
 
+	/*
+	 * If LRO is enabled, check that the maximum aggregated packet
+	 * size is supported by the configured device.
+	 */
+	if (local_conf.offloads & DEV_RX_OFFLOAD_TCP_LRO) {
+		int ret = check_lro_pkt_size(port_id,
+				dev->data->dev_conf.rxmode.max_lro_pkt_size,
+				dev_info.max_lro_pkt_size);
+		if (ret != 0)
+			return ret;
+	}
+
 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
 					      socket_id, &local_conf, mp);
 	if (!ret) {
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index f0df03d..f3ef253 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -395,6 +395,8 @@ struct rte_eth_rxmode {
 	/** The multi-queue packet distribution mode to be used, e.g. RSS. */
 	enum rte_eth_rx_mq_mode mq_mode;
 	uint32_t max_rx_pkt_len;  /**< Only used if JUMBO_FRAME enabled. */
+	/** Maximum allowed size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
 	/**
 	 * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
@@ -1223,6 +1225,8 @@ struct rte_eth_dev_info {
 	const uint32_t *dev_flags; /**< Device flags */
 	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
 	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
+	/** Maximum configurable size of LRO aggregated packet. */
+	uint32_t max_lro_pkt_size;
 	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
 	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
 	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
-- 
1.8.3.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v6 2/3] ipsec: remove redundant replay_win_sz
  2019-11-06 13:40  0%       ` Akhil Goyal
@ 2019-11-06 14:27  0%         ` Ananyev, Konstantin
  2019-11-06 14:29  0%           ` Akhil Goyal
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2019-11-06 14:27 UTC (permalink / raw)
  To: Akhil Goyal, Hemant Agrawal, dev



> > > The rte_security lib has introduced replay_win_sz,
> > > so it can be removed from the rte_ipsec lib.
> > >
> > > The relaved tests,app are also update to reflect
> > > the usages.
> > >
> > > Note that esn and anti-replay fileds were earlier used
> > > only for ipsec library, they were enabling the libipsec
> > > by default. With this change esn and anti-replay setting
> > > will not automatically enabled libipsec.
> > >
> > > Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> > > Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> > > ---
> > >  app/test/test_ipsec.c                  | 2 +-
> > >  doc/guides/rel_notes/release_19_11.rst | 7 +++++--
> > >  examples/ipsec-secgw/ipsec-secgw.c     | 5 -----
> > >  examples/ipsec-secgw/ipsec.c           | 4 ++++
> > >  examples/ipsec-secgw/sa.c              | 2 +-
> > >  lib/librte_ipsec/Makefile              | 2 +-
> > >  lib/librte_ipsec/meson.build           | 1 +
> > >  lib/librte_ipsec/rte_ipsec_sa.h        | 6 ------
> > >  lib/librte_ipsec/sa.c                  | 4 ++--
> > >  9 files changed, 15 insertions(+), 18 deletions(-)
> > >
> > > diff --git a/app/test/test_ipsec.c b/app/test/test_ipsec.c
> > > index 4007eff19..7dc83fee7 100644
> > > --- a/app/test/test_ipsec.c
> > > +++ b/app/test/test_ipsec.c
> > > @@ -689,11 +689,11 @@ fill_ipsec_param(uint32_t replay_win_sz, uint64_t
> > flags)
> > >
> > >  	prm->userdata = 1;
> > >  	prm->flags = flags;
> > > -	prm->replay_win_sz = replay_win_sz;
> > >
> > >  	/* setup ipsec xform */
> > >  	prm->ipsec_xform = ut_params->ipsec_xform;
> > >  	prm->ipsec_xform.salt = (uint32_t)rte_rand();
> > > +	prm->ipsec_xform.replay_win_sz = replay_win_sz;
> > >
> > >  	/* setup tunnel related fields */
> > >  	prm->tun.hdr_len = sizeof(ipv4_outer);
> > > diff --git a/doc/guides/rel_notes/release_19_11.rst
> > b/doc/guides/rel_notes/release_19_11.rst
> > > index dcae08002..0504a3443 100644
> > > --- a/doc/guides/rel_notes/release_19_11.rst
> > > +++ b/doc/guides/rel_notes/release_19_11.rst
> > > @@ -369,10 +369,13 @@ ABI Changes
> > >    align the Ethernet header on receive and all known encapsulations
> > >    preserve the alignment of the header.
> > >
> > > -* security: A new field ''replay_win_sz'' has been added to the structure
> > > +* security: The field ''replay_win_sz'' has been moved from ipsec library
> > > +  based ''rte_ipsec_sa_prm'' structure to security library based structure
> > >    ``rte_security_ipsec_xform``, which specify the Anti replay window size
> > >    to enable sequence replay attack handling.
> > >
> > > +* ipsec: The field ''replay_win_sz'' has been removed from the structure
> > > +  ''rte_ipsec_sa_prm'' as it has been added to the security library.
> > >
> > >  Shared Library Versions
> > >  -----------------------
> > > @@ -415,7 +418,7 @@ The libraries prepended with a plus sign were
> > incremented in this version.
> > >       librte_gso.so.1
> > >       librte_hash.so.2
> > >       librte_ip_frag.so.1
> > > -     librte_ipsec.so.1
> > > +   + librte_ipsec.so.2
> > >       librte_jobstats.so.1
> > >       librte_kni.so.2
> > >       librte_kvargs.so.1
> > > diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-
> > secgw/ipsec-secgw.c
> > > index b12936470..3b5aaf683 100644
> > > --- a/examples/ipsec-secgw/ipsec-secgw.c
> > > +++ b/examples/ipsec-secgw/ipsec-secgw.c
> > > @@ -1424,9 +1424,6 @@ print_app_sa_prm(const struct app_sa_prm *prm)
> > >  	printf("librte_ipsec usage: %s\n",
> > >  		(prm->enable == 0) ? "disabled" : "enabled");
> > >
> > > -	if (prm->enable == 0)
> > > -		return;
> > > -
> > >  	printf("replay window size: %u\n", prm->window_size);
> > >  	printf("ESN: %s\n", (prm->enable_esn == 0) ? "disabled" : "enabled");
> > >  	printf("SA flags: %#" PRIx64 "\n", prm->flags);
> > > @@ -1495,11 +1492,9 @@ parse_args(int32_t argc, char **argv)
> > >  			app_sa_prm.enable = 1;
> > >  			break;
> > >  		case 'w':
> > > -			app_sa_prm.enable = 1;
> >
> > That actually will break lib-mode functional tests at:
> > examples/ipsec-secgw/test/
> > Due to my laziness I enabled in them library mode via '-w' option,
> > as that moment legacy mode didn't support replay window...
> > As these patches already applied, I'll send the fix in a new one in next few.
> 
> No issues, I will squash your changes with the original patch as it is not applied
> On master.

Ok, thanks.
Patch at:
http://patches.dpdk.org/patch/62540/

> 
> >
> > >  			app_sa_prm.window_size = parse_decimal(optarg);
> > >  			break;
> > >  		case 'e':
> > > -			app_sa_prm.enable = 1;
> > >  			app_sa_prm.enable_esn = 1;
> > >  			break;
> > >  		case 'a':
> > > diff --git a/examples/ipsec-secgw/ipsec.c b/examples/ipsec-secgw/ipsec.c
> > > index d7761e966..d4b57121a 100644
> > > --- a/examples/ipsec-secgw/ipsec.c
> > > +++ b/examples/ipsec-secgw/ipsec.c
> > > @@ -49,6 +49,8 @@ set_ipsec_conf(struct ipsec_sa *sa, struct
> > rte_security_ipsec_xform *ipsec)
> > >  		/* TODO support for Transport */
> > >  	}
> > >  	ipsec->esn_soft_limit = IPSEC_OFFLOAD_ESN_SOFTLIMIT;
> > > +	ipsec->replay_win_sz = app_sa_prm.window_size;
> > > +	ipsec->options.esn = app_sa_prm.enable_esn;
> >
> > Ok, but what to do for the devices that don't support esn or replay_win_sz?
> > Should we add some check? Either to the app, or preferably into rte_security
> > level at  rte_security_session_create()?
> 
> Ideally app should check the capability of the device before setting it.

Yes... after another thought - as right now we do create session at run-time,
probably we need to check these device capabilities at init stage and report an error.   
Konstantin

> 
> 
> > >  }
> > >
> > >  int
> > > @@ -92,6 +94,7 @@ create_lookaside_session(struct ipsec_ctx *ipsec_ctx,
> > struct ipsec_sa *sa,
> > >  				.spi = sa->spi,
> > >  				.salt = sa->salt,
> > >  				.options = { 0 },
> > > +				.replay_win_sz = 0,
> > >  				.direction = sa->direction,
> > >  				.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
> > >  				.mode = (IS_TUNNEL(sa->flags)) ?
> > > @@ -151,6 +154,7 @@ create_inline_session(struct socket_ctx *skt_ctx,
> > struct ipsec_sa *sa,
> > >  			.spi = sa->spi,
> > >  			.salt = sa->salt,
> > >  			.options = { 0 },
> > > +			.replay_win_sz = 0,
> > >  			.direction = sa->direction,
> > >  			.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
> > >  			.mode = (sa->flags == IP4_TUNNEL ||
> > > diff --git a/examples/ipsec-secgw/sa.c b/examples/ipsec-secgw/sa.c
> > > index a8dee342e..4605a3a6c 100644
> > > --- a/examples/ipsec-secgw/sa.c
> > > +++ b/examples/ipsec-secgw/sa.c
> > > @@ -1115,7 +1115,7 @@ fill_ipsec_app_sa_prm(struct rte_ipsec_sa_prm
> > *prm,
> > >
> > >  	prm->flags = app_prm->flags;
> > >  	prm->ipsec_xform.options.esn = app_prm->enable_esn;
> > > -	prm->replay_win_sz = app_prm->window_size;
> > > +	prm->ipsec_xform.replay_win_sz = app_prm->window_size;
> > >  }
> > >
> > >  static int
> > > diff --git a/lib/librte_ipsec/Makefile b/lib/librte_ipsec/Makefile
> > > index 81fb99980..161ea9e3d 100644
> > > --- a/lib/librte_ipsec/Makefile
> > > +++ b/lib/librte_ipsec/Makefile
> > > @@ -14,7 +14,7 @@ LDLIBS += -lrte_cryptodev -lrte_security -lrte_hash
> > >
> > >  EXPORT_MAP := rte_ipsec_version.map
> > >
> > > -LIBABIVER := 1
> > > +LIBABIVER := 2
> > >
> > >  # all source are stored in SRCS-y
> > >  SRCS-$(CONFIG_RTE_LIBRTE_IPSEC) += esp_inb.c
> > > diff --git a/lib/librte_ipsec/meson.build b/lib/librte_ipsec/meson.build
> > > index 70358526b..e8604dadd 100644
> > > --- a/lib/librte_ipsec/meson.build
> > > +++ b/lib/librte_ipsec/meson.build
> > > @@ -1,6 +1,7 @@
> > >  # SPDX-License-Identifier: BSD-3-Clause
> > >  # Copyright(c) 2018 Intel Corporation
> > >
> > > +version = 2
> > >  allow_experimental_apis = true
> > >
> > >  sources = files('esp_inb.c', 'esp_outb.c', 'sa.c', 'ses.c', 'ipsec_sad.c')
> > > diff --git a/lib/librte_ipsec/rte_ipsec_sa.h b/lib/librte_ipsec/rte_ipsec_sa.h
> > > index 47ce169d2..1cfde5874 100644
> > > --- a/lib/librte_ipsec/rte_ipsec_sa.h
> > > +++ b/lib/librte_ipsec/rte_ipsec_sa.h
> > > @@ -47,12 +47,6 @@ struct rte_ipsec_sa_prm {
> > >  			uint8_t proto;  /**< next header protocol */
> > >  		} trs; /**< transport mode related parameters */
> > >  	};
> > > -
> > > -	/**
> > > -	 * window size to enable sequence replay attack handling.
> > > -	 * replay checking is disabled if the window size is 0.
> > > -	 */
> > > -	uint32_t replay_win_sz;
> > >  };
> > >
> > >  /**
> > > diff --git a/lib/librte_ipsec/sa.c b/lib/librte_ipsec/sa.c
> > > index 23d394b46..6f1d92c3c 100644
> > > --- a/lib/librte_ipsec/sa.c
> > > +++ b/lib/librte_ipsec/sa.c
> > > @@ -439,7 +439,7 @@ rte_ipsec_sa_size(const struct rte_ipsec_sa_prm *prm)
> > >  		return rc;
> > >
> > >  	/* determine required size */
> > > -	wsz = prm->replay_win_sz;
> > > +	wsz = prm->ipsec_xform.replay_win_sz;
> > >  	return ipsec_sa_size(type, &wsz, &nb);
> > >  }
> > >
> > > @@ -461,7 +461,7 @@ rte_ipsec_sa_init(struct rte_ipsec_sa *sa, const struct
> > rte_ipsec_sa_prm *prm,
> > >  		return rc;
> > >
> > >  	/* determine required size */
> > > -	wsz = prm->replay_win_sz;
> > > +	wsz = prm->ipsec_xform.replay_win_sz;
> > >  	sz = ipsec_sa_size(type, &wsz, &nb);
> > >  	if (sz < 0)
> > >  		return sz;
> > > --
> > > 2.17.1


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps
  @ 2019-11-06 13:58  3%   ` David Marchand
  2019-11-06 15:27  0%     ` Rajesh Ravi
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2019-11-06 13:58 UTC (permalink / raw)
  To: Burakov, Anatoly
  Cc: dev, Bruce Richardson, Rajesh Ravi, Ajit Khaparde,
	Jonathan Richardson, Scott Branden, Vikram Mysore Prakash,
	Srinath Mannam, Thomas Monjalon

On Tue, Nov 5, 2019 at 6:15 PM Burakov, Anatoly
<anatoly.burakov@intel.com> wrote:
>
> On 05-Nov-19 3:15 PM, Anatoly Burakov wrote:
> > Currently, externally created heaps are supposed to be automatically
> > mapped for VFIO DMA by EAL, however they only do so if, at the time of
> > heap creation, VFIO is initialized and has at least one device
> > available. If no devices are available at the time of heap creation (or
> > if devices were available, but were since hot-unplugged, thus dropping
> > all VFIO container mappings), then VFIO mapping code would have skipped
> > over externally allocated heaps.
> >
> > The fix is two-fold. First, we allow externally allocated memory
> > segments to be marked as "heap" segments. This allows us to distinguish
> > between external memory segments that were created via heap API, from
> > those that were created via rte_extmem_register() API.
> >
> > Then, we fix the VFIO code to only skip non-heap external segments.
> > Also, since external heaps are not guaranteed to have valid IOVA
> > addresses, we will skip those which have invalid IOVA addresses as well.
> >
> > Fixes: 0f526d674f8e ("malloc: separate creating memseg list and malloc heap")
> >
> > Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> > ---
> >
> > Notes:
> >      This cannot be backported to older releases as it breaks the
> >      API and ABI. A separate fix is in the works for stable.
> >
>
> Alternative, non-breaking implementation available (which will be slower
> due to O(N) memseg list heaps lookups):
>
> http://patches.dpdk.org/patch/62486/
>
> I'm fine with either option being merged.
>
> The more perfect solution would've been to rename "msl->external" into
> "msl->flags" and have various flags for memseg lists, but it's too late
> to break the API now.

Either way is fine for me (between the 18.11 and the master patches you sent).
Breaking the ABI is acceptable, but I agree the API is another story.

If the code seems better to you with the additional heap flag, let's go for it.

I would still like to hear from Rajesh though, since he seems to be
the first to hit this issue.


-- 
David Marchand


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v6 2/3] ipsec: remove redundant replay_win_sz
  @ 2019-11-06 13:40  0%       ` Akhil Goyal
  2019-11-06 14:27  0%         ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Akhil Goyal @ 2019-11-06 13:40 UTC (permalink / raw)
  To: Ananyev, Konstantin, Hemant Agrawal, dev

Hi Konstantin,

> 
> Hi guys,
> 
> > The rte_security lib has introduced replay_win_sz,
> > so it can be removed from the rte_ipsec lib.
> >
> > The relaved tests,app are also update to reflect
> > the usages.
> >
> > Note that esn and anti-replay fileds were earlier used
> > only for ipsec library, they were enabling the libipsec
> > by default. With this change esn and anti-replay setting
> > will not automatically enabled libipsec.
> >
> > Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> > Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> > ---
> >  app/test/test_ipsec.c                  | 2 +-
> >  doc/guides/rel_notes/release_19_11.rst | 7 +++++--
> >  examples/ipsec-secgw/ipsec-secgw.c     | 5 -----
> >  examples/ipsec-secgw/ipsec.c           | 4 ++++
> >  examples/ipsec-secgw/sa.c              | 2 +-
> >  lib/librte_ipsec/Makefile              | 2 +-
> >  lib/librte_ipsec/meson.build           | 1 +
> >  lib/librte_ipsec/rte_ipsec_sa.h        | 6 ------
> >  lib/librte_ipsec/sa.c                  | 4 ++--
> >  9 files changed, 15 insertions(+), 18 deletions(-)
> >
> > diff --git a/app/test/test_ipsec.c b/app/test/test_ipsec.c
> > index 4007eff19..7dc83fee7 100644
> > --- a/app/test/test_ipsec.c
> > +++ b/app/test/test_ipsec.c
> > @@ -689,11 +689,11 @@ fill_ipsec_param(uint32_t replay_win_sz, uint64_t
> flags)
> >
> >  	prm->userdata = 1;
> >  	prm->flags = flags;
> > -	prm->replay_win_sz = replay_win_sz;
> >
> >  	/* setup ipsec xform */
> >  	prm->ipsec_xform = ut_params->ipsec_xform;
> >  	prm->ipsec_xform.salt = (uint32_t)rte_rand();
> > +	prm->ipsec_xform.replay_win_sz = replay_win_sz;
> >
> >  	/* setup tunnel related fields */
> >  	prm->tun.hdr_len = sizeof(ipv4_outer);
> > diff --git a/doc/guides/rel_notes/release_19_11.rst
> b/doc/guides/rel_notes/release_19_11.rst
> > index dcae08002..0504a3443 100644
> > --- a/doc/guides/rel_notes/release_19_11.rst
> > +++ b/doc/guides/rel_notes/release_19_11.rst
> > @@ -369,10 +369,13 @@ ABI Changes
> >    align the Ethernet header on receive and all known encapsulations
> >    preserve the alignment of the header.
> >
> > -* security: A new field ''replay_win_sz'' has been added to the structure
> > +* security: The field ''replay_win_sz'' has been moved from ipsec library
> > +  based ''rte_ipsec_sa_prm'' structure to security library based structure
> >    ``rte_security_ipsec_xform``, which specify the Anti replay window size
> >    to enable sequence replay attack handling.
> >
> > +* ipsec: The field ''replay_win_sz'' has been removed from the structure
> > +  ''rte_ipsec_sa_prm'' as it has been added to the security library.
> >
> >  Shared Library Versions
> >  -----------------------
> > @@ -415,7 +418,7 @@ The libraries prepended with a plus sign were
> incremented in this version.
> >       librte_gso.so.1
> >       librte_hash.so.2
> >       librte_ip_frag.so.1
> > -     librte_ipsec.so.1
> > +   + librte_ipsec.so.2
> >       librte_jobstats.so.1
> >       librte_kni.so.2
> >       librte_kvargs.so.1
> > diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-
> secgw/ipsec-secgw.c
> > index b12936470..3b5aaf683 100644
> > --- a/examples/ipsec-secgw/ipsec-secgw.c
> > +++ b/examples/ipsec-secgw/ipsec-secgw.c
> > @@ -1424,9 +1424,6 @@ print_app_sa_prm(const struct app_sa_prm *prm)
> >  	printf("librte_ipsec usage: %s\n",
> >  		(prm->enable == 0) ? "disabled" : "enabled");
> >
> > -	if (prm->enable == 0)
> > -		return;
> > -
> >  	printf("replay window size: %u\n", prm->window_size);
> >  	printf("ESN: %s\n", (prm->enable_esn == 0) ? "disabled" : "enabled");
> >  	printf("SA flags: %#" PRIx64 "\n", prm->flags);
> > @@ -1495,11 +1492,9 @@ parse_args(int32_t argc, char **argv)
> >  			app_sa_prm.enable = 1;
> >  			break;
> >  		case 'w':
> > -			app_sa_prm.enable = 1;
> 
> That actually will break lib-mode functional tests at:
> examples/ipsec-secgw/test/
> Due to my laziness I enabled in them library mode via '-w' option,
> as that moment legacy mode didn't support replay window...
> As these patches already applied, I'll send the fix in a new one in next few.

No issues, I will squash your changes with the original patch as it is not applied 
On master.

> 
> >  			app_sa_prm.window_size = parse_decimal(optarg);
> >  			break;
> >  		case 'e':
> > -			app_sa_prm.enable = 1;
> >  			app_sa_prm.enable_esn = 1;
> >  			break;
> >  		case 'a':
> > diff --git a/examples/ipsec-secgw/ipsec.c b/examples/ipsec-secgw/ipsec.c
> > index d7761e966..d4b57121a 100644
> > --- a/examples/ipsec-secgw/ipsec.c
> > +++ b/examples/ipsec-secgw/ipsec.c
> > @@ -49,6 +49,8 @@ set_ipsec_conf(struct ipsec_sa *sa, struct
> rte_security_ipsec_xform *ipsec)
> >  		/* TODO support for Transport */
> >  	}
> >  	ipsec->esn_soft_limit = IPSEC_OFFLOAD_ESN_SOFTLIMIT;
> > +	ipsec->replay_win_sz = app_sa_prm.window_size;
> > +	ipsec->options.esn = app_sa_prm.enable_esn;
> 
> Ok, but what to do for the devices that don't support esn or replay_win_sz?
> Should we add some check? Either to the app, or preferably into rte_security
> level at  rte_security_session_create()?

Ideally app should check the capability of the device before setting it.

 
> >  }
> >
> >  int
> > @@ -92,6 +94,7 @@ create_lookaside_session(struct ipsec_ctx *ipsec_ctx,
> struct ipsec_sa *sa,
> >  				.spi = sa->spi,
> >  				.salt = sa->salt,
> >  				.options = { 0 },
> > +				.replay_win_sz = 0,
> >  				.direction = sa->direction,
> >  				.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
> >  				.mode = (IS_TUNNEL(sa->flags)) ?
> > @@ -151,6 +154,7 @@ create_inline_session(struct socket_ctx *skt_ctx,
> struct ipsec_sa *sa,
> >  			.spi = sa->spi,
> >  			.salt = sa->salt,
> >  			.options = { 0 },
> > +			.replay_win_sz = 0,
> >  			.direction = sa->direction,
> >  			.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
> >  			.mode = (sa->flags == IP4_TUNNEL ||
> > diff --git a/examples/ipsec-secgw/sa.c b/examples/ipsec-secgw/sa.c
> > index a8dee342e..4605a3a6c 100644
> > --- a/examples/ipsec-secgw/sa.c
> > +++ b/examples/ipsec-secgw/sa.c
> > @@ -1115,7 +1115,7 @@ fill_ipsec_app_sa_prm(struct rte_ipsec_sa_prm
> *prm,
> >
> >  	prm->flags = app_prm->flags;
> >  	prm->ipsec_xform.options.esn = app_prm->enable_esn;
> > -	prm->replay_win_sz = app_prm->window_size;
> > +	prm->ipsec_xform.replay_win_sz = app_prm->window_size;
> >  }
> >
> >  static int
> > diff --git a/lib/librte_ipsec/Makefile b/lib/librte_ipsec/Makefile
> > index 81fb99980..161ea9e3d 100644
> > --- a/lib/librte_ipsec/Makefile
> > +++ b/lib/librte_ipsec/Makefile
> > @@ -14,7 +14,7 @@ LDLIBS += -lrte_cryptodev -lrte_security -lrte_hash
> >
> >  EXPORT_MAP := rte_ipsec_version.map
> >
> > -LIBABIVER := 1
> > +LIBABIVER := 2
> >
> >  # all source are stored in SRCS-y
> >  SRCS-$(CONFIG_RTE_LIBRTE_IPSEC) += esp_inb.c
> > diff --git a/lib/librte_ipsec/meson.build b/lib/librte_ipsec/meson.build
> > index 70358526b..e8604dadd 100644
> > --- a/lib/librte_ipsec/meson.build
> > +++ b/lib/librte_ipsec/meson.build
> > @@ -1,6 +1,7 @@
> >  # SPDX-License-Identifier: BSD-3-Clause
> >  # Copyright(c) 2018 Intel Corporation
> >
> > +version = 2
> >  allow_experimental_apis = true
> >
> >  sources = files('esp_inb.c', 'esp_outb.c', 'sa.c', 'ses.c', 'ipsec_sad.c')
> > diff --git a/lib/librte_ipsec/rte_ipsec_sa.h b/lib/librte_ipsec/rte_ipsec_sa.h
> > index 47ce169d2..1cfde5874 100644
> > --- a/lib/librte_ipsec/rte_ipsec_sa.h
> > +++ b/lib/librte_ipsec/rte_ipsec_sa.h
> > @@ -47,12 +47,6 @@ struct rte_ipsec_sa_prm {
> >  			uint8_t proto;  /**< next header protocol */
> >  		} trs; /**< transport mode related parameters */
> >  	};
> > -
> > -	/**
> > -	 * window size to enable sequence replay attack handling.
> > -	 * replay checking is disabled if the window size is 0.
> > -	 */
> > -	uint32_t replay_win_sz;
> >  };
> >
> >  /**
> > diff --git a/lib/librte_ipsec/sa.c b/lib/librte_ipsec/sa.c
> > index 23d394b46..6f1d92c3c 100644
> > --- a/lib/librte_ipsec/sa.c
> > +++ b/lib/librte_ipsec/sa.c
> > @@ -439,7 +439,7 @@ rte_ipsec_sa_size(const struct rte_ipsec_sa_prm *prm)
> >  		return rc;
> >
> >  	/* determine required size */
> > -	wsz = prm->replay_win_sz;
> > +	wsz = prm->ipsec_xform.replay_win_sz;
> >  	return ipsec_sa_size(type, &wsz, &nb);
> >  }
> >
> > @@ -461,7 +461,7 @@ rte_ipsec_sa_init(struct rte_ipsec_sa *sa, const struct
> rte_ipsec_sa_prm *prm,
> >  		return rc;
> >
> >  	/* determine required size */
> > -	wsz = prm->replay_win_sz;
> > +	wsz = prm->ipsec_xform.replay_win_sz;
> >  	sz = ipsec_sa_size(type, &wsz, &nb);
> >  	if (sz < 0)
> >  		return sz;
> > --
> > 2.17.1


^ permalink raw reply	[relevance 0%]

Results 6801-7000 of ~18000   |  | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2019-07-24  8:20     [dpdk-dev] [PATCH v4 0/1] fbarray: get fbarrays from containerized secondary yasufum.o
2019-11-01  9:04     ` [dpdk-dev] [PATCH v6 0/1] fbarray: fix duplicated fbarray file in secondary yasufum.o
2019-11-01  9:04       ` [dpdk-dev] [PATCH v6 1/1] " yasufum.o
2019-11-04 10:20         ` Burakov, Anatoly
2019-11-05 10:13           ` David Marchand
2019-11-05 11:31             ` Burakov, Anatoly
2019-11-05 11:41               ` Ananyev, Konstantin
2019-11-06 10:37                 ` Burakov, Anatoly
2019-11-08  3:19  3%               ` Yasufumi Ogawa
2019-11-13 21:43  3% ` [dpdk-dev] [PATCH v7 0/1] " yasufum.o
2019-11-13 21:43       ` [dpdk-dev] [PATCH v7 1/1] " yasufum.o
2019-11-14 10:01         ` Burakov, Anatoly
2019-11-14 11:42           ` Yasufumi Ogawa
2019-11-14 12:27             ` David Marchand
2019-11-26 19:40  3%           ` Yasufumi Ogawa
2019-11-27 10:26  3%             ` Burakov, Anatoly
2019-11-27  8:48  3%   ` [dpdk-dev] [PATCH v8 0/1] " Yasufumi Ogawa
2019-10-15  5:30     [dpdk-dev] [PATCH] eal: add option --iso-cmem for external custom memory Ajit Khaparde
2019-10-17 15:45     ` Burakov, Anatoly
2019-10-18 10:54       ` Rajesh Ravi
2019-10-18 16:53         ` Burakov, Anatoly
2019-10-21 15:46           ` Rajesh Ravi
2019-10-22  7:56             ` Rajesh Ravi
2019-10-24 11:43               ` Burakov, Anatoly
2019-10-25 12:53                 ` Rajesh Ravi
2019-10-25 15:02                   ` Burakov, Anatoly
2019-10-30 19:50                     ` Rajesh Ravi
2019-11-04 10:25                       ` Burakov, Anatoly
2019-11-05 11:41                         ` Burakov, Anatoly
2019-11-05 14:10  0%                       ` Rajesh Ravi
2019-10-17 14:31     [dpdk-dev] [PATCH v4 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
2019-10-24  9:46     ` [dpdk-dev] [PATCH v5 " Anatoly Burakov
2019-10-24  9:46       ` [dpdk-dev] [PATCH v5 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
2019-11-06 15:38  8%     ` David Marchand
2019-11-06 16:54  8%   ` [dpdk-dev] [PATCH v6 00/10] Implement the new ABI policy and add helper scripts Anatoly Burakov
2019-11-08 16:25  8%     ` [dpdk-dev] [PATCH v7 " Anatoly Burakov
2019-11-20 17:23  7%       ` [dpdk-dev] [PATCH v8 00/12] " Anatoly Burakov
2019-11-20 20:17  4%         ` Thomas Monjalon
2019-11-20 22:13  4%           ` David Marchand
2019-11-21 10:22  4%             ` Burakov, Anatoly
2019-11-21 13:24  4%           ` Kinsella, Ray
2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 01/12] config: change ABI versioning to global Anatoly Burakov
2019-11-20 19:51  4%         ` David Marchand
2019-11-20 22:01  9%           ` David Marchand
2019-11-20 17:23  9%       ` [dpdk-dev] [PATCH v8 02/12] config: remove CONFIG_RTE_MAJOR_ABI option Anatoly Burakov
2019-11-20 17:23  1%       ` [dpdk-dev] [PATCH v8 03/12] build: remove individual library versions Anatoly Burakov
2019-11-20 17:23 16%       ` [dpdk-dev] [PATCH v8 04/12] buildtools: add script for updating symbols abi version Anatoly Burakov
2019-11-20 20:05  7%         ` David Marchand
2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 05/12] buildtools: add ABI update shell script Anatoly Burakov
2019-11-20 17:23  3%       ` [dpdk-dev] [PATCH v8 06/12] timer: remove deprecated code Anatoly Burakov
2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 07/12] lpm: " Anatoly Burakov
2019-11-20 17:23  4%       ` [dpdk-dev] [PATCH v8 08/12] distributor: " Anatoly Burakov
2019-11-20 17:23  6%       ` [dpdk-dev] [PATCH v8 09/12] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
2019-11-20 17:23  3%       ` [dpdk-dev] [PATCH v8 10/12] drivers/octeontx: add missing public symbol Anatoly Burakov
2019-11-20 17:23  2%       ` [dpdk-dev] [PATCH v8 11/12] build: change ABI version to 20.0 Anatoly Burakov
2019-11-20 20:47  3%         ` David Marchand
2019-11-20 17:23 23%       ` [dpdk-dev] [PATCH v8 12/12] buildtools: add ABI versioning check script Anatoly Burakov
2019-11-08 16:25  7%     ` [dpdk-dev] [PATCH v7 01/10] config: change ABI versioning to global Anatoly Burakov
2019-11-19 13:53  4%       ` Thomas Monjalon
2019-11-19 15:48  8%         ` Burakov, Anatoly
2019-11-20 12:10  4%       ` Kinsella, Ray
2019-11-20 13:31  9%         ` Thomas Monjalon
2019-11-20 14:10  4%           ` Kinsella, Ray
2019-11-08 16:25 15%     ` [dpdk-dev] [PATCH v7 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
2019-11-19 14:01  4%       ` Thomas Monjalon
2019-11-19 15:38  4%         ` Burakov, Anatoly
2019-11-19 16:05  7%           ` Thomas Monjalon
2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 03/10] buildtools: add ABI update shell script Anatoly Burakov
2019-11-19 17:38  4%       ` Thomas Monjalon
2019-11-20 11:50  4%         ` Burakov, Anatoly
2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 04/10] timer: remove deprecated code Anatoly Burakov
2019-11-19 21:42  0%       ` David Marchand
2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 05/10] lpm: " Anatoly Burakov
2019-11-19 21:43  0%       ` David Marchand
2019-11-08 16:25  4%     ` [dpdk-dev] [PATCH v7 06/10] distributor: " Anatoly Burakov
2019-11-08 16:25  6%     ` [dpdk-dev] [PATCH v7 07/10] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
2019-11-08 16:25  3%     ` [dpdk-dev] [PATCH v7 08/10] drivers/octeontx: add missing public symbol Anatoly Burakov
2019-11-08 16:25  2%     ` [dpdk-dev] [PATCH v7 09/10] build: change ABI version to 20.0 Anatoly Burakov
2019-11-19 17:46  3%       ` Thomas Monjalon
2019-11-19 21:50  7%       ` David Marchand
2019-11-22  7:07  4%         ` Sachin Saxena
2019-11-08 16:25 23%     ` [dpdk-dev] [PATCH v7 10/10] buildtools: add ABI versioning check script Anatoly Burakov
2019-11-19 18:16  8%       ` Thomas Monjalon
2019-11-06 16:54  7%   ` [dpdk-dev] [PATCH v6 01/10] config: change ABI versioning to global Anatoly Burakov
2019-11-06 16:54 15%   ` [dpdk-dev] [PATCH v6 02/10] buildtools: add script for updating symbols abi version Anatoly Burakov
2019-11-06 16:54 23%   ` [dpdk-dev] [PATCH v6 03/10] buildtools: add ABI update shell script Anatoly Burakov
2019-11-06 16:54  4%   ` [dpdk-dev] [PATCH v6 04/10] timer: remove deprecated code Anatoly Burakov
2019-11-06 16:54  2%   ` [dpdk-dev] [PATCH v6 05/10] lpm: " Anatoly Burakov
2019-11-06 16:54  4%   ` [dpdk-dev] [PATCH v6 06/10] distributor: " Anatoly Burakov
2019-11-06 16:54  6%   ` [dpdk-dev] [PATCH v6 07/10] distributor: rename v2.0 ABI to _single suffix Anatoly Burakov
2019-11-06 16:54  3%   ` [dpdk-dev] [PATCH v6 08/10] drivers/octeontx: add missing public symbol Anatoly Burakov
2019-11-06 16:54  2%   ` [dpdk-dev] [PATCH v6 09/10] build: change ABI version to 20.0 Anatoly Burakov
2019-11-06 16:54 23%   ` [dpdk-dev] [PATCH v6 10/10] buildtools: add ABI versioning check script Anatoly Burakov
2019-10-29 14:12     [dpdk-dev] [PATCH v6 00/12] Add an option to use LTO for DPDK build Andrzej Ostruszka
2019-11-07 15:03     ` [dpdk-dev] [PATCH v7 " Andrzej Ostruszka
2019-11-07 15:03  3%   ` [dpdk-dev] [PATCH v7 01/12] doc: fix description of versioning macros Andrzej Ostruszka
2019-11-07 15:03  2%   ` [dpdk-dev] [PATCH v7 02/12] build: annotate versioned symbols with __vsym macro Andrzej Ostruszka
2019-10-31 13:15     [dpdk-dev] [PATCH v5 1/3] security: add anti replay window size Hemant Agrawal
2019-11-06  6:54     ` [dpdk-dev] [PATCH v6 " Hemant Agrawal
2019-11-06  6:54       ` [dpdk-dev] [PATCH v6 2/3] ipsec: remove redundant replay_win_sz Hemant Agrawal
2019-11-06 13:31         ` Ananyev, Konstantin
2019-11-06 13:40  0%       ` Akhil Goyal
2019-11-06 14:27  0%         ` Ananyev, Konstantin
2019-11-06 14:29  0%           ` Akhil Goyal
2019-11-01 13:36     [dpdk-dev] [PATCH v5 0/5] Some fixes for hinic PMD driver Xiaoyun wang
2019-11-07  9:29  0% ` Ferruh Yigit
2019-11-05  8:40     [dpdk-dev] [PATCH 0/3] support API to set max LRO packet size Dekel Peled
2019-11-08 23:07  4% ` [dpdk-dev] [PATCH v6] ethdev: add " Thomas Monjalon
2019-11-10 22:47  0%   ` Ananyev, Konstantin
2019-11-11 17:47       ` [dpdk-dev] [PATCH v7 0/3] support API to set " Dekel Peled
2019-11-11 17:47  4%     ` [dpdk-dev] [PATCH v7 1/3] ethdev: " Dekel Peled
2019-11-05 15:15     [dpdk-dev] [PATCH 19.11] vfio: fix DMA mapping of externally allocated heaps Anatoly Burakov
2019-11-05 17:15     ` Burakov, Anatoly
2019-11-06 13:58  3%   ` David Marchand
2019-11-06 15:27  0%     ` Rajesh Ravi
2019-11-06 21:53  0% ` David Marchand
2019-11-06 22:12  0%   ` Thomas Monjalon
2019-11-07  6:35  0% ` Rajesh Ravi
2019-11-07 15:35  0% ` David Marchand
2019-11-05 15:24     [dpdk-dev] [PATCH v8 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-05 15:24     ` [dpdk-dev] [PATCH v8 1/4] doc: separate versioning.rst into version and policy Ray Kinsella
2019-11-06 16:11  0%   ` Mcnamara, John
2019-11-05 15:24     ` [dpdk-dev] [PATCH v8 2/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-06 16:12  5%   ` Mcnamara, John
2019-11-05 15:24     ` [dpdk-dev] [PATCH v8 3/4] doc: updates to versioning guide for " Ray Kinsella
2019-11-06 16:13  4%   ` Mcnamara, John
2019-11-05 15:24     ` [dpdk-dev] [PATCH v8 4/4] doc: add maintainer for abi policy Ray Kinsella
2019-11-06 16:13  4%   ` Mcnamara, John
2019-11-06  9:06     ` [dpdk-dev] [PATCH v8 2/4] doc: changes to abi policy introducing major abi versions Thomas Monjalon
2019-11-06  9:22       ` Ray Kinsella
2019-11-06 21:07 10%     ` Thomas Monjalon
2019-11-08 14:09  5%       ` Ray Kinsella
2019-11-05 18:41     [dpdk-dev] [RFC 0/4] cpu-crypto API choices Konstantin Ananyev
2019-11-14  5:46  3% ` Jerin Jacob
2019-11-18 11:57  0%   ` Ananyev, Konstantin
2019-11-20 14:27  0%     ` Jerin Jacob
2019-11-06 11:34     [dpdk-dev] [PATCH v2 0/3] support API to set max LRO packet size Dekel Peled
2019-11-06 14:28     ` [dpdk-dev] [PATCH v3 " Dekel Peled
2019-11-06 14:28  3%   ` [dpdk-dev] [PATCH v3 1/3] ethdev: " Dekel Peled
2019-11-07 12:35       ` [dpdk-dev] [PATCH v4 0/3] " Dekel Peled
2019-11-07 12:35  3%     ` [dpdk-dev] [PATCH v4 1/3] ethdev: " Dekel Peled
2019-11-07 20:15           ` Ferruh Yigit
2019-11-08  6:54             ` Matan Azrad
2019-11-08  9:19  3%           ` Ferruh Yigit
2019-11-08 10:10  0%             ` Matan Azrad
2019-11-08 11:37  0%               ` Ferruh Yigit
2019-11-08 11:56  0%                 ` Matan Azrad
2019-11-08 12:51  0%                   ` Ferruh Yigit
2019-11-08 16:11  0%                     ` Dekel Peled
2019-11-08 16:53  0%                       ` Ferruh Yigit
2019-11-09 18:20  3%                     ` Matan Azrad
2019-11-10 23:40  0%                       ` Ananyev, Konstantin
2019-11-11  8:01  0%                         ` Matan Azrad
2019-11-12 18:31  0%                           ` Ananyev, Konstantin
2019-11-11 11:15  0%                       ` Ferruh Yigit
2019-11-11 11:33  0%                         ` Matan Azrad
2019-11-11 12:21  0%                           ` Ferruh Yigit
2019-11-11 13:32  0%                             ` Matan Azrad
2019-11-08 13:11  0%                   ` Ananyev, Konstantin
2019-11-08 14:10  0%                     ` Dekel Peled
2019-11-08 14:52  0%                       ` Ananyev, Konstantin
2019-11-08 16:08  0%                         ` Dekel Peled
2019-11-08 16:28  0%                           ` Ananyev, Konstantin
2019-11-09 18:26  0%                             ` Matan Azrad
2019-11-10 22:51  0%                               ` Ananyev, Konstantin
2019-11-11  6:53  0%                                 ` Matan Azrad
2019-11-08 16:42         ` [dpdk-dev] [PATCH v5 0/3] " Dekel Peled
2019-11-08 16:42  4%       ` [dpdk-dev] [PATCH v5 1/3] ethdev: " Dekel Peled
2019-11-10 23:07  0%         ` Ananyev, Konstantin
2019-11-11  7:40  0%           ` Dekel Peled
2019-11-07 15:01  4% [dpdk-dev] DPDK Release Status Meeting 7/11/2019 Ferruh Yigit
2019-11-07 22:15  4% [dpdk-dev] [PATCH] ethdev: reserve space in main structs for extension Thomas Monjalon
2019-11-08  3:41  0% ` Stephen Hemminger
2019-11-08  9:40  0%   ` Thomas Monjalon
2019-11-08  9:57  0% ` Ferruh Yigit
2019-11-08 10:52  0%   ` Andrew Rybchenko
2019-11-11  7:26  4% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
2019-11-11 10:54  0%   ` Ferruh Yigit
2019-11-11 16:22  0%     ` Ferruh Yigit
2019-11-08 12:46 10% [dpdk-dev] [PATCH v9 0/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-08 12:46 18% ` [dpdk-dev] [PATCH v9 1/4] doc: separate versioning.rst into version and policy Ray Kinsella
2019-11-08 12:46 23% ` [dpdk-dev] [PATCH v9 2/4] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-08 17:11  5%   ` Thomas Monjalon
2019-11-08 17:12  5%     ` Ray Kinsella
2019-11-08 17:38  5%       ` Thomas Monjalon
2019-11-11 11:03  5%         ` Ray Kinsella
2019-11-08 12:46 35% ` [dpdk-dev] [PATCH v9 3/4] doc: updates to versioning guide for " Ray Kinsella
2019-11-08 12:46 13% ` [dpdk-dev] [PATCH v9 4/4] doc: add maintainer for abi policy Ray Kinsella
2019-11-08 17:18  4%   ` Thomas Monjalon
2019-11-11 10:37 10% ` [dpdk-dev] [PATCH v10 0/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-11 10:37 18%   ` [dpdk-dev] [PATCH v10 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
2019-11-11 10:37 23%   ` [dpdk-dev] [PATCH v10 2/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-11 10:37 35%   ` [dpdk-dev] [PATCH v10 3/3] doc: updates to versioning guide for " Ray Kinsella
2019-11-11 11:57 10% ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Ray Kinsella
2019-11-11 11:57 18%   ` [dpdk-dev] [PATCH v11 1/3] doc: separate versioning.rst into version and policy Ray Kinsella
2019-11-11 11:57 23%   ` [dpdk-dev] [PATCH v11 2/3] doc: changes to abi policy introducing major abi versions Ray Kinsella
2019-11-11 11:57 35%   ` [dpdk-dev] [PATCH v11 3/3] doc: updates to versioning guide for " Ray Kinsella
2019-11-12  7:55  5%   ` [dpdk-dev] [PATCH v11 0/3] doc: changes to abi policy introducing major " Thomas Monjalon
2019-11-12  8:49  5%     ` Ray Kinsella
2019-11-08 16:56  4% [dpdk-dev] [PATCH] eventdev: reserve space in main structs for extension jerinj
2019-11-12  2:58  0% ` Thomas Monjalon
2019-11-12  8:42  4% [dpdk-dev] [dpdk-announce] release candidate 19.11-rc2 Thomas Monjalon
2019-11-12 12:37  3% [dpdk-dev] [PATCH] examples/l2fwd: fix build warning with system wide install David Marchand
2019-11-12 17:09  0% ` Ferruh Yigit
2019-11-12 19:13  0%   ` David Marchand
2019-11-12 19:33  2% [dpdk-dev] [PATCH] doc/guides: clean repeated words David Marchand
2019-11-13 10:47  0% ` Kevin Traynor
2019-11-14 12:43  4% [dpdk-dev] DPDK Release Status Meeting 14/11/2019 Ferruh Yigit
2019-11-15  3:41     [dpdk-dev] [PATCH v2] net/ice: add flow mark hint support Qi Zhang
2019-11-15 16:37     ` Stillwell Jr, Paul M
2019-11-16  1:52  3%   ` Zhang, Qi Z
2019-11-18 10:02  3% [dpdk-dev] [PATCH] mbuf: extend pktmbuf pool private structure Shahaf Shuler
2019-11-18 16:12  0% ` Stephen Hemminger
2019-11-19  6:35  0%   ` Shahaf Shuler
2019-11-19 15:23     ` Shahaf Shuler
2019-11-19 16:25       ` Stephen Hemminger
2019-11-19 22:30         ` Thomas Monjalon
2019-11-19 23:50  3%       ` Stephen Hemminger
2019-11-20  7:01  0%         ` Shahaf Shuler
2019-11-21 12:28  3% ` [dpdk-dev] [PATCH v2] " Shahaf Shuler
2019-11-21 14:31  0%   ` Olivier Matz
2019-11-24  5:53  3%   ` [dpdk-dev] [PATCH v3] " Shahaf Shuler
2019-11-25  8:12  0%     ` Olivier Matz
2019-11-25 10:21  3%     ` [dpdk-dev] [PATCH v4] " Shahaf Shuler
2019-11-25 10:27  0%       ` Olivier Matz
2019-11-25 21:42  0%         ` Thomas Monjalon
2019-11-18 10:06     [dpdk-dev] [PATCH v3 0/6] implement common rte bit operation APIs in PMDs Joyce Kong
2019-10-15  7:49     ` [dpdk-dev] [PATCH v1 0/5] " Joyce Kong
2019-11-18 10:06  2%   ` [dpdk-dev] [PATCH v3 1/6] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-11-18 13:15 22% [dpdk-dev] [PATCH] doc: add abi policy changes to release notes Ray Kinsella
2019-11-25 10:55  4% ` Mcnamara, John
2019-11-26 22:50  4%   ` Thomas Monjalon
2019-11-19 11:03     [dpdk-dev] [PATCH] doc: update git fixline alias with cc to stable Reshma Pattan
2019-11-19 11:22     ` Bruce Richardson
2019-11-19 14:40  3%   ` Kevin Traynor
2019-11-19 12:05     [dpdk-dev] [PATCH 1/3] ethdev: remove deprecation notice for packet type set Andrew Rybchenko
2019-11-22 11:15     ` [dpdk-dev] [PATCH v2 3/3] ethdev: improve flow mark Rx offload deprecation notice Thomas Monjalon
2019-11-22 11:53       ` Andrew Rybchenko
2019-11-22 18:58         ` Thomas Monjalon
2019-11-23  9:42  3%       ` Jerin Jacob
2019-11-23 18:12  0%         ` Thomas Monjalon
2019-11-25 10:44  4%           ` Jerin Jacob
2019-11-25 11:39  0%             ` Thomas Monjalon
2019-11-19 12:31  3% [dpdk-dev] [PATCH v6 0/1] Fix secondary process issue Xiaoyun wang
2019-11-20  5:26  4% [dpdk-dev] Minutes of Technical Board Meeting, 2019-11-06 Jerin Jacob Kollanukkaran
2019-11-21  0:19  3% [dpdk-dev] [dpdk-announce] release candidate 19.11-rc3 Thomas Monjalon
2019-11-21 10:28  3% [dpdk-dev] DPDK Release Status Meeting 21/11/2019 Ferruh Yigit
2019-11-22 16:03     [dpdk-dev] [PATCH 0/8] GSG Documentation updates Bruce Richardson
2019-11-22 16:03  4% ` [dpdk-dev] [PATCH 1/8] doc: update Linux GSG system requirements section Bruce Richardson
2019-11-28 11:51  0%   ` Thomas Monjalon
2019-11-28 14:11  0%     ` Bruce Richardson
2019-11-28 14:22  0%       ` Thomas Monjalon
2019-11-25 14:55     ` [dpdk-dev] [PATCH v2 0/8] GSG Documentation updates Bruce Richardson
2019-11-25 14:55  4%   ` [dpdk-dev] [PATCH v2 1/8] doc: update Linux GSG system requirements section Bruce Richardson
2019-11-23  2:59  3% [dpdk-dev] [PATCH] build: fix windows build failure for 19.11 Pallavi Kadam
2019-11-25  9:59  0% ` Bruce Richardson
2019-11-25 13:05  0% ` Burakov, Anatoly
2019-11-25 13:58  0%   ` David Marchand
2019-11-25 14:16  3%     ` David Marchand
2019-11-25 12:38  3% [dpdk-dev] [PATCH v1] doc: update release notes " John McNamara
2019-11-25 16:13 10% [dpdk-dev] [RFC PATCH] mark experimental variables David Marchand
2019-11-26  9:25  0% ` Ray Kinsella
2019-11-26 14:15  3%   ` Neil Horman
2019-11-26 14:22  0% ` Neil Horman
2019-11-27 20:45  0%   ` David Marchand
2019-11-28 13:46 42% [dpdk-dev] [PATCH] devtools: move ABI scripts from buildtools David Marchand
2019-11-28 14:23  4% ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).