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