[2/7] eal: fix multiple definition of per lcore thread id
Checks
Commit Message
Because of the inline accessor + static declaration in rte_gettid(),
we end up with multiple symbols for RTE_PER_LCORE(_thread_id).
Each compilation unit will pay a cost when accessing this information
for the first time.
$ nm build/app/dpdk-testpmd | grep per_lcore__thread_id
0000000000000054 d per_lcore__thread_id.5037
0000000000000040 d per_lcore__thread_id.5103
0000000000000048 d per_lcore__thread_id.5259
000000000000004c d per_lcore__thread_id.5259
0000000000000044 d per_lcore__thread_id.5933
0000000000000058 d per_lcore__thread_id.6261
0000000000000050 d per_lcore__thread_id.7378
000000000000005c d per_lcore__thread_id.7496
000000000000000c d per_lcore__thread_id.8016
0000000000000010 d per_lcore__thread_id.8431
Make it global as part of the DPDK_21 stable ABI.
Fixes: ef76436c6834 ("eal: get unique thread id")
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
lib/librte_eal/common/eal_common_thread.c | 1 +
lib/librte_eal/include/rte_eal.h | 3 ++-
lib/librte_eal/rte_eal_version.map | 7 +++++++
3 files changed, 10 insertions(+), 1 deletion(-)
Comments
On 10/06/2020 15:45, David Marchand wrote:
> Because of the inline accessor + static declaration in rte_gettid(),
> we end up with multiple symbols for RTE_PER_LCORE(_thread_id).
> Each compilation unit will pay a cost when accessing this information
> for the first time.
>
> $ nm build/app/dpdk-testpmd | grep per_lcore__thread_id
> 0000000000000054 d per_lcore__thread_id.5037
> 0000000000000040 d per_lcore__thread_id.5103
> 0000000000000048 d per_lcore__thread_id.5259
> 000000000000004c d per_lcore__thread_id.5259
> 0000000000000044 d per_lcore__thread_id.5933
> 0000000000000058 d per_lcore__thread_id.6261
> 0000000000000050 d per_lcore__thread_id.7378
> 000000000000005c d per_lcore__thread_id.7496
> 000000000000000c d per_lcore__thread_id.8016
> 0000000000000010 d per_lcore__thread_id.8431
>
> Make it global as part of the DPDK_21 stable ABI.
>
> Fixes: ef76436c6834 ("eal: get unique thread id")
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> lib/librte_eal/common/eal_common_thread.c | 1 +
> lib/librte_eal/include/rte_eal.h | 3 ++-
> lib/librte_eal/rte_eal_version.map | 7 +++++++
> 3 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c
> index 25200e5a99..f04d880880 100644
> --- a/lib/librte_eal/common/eal_common_thread.c
> +++ b/lib/librte_eal/common/eal_common_thread.c
> @@ -24,6 +24,7 @@
> #include "eal_thread.h"
>
> RTE_DEFINE_PER_LCORE(unsigned int, _lcore_id) = LCORE_ID_ANY;
> +RTE_DEFINE_PER_LCORE(int, _thread_id) = -1;
> static RTE_DEFINE_PER_LCORE(unsigned int, _socket_id) =
> (unsigned int)SOCKET_ID_ANY;
> static RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
> diff --git a/lib/librte_eal/include/rte_eal.h b/lib/librte_eal/include/rte_eal.h
> index 2f9ed298de..2edf8c6556 100644
> --- a/lib/librte_eal/include/rte_eal.h
> +++ b/lib/librte_eal/include/rte_eal.h
> @@ -447,6 +447,8 @@ enum rte_intr_mode rte_eal_vfio_intr_mode(void);
> */
> int rte_sys_gettid(void);
>
> +RTE_DECLARE_PER_LCORE(int, _thread_id);
> +
> /**
> * Get system unique thread id.
> *
> @@ -456,7 +458,6 @@ int rte_sys_gettid(void);
> */
> static inline int rte_gettid(void)
> {
> - static RTE_DEFINE_PER_LCORE(int, _thread_id) = -1;
> if (RTE_PER_LCORE(_thread_id) == -1)
> RTE_PER_LCORE(_thread_id) = rte_sys_gettid();
> return RTE_PER_LCORE(_thread_id);
> diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
> index d8038749a4..fdfc3f1a88 100644
> --- a/lib/librte_eal/rte_eal_version.map
> +++ b/lib/librte_eal/rte_eal_version.map
> @@ -221,6 +221,13 @@ DPDK_20.0 {
> local: *;
> };
>
> +DPDK_21 {
> + global:
> +
> + per_lcore__thread_id;
> +
> +} DPDK_20.0;
> +
> EXPERIMENTAL {
> global:
Acked-by: Ray Kinsella <mdr@ashroe.eu>
@@ -24,6 +24,7 @@
#include "eal_thread.h"
RTE_DEFINE_PER_LCORE(unsigned int, _lcore_id) = LCORE_ID_ANY;
+RTE_DEFINE_PER_LCORE(int, _thread_id) = -1;
static RTE_DEFINE_PER_LCORE(unsigned int, _socket_id) =
(unsigned int)SOCKET_ID_ANY;
static RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
@@ -447,6 +447,8 @@ enum rte_intr_mode rte_eal_vfio_intr_mode(void);
*/
int rte_sys_gettid(void);
+RTE_DECLARE_PER_LCORE(int, _thread_id);
+
/**
* Get system unique thread id.
*
@@ -456,7 +458,6 @@ int rte_sys_gettid(void);
*/
static inline int rte_gettid(void)
{
- static RTE_DEFINE_PER_LCORE(int, _thread_id) = -1;
if (RTE_PER_LCORE(_thread_id) == -1)
RTE_PER_LCORE(_thread_id) = rte_sys_gettid();
return RTE_PER_LCORE(_thread_id);
@@ -221,6 +221,13 @@ DPDK_20.0 {
local: *;
};
+DPDK_21 {
+ global:
+
+ per_lcore__thread_id;
+
+} DPDK_20.0;
+
EXPERIMENTAL {
global: