3. ABI Policy
3.1. Description
This document details the management policy that ensures the long-term stability of the DPDK ABI and API.
3.2. General Guidelines
- 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 LTS release.
- 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 deprecation process.
- The addition of symbols is generally not problematic. The modification of symbols is managed with ABI Versioning.
- The removal of symbols is considered an ABI breakage, once approved these will form part of the next ABI version.
- Libraries or APIs marked as experimental 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 minimum hardware requirements, 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. Additional implementation detail can be found in the release notes.
3.2.1. 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.
3.2.2. 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.
3.3. 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.
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
.
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.
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
.
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.
3.3.1. 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.
- 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.
- The acknowledgment of three members of the technical board, as delegates of the technical board 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.
Backward compatibility with the major ABI version must be maintained through ABI Versioning, with forward-only compatibility offered for any ABI changes that are indicated to be part of the next ABI version.
- In situations where backward compatibility is not possible, read the section on ABI Breakages.
- No backward or forward compatibility is offered for API changes marked as
experimental
, as described in the section on Experimental APIs and Libraries. - In situations in which an
experimental
symbol has been stable for some time. When promoting the symbol to become part of the next ABI version, the maintainer may choose to provide an alias to theexperimental
tag, so as not to break consuming applications.
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 Examples of 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.
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.
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, technical board approval and announcement at least one release in advance.
3.3.2. 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 described above 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.
3.3.3. 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()
;rte_foo()
is part of the major ABI version20
. - DPDK 20.02 release defines a new function
rte_foo(uint8_t bar)
. This is not a problem as long as the symbolrte_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 Experimental. - Once
rte_foo(uint8_t bar)
becomes non-experimental,rte_foo()
is declared as__rte_deprecated
and an deprecation notice is provided.
- The new function may be marked with the
- DPDK 19.11 is not re-released to include
rte_foo(uint8_t bar)
, the new version ofrte_foo
only exists from DPDK 20.02 onwards as described in the note on forward-only compatibility. - 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 userte_foo(uint8_t bar)
, before the declaration of the DPDK21
major ABI version. The application can only ensure its runtime dependencies are met by specifyingDPDK (>= 20.2)
as an explicit package dependency, as the soname can 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 DPDK21
andrte_foo()
may be removed.
3.3.4. 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 ABI version 21, to be replaced with the inline functionrte_foo()
. - The function
rte_mbuf_grok()
has been updated to include a new parameter 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 DPDK 20.02 for performance reasons. Existing binary applications will have backwards compatibility in release 20.02, while newly built binaries will need to reference the new structure variantstruct 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 originalstruct rte_foo
. - Significant ABI changes are planned for the
librte_dostuff
library. The 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 ABI version 21 will require updating and recompilation.
3.4. Experimental
3.4.1. APIs
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
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, the normal process of posting patch for review to mailing list can be followed.
After the experimental tag has been formally removed, a tree/sub-tree maintainer may choose to offer an alias to the experimental tag so as not to break applications using the symbol. The alias is then dropped at the declaration of next major ABI version.
3.4.2. 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 ABI version of 0
to indicate they exist outside of
ABI Versioning , with the minor version incremented with each ABI change
to library.