1 .. SPDX-License-Identifier: BSD-3-Clause
2 Copyright 2019 The DPDK contributors
10 This document details the management policy that ensures the long-term stability
11 of the DPDK ABI and API.
16 #. Major ABI versions are declared no more frequently than yearly. Compatibility
17 with the major ABI version is mandatory in subsequent releases until a new
18 major ABI version is declared.
19 #. Major ABI versions are usually but not always declared aligned with a
20 :ref:`LTS release <stable_lts_releases>`.
21 #. The ABI version is managed at a project level in DPDK, and is reflected in
22 all non-experimental :ref:`library's soname <what_is_soname>`.
23 #. The ABI should be preserved and not changed lightly. ABI changes must follow
24 the outlined :ref:`deprecation process <abi_changes>`.
25 #. The addition of symbols is generally not problematic. The modification of
26 symbols is managed with :ref:`ABI Versioning <abi_versioning>`.
27 #. The removal of symbols is considered an :ref:`ABI breakage <abi_breakages>`,
28 once approved these will form part of the next ABI version.
29 #. Libraries or APIs marked as :ref:`experimental <experimental_apis>` may
30 change without constraint, as they are not considered part of an ABI version.
31 Experimental libraries have the major ABI version ``0``.
32 #. Updates to the :ref:`minimum hardware requirements <hw_rqmts>`, which drop
33 support for hardware which was previously supported, should be treated as an
38 In 2019, the DPDK community stated its intention to move to ABI stable
39 releases, over a number of release cycles. This change begins with
40 maintaining ABI stability through one year of DPDK releases starting from
41 DPDK 19.11. This policy will be reviewed in 2020, with intention of
42 lengthening the stability period. Additional implementation detail can be
43 found in the :ref:`release notes <20_02_abi_changes>`.
48 An ABI (Application Binary Interface) is the set of runtime interfaces exposed
49 by a library. It is similar to an API (Application Programming Interface) but
50 is the result of compilation. It is also effectively cloned when applications
51 link to dynamic libraries. That is to say when an application is compiled to
52 link against dynamic libraries, it is assumed that the ABI remains constant
53 between the time the application is compiled/linked, and the time that it runs.
54 Therefore, in the case of dynamic linking, it is critical that an ABI is
55 preserved, or (when modified), done in such a way that the application is unable
56 to behave improperly or in an unexpected fashion.
58 .. _figure_what_is_an_abi:
60 .. figure:: img/what_is_an_abi.*
62 Illustration of DPDK API and ABI.
65 What is an ABI version?
66 ~~~~~~~~~~~~~~~~~~~~~~~
68 An ABI version is an instance of a library's ABI at a specific release. Certain
69 releases are considered to be milestone releases, the yearly LTS release for
70 example. The ABI of a milestone release may be declared as a 'major ABI
71 version', where this ABI version is then supported for some number of subsequent
72 releases and is annotated in the library's :ref:`soname<what_is_soname>`.
74 ABI version support in subsequent releases facilitates application upgrades, by
75 enabling applications built against the milestone release to upgrade to
76 subsequent releases of a library without a rebuild.
78 More details on major ABI version can be found in the :ref:`ABI versioning
79 <major_abi_versions>` guide.
84 A new major ABI version is declared no more frequently than yearly, with
85 declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
86 Compatibility with the major ABI version is then mandatory in subsequent
87 releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
90 At the declaration of a major ABI version, major version numbers encoded in
91 libraries' sonames are bumped to indicate the new version, with the minor
92 version reset to ``0``. An example would be ``librte_eal.so.20.3`` would become
93 ``librte_eal.so.21.0``.
95 The ABI may then change multiple times, without warning, between the last major
96 ABI version increment and the HEAD label of the git tree, with the condition
97 that ABI compatibility with the major ABI version is preserved and therefore
98 sonames do not change.
100 Minor versions are incremented to indicate the release of a new ABI compatible
101 DPDK release, typically the DPDK quarterly releases. An example of this, might
102 be that ``librte_eal.so.20.1`` would indicate the first ABI compatible DPDK
103 release, following the declaration of the new major ABI version ``20``.
105 An ABI version is supported in all new releases until the next major ABI version
106 is declared. When changing the major ABI version, the release notes will detail
109 .. _figure_abi_stability_policy:
111 .. figure:: img/abi_stability_policy.*
113 Mapping of new ABI versions and ABI version compatibility to DPDK
121 The ABI may still change after the declaration of a major ABI version, that is
122 new APIs may be still added or existing APIs may be modified.
126 Note that, this policy details the method by which the ABI may be changed,
127 with due regard to preserving compatibility and observing deprecation
128 notices. This process however should not be undertaken lightly, as a general
129 rule ABI stability is extremely important for downstream consumers of DPDK.
130 The API should only be changed for significant reasons, such as performance
131 enhancements. API breakages due to changes such as reorganizing public
132 structure fields for aesthetic or readability purposes should be avoided.
134 The requirements for changing the ABI are:
136 #. At least 3 acknowledgments of the need to do so must be made on the
137 dpdk.org mailing list.
139 - The acknowledgment of the maintainer of the component is mandatory, or if
140 no maintainer is available for the component, the tree/sub-tree maintainer
141 for that component must acknowledge the ABI change instead.
143 - The acknowledgment of three members of the technical board, as delegates
144 of the `technical board <https://core.dpdk.org/techboard/>`_ acknowledging
145 the need for the ABI change, is also mandatory.
147 - It is also recommended that acknowledgments from different "areas of
148 interest" be sought for each deprecation, for example: from NIC vendors,
149 CPU vendors, end-users, etc.
151 #. Backward compatibility with the major ABI version must be maintained through
152 :ref:`abi_versioning`, with :ref:`forward-only <forward-only>` compatibility
153 offered for any ABI changes that are indicated to be part of the next ABI
156 - In situations where backward compatibility is not possible, read the
157 section on :ref:`abi_breakages`.
159 - No backward or forward compatibility is offered for API changes marked as
160 ``experimental``, as described in the section on :ref:`Experimental APIs
161 and Libraries <experimental_apis>`.
163 - In situations in which an ``experimental`` symbol has been stable for some
164 time. When promoting the symbol to become part of the next ABI version, the
165 maintainer may choose to provide an alias to the ``experimental`` tag, so
166 as not to break consuming applications.
168 #. If a newly proposed API functionally replaces an existing one, when the new
169 API becomes non-experimental, then the old one is marked with
170 ``__rte_deprecated``.
172 - The depreciated API should follow the notification process to be removed,
173 see :ref:`deprecation_notices`.
175 - At the declaration of the next major ABI version, those ABI changes then
176 become a formal part of the new ABI and the requirement to preserve ABI
177 compatibility with the last major ABI version is then dropped.
179 - The responsibility for removing redundant ABI compatibility code rests
180 with the original contributor of the ABI changes, failing that, then with
181 the contributor's company and then finally with the maintainer.
187 Note that forward-only compatibility is offered for those changes made
188 between major ABI versions. As a library's soname can only describe
189 compatibility with the last major ABI version, until the next major ABI
190 version is declared, these changes therefore cannot be resolved as a runtime
191 dependency through the soname. Therefore any application wishing to make use
192 of these ABI changes can only ensure that its runtime dependencies are met
193 through Operating System package versioning.
199 Updates to the minimum hardware requirements, which drop support for hardware
200 which was previously supported, should be treated as an ABI change, and
201 follow the relevant deprecation policy procedures as above: 3 acks, technical
202 board approval and announcement at least one release in advance.
209 For those ABI changes that are too significant to reasonably maintain multiple
210 symbol versions, there is an amended process. In these cases, ABIs may be
211 updated without the requirement of backward compatibility being provided. These
212 changes must follow the same process :ref:`described above <abi_changes>` as non-breaking
213 changes, however with the following additional requirements:
215 #. ABI breaking changes (including an alternative map file) can be included with
216 deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option, to provide
217 more details about oncoming changes. ``RTE_NEXT_ABI`` wrapper will be removed
218 at the declaration of the next major ABI version.
220 #. Once approved, and after the deprecation notice has been observed these
221 changes will form part of the next declared major ABI version.
223 Examples of ABI Changes
224 ~~~~~~~~~~~~~~~~~~~~~~~
226 The following are examples of allowable ABI changes occurring between
227 declarations of major ABI versions.
229 * DPDK 19.11 release defines the function ``rte_foo()`` ; ``rte_foo()``
230 is part of the major ABI version ``20``.
232 * DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``.
233 This is not a problem as long as the symbol ``rte_foo@DPDK20`` is
234 preserved through :ref:`abi_versioning`.
236 - The new function may be marked with the ``__rte_experimental`` tag for a
237 number of releases, as described in the section :ref:`experimental_apis`.
239 - Once ``rte_foo(uint8_t bar)`` becomes non-experimental, ``rte_foo()`` is
240 declared as ``__rte_deprecated`` and an deprecation notice is provided.
242 * DPDK 19.11 is not re-released to include ``rte_foo(uint8_t bar)``, the new
243 version of ``rte_foo`` only exists from DPDK 20.02 onwards as described in the
244 :ref:`note on forward-only compatibility<forward-only>`.
246 * DPDK 20.02 release defines the experimental function ``__rte_experimental
247 rte_baz()``. This function may or may not exist in the DPDK 20.05 release.
249 * An application ``dPacket`` wishes to use ``rte_foo(uint8_t bar)``, before the
250 declaration of the DPDK ``21`` major ABI version. The application can only
251 ensure its runtime dependencies are met by specifying ``DPDK (>= 20.2)`` as
252 an explicit package dependency, as the soname can only indicate the
253 supported major ABI version.
255 * At the release of DPDK 20.11, the function ``rte_foo(uint8_t bar)`` becomes
256 formally part of then new major ABI version DPDK ``21`` and ``rte_foo()`` may be
259 .. _deprecation_notices:
261 Examples of Deprecation Notices
262 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
264 The following are some examples of ABI deprecation notices which would be
265 added to the Release Notes:
267 * The Macro ``#RTE_FOO`` is deprecated and will be removed with ABI version
268 21, to be replaced with the inline function ``rte_foo()``.
270 * The function ``rte_mbuf_grok()`` has been updated to include a new parameter
271 in version 20.2. Backwards compatibility will be maintained for this function
272 until the release of the new DPDK major ABI version 21, in DPDK version
275 * The members of ``struct rte_foo`` have been reorganized in DPDK 20.02 for
276 performance reasons. Existing binary applications will have backwards
277 compatibility in release 20.02, while newly built binaries will need to
278 reference the new structure variant ``struct rte_foo2``. Compatibility will be
279 removed in release 20.11, and all applications will require updating and
280 rebuilding to the new structure at that time, which will be renamed to the
281 original ``struct rte_foo``.
283 * Significant ABI changes are planned for the ``librte_dostuff`` library. The
284 upcoming release 20.02 will not contain these changes, but release 20.11 will,
285 and no backwards compatibility is planned due to the extensive nature of
286 these changes. Binaries using this library built prior to ABI version 21 will
287 require updating and recompilation.
289 .. _experimental_apis:
297 APIs marked as ``experimental`` are not considered part of an ABI version and
298 may change without warning at any time. Since changes to APIs are most likely
299 immediately after their introduction, as users begin to take advantage of those
300 new APIs and start finding issues with them, new DPDK APIs will be automatically
301 marked as ``experimental`` to allow for a period of stabilization before they
302 become part of a tracked ABI version.
304 Note that marking an API as experimental is a multi step process.
305 To mark an API as experimental, the symbols which are desired to be exported
306 must be placed in an EXPERIMENTAL version block in the corresponding libraries'
308 Secondly, the corresponding prototypes of those exported functions (in the
309 development header files), must be marked with the ``__rte_experimental`` tag
310 (see ``rte_compat.h``).
311 The DPDK build makefiles perform a check to ensure that the map file and the
312 C code reflect the same list of symbols.
313 This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
314 during compilation in the corresponding library Makefile.
316 In addition to tagging the code with ``__rte_experimental``,
317 the doxygen markup must also contain the EXPERIMENTAL string,
318 and the MAINTAINERS file should note the EXPERIMENTAL libraries.
320 For removing the experimental tag associated with an API, deprecation notice is
321 not required. Though, an API should remain in experimental state for at least
322 one release. Thereafter, the normal process of posting patch for review to
323 mailing list can be followed.
325 After the experimental tag has been formally removed, a tree/sub-tree maintainer
326 may choose to offer an alias to the experimental tag so as not to break
327 applications using the symbol. The alias is then dropped at the declaration of
328 next major ABI version.
333 Libraries marked as ``experimental`` are entirely not considered part of an ABI
334 version, and may change without warning at any time. Experimental libraries
335 always have a major ABI version of ``0`` to indicate they exist outside of
336 :ref:`abi_versioning` , with the minor version incremented with each ABI change