Skip to content

Commit

Permalink
eal: split compat header file
Browse files Browse the repository at this point in the history
The compat.h header file provided macros for two purposes:
1. it provided the macros for marking functions as rte_experimental
2. it provided the macros for doing function versioning

Although these were in the same file, #1 is something that is for use by
public header files, which #2 is for internal use only. Therefore, we can
split these into two headers, keeping #1 in rte_compat.h and #2 in a new
file rte_function_versioning.h. For "make" builds, since internal objects
pick up the headers from the "include/" folder, we need to add the new
header to the installation list, but for "meson" builds it does not need to
be installed as it's not for public use.

The rework also serves to allow the use of the function versioning macros
to files that actually need them, so the use of experimental functions does
not need including of the versioning code.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: Andrzej Ostruszka <amo@semihalf.com>
  • Loading branch information
bruce-richardson authored and tmonjalo committed Oct 27, 2019
1 parent 7edbf7d commit dc61aa7
Show file tree
Hide file tree
Showing 12 changed files with 91 additions and 77 deletions.
2 changes: 2 additions & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ F: .ci/

ABI versioning
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-symbol-change.sh
Expand Down
3 changes: 2 additions & 1 deletion doc/api/doxy-api-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,5 +178,6 @@ The public API headers are grouped by topics:
- **misc**:
[EAL config] (@ref rte_eal.h),
[common] (@ref rte_common.h),
[ABI compat] (@ref rte_compat.h),
[experimental APIs] (@ref rte_compat.h),
[ABI versioning] (@ref rte_function_versioning.h),
[version] (@ref rte_version.h)
4 changes: 2 additions & 2 deletions doc/guides/contributing/versioning.rst
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ 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_compat.h``
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
Expand Down Expand Up @@ -362,7 +362,7 @@ the function, we add this line of code
VERSION_SYMBOL(rte_acl_create, _v20, 2.0);
Remembering to also add the rte_compat.h header to the requisite c file where
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
Expand Down
2 changes: 1 addition & 1 deletion lib/librte_distributor/rte_distributor.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include <rte_mbuf.h>
#include <rte_memory.h>
#include <rte_cycles.h>
#include <rte_compat.h>
#include <rte_function_versioning.h>
#include <rte_memzone.h>
#include <rte_errno.h>
#include <rte_string_fns.h>
Expand Down
2 changes: 1 addition & 1 deletion lib/librte_distributor/rte_distributor_v20.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include <rte_memory.h>
#include <rte_memzone.h>
#include <rte_errno.h>
#include <rte_compat.h>
#include <rte_function_versioning.h>
#include <rte_string_fns.h>
#include <rte_eal_memconfig.h>
#include <rte_pause.h>
Expand Down
1 change: 1 addition & 0 deletions lib/librte_eal/common/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
include $(RTE_SDK)/mk/rte.vars.mk

INC := rte_branch_prediction.h rte_common.h rte_compat.h
INC += rte_function_versioning.h
INC += rte_debug.h rte_eal.h rte_eal_interrupts.h
INC += rte_errno.h rte_launch.h rte_lcore.h
INC += rte_log.h rte_memory.h rte_memzone.h
Expand Down
70 changes: 0 additions & 70 deletions lib/librte_eal/common/include/rte_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,76 +5,6 @@

#ifndef _RTE_COMPAT_H_
#define _RTE_COMPAT_H_
#include <rte_common.h>

#ifdef RTE_BUILD_SHARED_LIB

/*
* Provides backwards compatibility when updating exported functions.
* When a symol is exported from a library to provide an API, it also provides a
* calling convention (ABI) that is embodied in its name, return type,
* arguments, etc. On occasion that function may need to change to accommodate
* new functionality, behavior, etc. When that occurs, it is desirable to
* allow for backwards compatibility for a time with older binaries that are
* dynamically linked to the dpdk. To support that, the __vsym and
* VERSION_SYMBOL macros are created. They, in conjunction with the
* <library>_version.map file for a given library allow for multiple versions of
* a symbol to exist in a shared library so that older binaries need not be
* immediately recompiled.
*
* Refer to the guidelines document in the docs subdirectory for details on the
* use of these macros
*/

/*
* Macro Parameters:
* b - function base name
* e - function version extension, to be concatenated with base name
* n - function symbol version string to be applied
* f - function prototype
* p - full function symbol name
*/

/*
* VERSION_SYMBOL
* Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
* 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>
*/
#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))

