doc: update versioning guide for ABI versions
[dpdk.git] / doc / guides / contributing / abi_policy.rst
1 ..  SPDX-License-Identifier: BSD-3-Clause
2     Copyright 2019 The DPDK contributors
3
4 ABI Policy
5 ==========
6
7 Description
8 -----------
9
10 This document details the management policy that ensures the long-term stability
11 of the DPDK ABI and API.
12
13 General Guidelines
14 ------------------
15
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
34    ABI change.
35
36 .. note::
37
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.
43
44 What is an ABI?
45 ~~~~~~~~~~~~~~~
46
47 An ABI (Application Binary Interface) is the set of runtime interfaces exposed
48 by a library. It is similar to an API (Application Programming Interface) but
49 is the result of compilation.  It is also effectively cloned when applications
50 link to dynamic libraries.  That is to say when an application is compiled to
51 link against dynamic libraries, it is assumed that the ABI remains constant
52 between the time the application is compiled/linked, and the time that it runs.
53 Therefore, in the case of dynamic linking, it is critical that an ABI is
54 preserved, or (when modified), done in such a way that the application is unable
55 to behave improperly or in an unexpected fashion.
56
57 .. _figure_what_is_an_abi:
58
59 .. figure:: img/what_is_an_abi.*
60
61             Illustration of DPDK API and ABI.
62
63
64 What is an ABI version?
65 ~~~~~~~~~~~~~~~~~~~~~~~
66
67 An ABI version is an instance of a library's ABI at a specific release. Certain
68 releases are considered to be milestone releases, the yearly LTS release for
69 example. The ABI of a milestone release may be declared as a 'major ABI
70 version', where this ABI version is then supported for some number of subsequent
71 releases and is annotated in the library's :ref:`soname<what_is_soname>`.
72
73 ABI version support in subsequent releases facilitates application upgrades, by
74 enabling applications built against the milestone release to upgrade to
75 subsequent releases of a library without a rebuild.
76
77 More details on major ABI version can be found in the :ref:`ABI versioning
78 <major_abi_versions>` guide.
79
80 The DPDK ABI policy
81 -------------------
82
83 A new major ABI version is declared no more frequently than yearly, with
84 declarations usually aligning with a LTS release, e.g. ABI 20 for DPDK 19.11.
85 Compatibility with the major ABI version is then mandatory in subsequent
86 releases until the next major ABI version is declared, e.g. ABI 21 for DPDK
87 20.11.
88
89 At the declaration of a major ABI version, major version numbers encoded in
90 libraries' sonames are bumped to indicate the new version, with the minor
91 version reset to ``0``. An example would be ``librte_eal.so.20.3`` would become
92 ``librte_eal.so.21.0``.
93
94 The ABI may then change multiple times, without warning, between the last major
95 ABI version increment and the HEAD label of the git tree, with the condition
96 that ABI compatibility with the major ABI version is preserved and therefore
97 sonames do not change.
98
99 Minor versions are incremented to indicate the release of a new ABI compatible
100 DPDK release, typically the DPDK quarterly releases. An example of this, might
101 be that ``librte_eal.so.20.1`` would indicate the first ABI compatible DPDK
102 release, following the declaration of the new major ABI version ``20``.
103
104 An ABI version is supported in all new releases until the next major ABI version
105 is declared. When changing the major ABI version, the release notes will detail
106 all ABI changes.
107
108 .. _figure_abi_stability_policy:
109
110 .. figure:: img/abi_stability_policy.*
111
112             Mapping of new ABI versions and ABI version compatibility to DPDK
113             releases.
114
115 .. _abi_changes:
116
117 ABI Changes
118 ~~~~~~~~~~~
119
120 The ABI may still change after the declaration of a major ABI version, that is
121 new APIs may be still added or existing APIs may be modified.
122
123 .. Warning::
124
125    Note that, this policy details the method by which the ABI may be changed,
126    with due regard to preserving compatibility and observing deprecation
127    notices. This process however should not be undertaken lightly, as a general
128    rule ABI stability is extremely important for downstream consumers of DPDK.
129    The API should only be changed for significant reasons, such as performance
130    enhancements. API breakages due to changes such as reorganizing public
131    structure fields for aesthetic or readability purposes should be avoided.
132
133 The requirements for changing the ABI are:
134
135 #. At least 3 acknowledgments of the need to do so must be made on the
136    dpdk.org mailing list.
137
138    - The acknowledgment of the maintainer of the component is mandatory, or if
139      no maintainer is available for the component, the tree/sub-tree maintainer
140      for that component must acknowledge the ABI change instead.
141
142    - The acknowledgment of three members of the technical board, as delegates
143      of the `technical board <https://core.dpdk.org/techboard/>`_ acknowledging
144      the need for the ABI change, is also mandatory.
145
146    - It is also recommended that acknowledgments from different "areas of
147      interest" be sought for each deprecation, for example: from NIC vendors,
148      CPU vendors, end-users, etc.
149
150 #. Backward compatibility with the major ABI version must be maintained through
151    :ref:`abi_versioning`, with :ref:`forward-only <forward-only>` compatibility
152    offered for any ABI changes that are indicated to be part of the next ABI
153    version.
154
155    - In situations where backward compatibility is not possible, read the
156      section on :ref:`abi_breakages`.
157
158    - No backward or forward compatibility is offered for API changes marked as
159      ``experimental``, as described in the section on :ref:`Experimental APIs
160      and Libraries <experimental_apis>`.
161
162 #. If a newly proposed API functionally replaces an existing one, when the new
163    API becomes non-experimental, then the old one is marked with
164    ``__rte_deprecated``.
165
166     - The depreciated API should follow the notification process to be removed,
167       see  :ref:`deprecation_notices`.
168
169     - At the declaration of the next major ABI version, those ABI changes then
170       become a formal part of the new ABI and the requirement to preserve ABI
171       compatibility with the last major ABI version is then dropped.
172
173     - The responsibility for removing redundant ABI compatibility code rests
174       with the original contributor of the ABI changes, failing that, then with
175       the contributor's company and then finally with the maintainer.
176
177 .. _forward-only:
178
179 .. Note::
180
181    Note that forward-only compatibility is offered for those changes made
182    between major ABI versions. As a library's soname can only describe
183    compatibility with the last major ABI version, until the next major ABI
184    version is declared, these changes therefore cannot be resolved as a runtime
185    dependency through the soname. Therefore any application wishing to make use
186    of these ABI changes can only ensure that its runtime dependencies are met
187    through Operating System package versioning.
188
189 .. _hw_rqmts:
190
191 .. Note::
192
193    Updates to the minimum hardware requirements, which drop support for hardware
194    which was previously supported, should be treated as an ABI change, and
195    follow the relevant deprecation policy procedures as above: 3 acks, technical
196    board approval and announcement at least one release in advance.
197
198 .. _abi_breakages:
199
200 ABI Breakages
201 ~~~~~~~~~~~~~
202
203 For those ABI changes that are too significant to reasonably maintain multiple
204 symbol versions, there is an amended process. In these cases, ABIs may be
205 updated without the requirement of backward compatibility being provided. These
206 changes must follow the same process :ref:`described above <abi_changes>` as non-breaking
207 changes, however with the following additional requirements:
208
209 #. ABI breaking changes (including an alternative map file) can be included with
210    deprecation notice, in wrapped way by the ``RTE_NEXT_ABI`` option, to provide
211    more details about oncoming changes. ``RTE_NEXT_ABI`` wrapper will be removed
212    at the declaration of the next major ABI version.
213
214 #. Once approved, and after the deprecation notice has been observed these
215    changes will form part of the next declared major ABI version.
216
217 Examples of ABI Changes
218 ~~~~~~~~~~~~~~~~~~~~~~~
219
220 The following are examples of allowable ABI changes occurring between
221 declarations of major ABI versions.
222
223 * DPDK 19.11 release, defines the function ``rte_foo()``, and ``rte_foo()``
224   as part of the major ABI version ``20``.
225
226 * DPDK 20.02 release defines a new function ``rte_foo(uint8_t bar)``, and
227   this is not a problem as long as the symbol ``rte_foo@DPDK20`` is
228   preserved through :ref:`abi_versioning`.
229
230   - The new function may be marked with the ``__rte_experimental`` tag for a
231     number of releases, as described in the section :ref:`experimental_apis`.
232
233   - Once ``rte_foo(uint8_t bar)`` becomes non-experimental ``rte_foo()`` is then
234     declared as ``__rte_depreciated``, with an associated deprecation notice
235     provided.
236
237 * DPDK 19.11 is not re-released to include ``rte_foo(uint8_t bar)``, the new
238   version of ``rte_foo`` only exists from DPDK 20.02 onwards as described in the
239   :ref:`note on forward-only compatibility<forward-only>`.
240
241 * DPDK 20.02 release defines the experimental function ``__rte_experimental
242   rte_baz()``. This function may or may not exist in the DPDK 20.05 release.
243
244 * An application ``dPacket`` wishes to use ``rte_foo(uint8_t bar)``, before the
245   declaration of the DPDK ``21`` major API version. The application can only
246   ensure its runtime dependencies are met by specifying ``DPDK (>= 20.2)`` as
247   an explicit package dependency, as the soname only may only indicate the
248   supported major ABI version.
249
250 * At the release of DPDK 20.11, the function ``rte_foo(uint8_t bar)`` becomes
251   formally part of then new major ABI version DPDK 21.0 and ``rte_foo()`` may be
252   removed.
253
254 .. _deprecation_notices:
255
256 Examples of Deprecation Notices
257 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
258
259 The following are some examples of ABI deprecation notices which would be
260 added to the Release Notes:
261
262 * The Macro ``#RTE_FOO`` is deprecated and will be removed with ABI version
263   21, to be replaced with the inline function ``rte_foo()``.
264
265 * The function ``rte_mbuf_grok()`` has been updated to include a new parameter
266   in version 20.2. Backwards compatibility will be maintained for this function
267   until the release of the new DPDK major ABI version 21, in DPDK version
268   20.11.
269
270 * The members of ``struct rte_foo`` have been reorganized in DPDK 20.02 for
271   performance reasons. Existing binary applications will have backwards
272   compatibility in release 20.02, while newly built binaries will need to
273   reference the new structure variant ``struct rte_foo2``. Compatibility will be
274   removed in release 20.11, and all applications will require updating and
275   rebuilding to the new structure at that time, which will be renamed to the
276   original ``struct rte_foo``.
277
278 * Significant ABI changes are planned for the ``librte_dostuff`` library. The
279   upcoming release 20.02 will not contain these changes, but release 20.11 will,
280   and no backwards compatibility is planned due to the extensive nature of
281   these changes. Binaries using this library built prior to ABI version 21 will
282   require updating and recompilation.
283
284 .. _experimental_apis:
285
286 Experimental
287 ------------
288
289 APIs
290 ~~~~
291
292 APIs marked as ``experimental`` are not considered part of an ABI version and
293 may change without warning at any time. Since changes to APIs are most likely
294 immediately after their introduction, as users begin to take advantage of those
295 new APIs and start finding issues with them, new DPDK APIs will be automatically
296 marked as ``experimental`` to allow for a period of stabilization before they
297 become part of a tracked ABI version.
298
299 Note that marking an API as experimental is a multi step process.
300 To mark an API as experimental, the symbols which are desired to be exported
301 must be placed in an EXPERIMENTAL version block in the corresponding libraries'
302 version map script.
303 Secondly, the corresponding prototypes of those exported functions (in the
304 development header files), must be marked with the ``__rte_experimental`` tag
305 (see ``rte_compat.h``).
306 The DPDK build makefiles perform a check to ensure that the map file and the
307 C code reflect the same list of symbols.
308 This check can be circumvented by defining ``ALLOW_EXPERIMENTAL_API``
309 during compilation in the corresponding library Makefile.
310
311 In addition to tagging the code with ``__rte_experimental``,
312 the doxygen markup must also contain the EXPERIMENTAL string,
313 and the MAINTAINERS file should note the EXPERIMENTAL libraries.
314
315 For removing the experimental tag associated with an API, deprecation notice is
316 not required. Though, an API should remain in experimental state for at least
317 one release. Thereafter, the normal process of posting patch for review to
318 mailing list can be followed.
319
320 Libraries
321 ~~~~~~~~~
322
323 Libraries marked as ``experimental`` are entirely not considered part of an ABI
324 version, and may change without warning at any time. Experimental libraries
325 always have a major version of ``0`` to indicate they exist outside of
326 :ref:`abi_versioning` , with the minor version incremented with each ABI change
327 to library.