/*
* MAP_STATIC_SYMBOL
* If a function has been bifurcated into multiple versions, none of which
* are defined as the exported symbol name in the map file, this macro can be
* used to alias a specific version of the symbol to its exported name. For
* example, if you have 2 versions of a function foo_v1 and foo_v2, where the
* former is mapped to foo@DPDK_1 and the latter is mapped to foo@DPDK_2 when
* building a shared library, this macro can be used to map either foo_v1 or
* foo_v2 to the symbol foo when building a static library, e.g.:
* MAP_STATIC_SYMBOL(void foo(), foo_v2);
*/
#define MAP_STATIC_SYMBOL(f, p)

#else
/*
* No symbol versioning in use
*/
#define VERSION_SYMBOL(b, e, n)
#define __vsym
#define BIND_DEFAULT_SYMBOL(b, e, n)
#define MAP_STATIC_SYMBOL(f, p) f __attribute__((alias(RTE_STR(p))))
/*
* RTE_BUILD_SHARED_LIB=n
*/
#endif

#ifndef ALLOW_EXPERIMENTAL_API

Expand Down
79 changes: 79 additions & 0 deletions lib/librte_eal/common/include/rte_function_versioning.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2015 Neil Horman <nhorman@tuxdriver.com>.
* All rights reserved.
*/

#ifndef _RTE_FUNCTION_VERSIONING_H_
#define _RTE_FUNCTION_VERSIONING_H_
#include <rte_common.h>

#ifdef RTE_BUILD_SHARED_LIB

/*
* Provides backwards compatibility when updating exported functions.
* When a symol is exported from a library to provide an API, it also provides a
* calling convention (ABI) that is embodied in its name, return type,
* arguments, etc. On occasion that function may need to change to accommodate
* new functionality, behavior, etc. When that occurs, it is desirable to
* allow for backwards compatibility for a time with older binaries that are
* dynamically linked to the dpdk. To support that, the __vsym and
* VERSION_SYMBOL macros are created. They, in conjunction with the
* <library>_version.map file for a given library allow for multiple versions of
* a symbol to exist in a shared library so that older binaries need not be
* immediately recompiled.
*
* Refer to the guidelines document in the docs subdirectory for details on the
* use of these macros
*/

/*
* Macro Parameters:
* b - function base name
* e - function version extension, to be concatenated with base name
* n - function symbol version string to be applied
* f - function prototype
* p - full function symbol name
*/

/*
* VERSION_SYMBOL
* Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
* 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>
*/
#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))

/*
* MAP_STATIC_SYMBOL
* If a function has been bifurcated into multiple versions, none of which
* are defined as the exported symbol name in the map file, this macro can be
* used to alias a specific version of the symbol to its exported name. For
* example, if you have 2 versions of a function foo_v1 and foo_v2, where the
* former is mapped to foo@DPDK_1 and the latter is mapped to foo@DPDK_2 when
* building a shared library, this macro can be used to map either foo_v1 or
* foo_v2 to the symbol foo when building a static library, e.g.:
* MAP_STATIC_SYMBOL(void foo(), foo_v2);
*/
#define MAP_STATIC_SYMBOL(f, p)

#else
/*
* No symbol versioning in use
*/
#define VERSION_SYMBOL(b, e, n)
#define __vsym
#define BIND_DEFAULT_SYMBOL(b, e, n)
#define MAP_STATIC_SYMBOL(f, p) f __attribute__((alias(RTE_STR(p))))
/*
* RTE_BUILD_SHARED_LIB=n
*/
#endif

#endif /* _RTE_FUNCTION_VERSIONING_H_ */
1 change: 1 addition & 0 deletions lib/librte_lpm/rte_lpm.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <rte_rwlock.h>
#include <rte_spinlock.h>
#include <rte_tailq.h>
#include <rte_function_versioning.h>

#include "rte_lpm.h"

Expand Down
1 change: 0 additions & 1 deletion lib/librte_lpm/rte_lpm.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#include <rte_memory.h>
#include <rte_common.h>
#include <rte_vect.h>
#include <rte_compat.h>

#ifdef __cplusplus
extern "C" {
Expand Down
1 change: 1 addition & 0 deletions lib/librte_lpm/rte_lpm6.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <assert.h>
#include <rte_jhash.h>
#include <rte_tailq.h>
#include <rte_function_versioning.h>

#include "rte_lpm6.h"

Expand Down
2 changes: 1 addition & 1 deletion lib/librte_timer/rte_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
#include <rte_pause.h>
#include <rte_memzone.h>
#include <rte_malloc.h>
#include <rte_compat.h>
#include <rte_errno.h>
#include <rte_function_versioning.h>

#include "rte_timer.h"

Expand Down

0 comments on commit dc61aa7

Please sign in to comment.