New thread API call odp_thread_count_max() replaces the preprocessor macro in the API. A macro is still used internally.
Signed-off-by: Petri Savolainen <[email protected]> --- include/odp/api/config.h | 5 --- .../linux-generic/include/odp/plat/cpumask_types.h | 3 +- .../include/odp/plat/rwlock_recursive_types.h | 4 +-- .../linux-generic/include/odp_buffer_internal.h | 3 +- .../linux-generic/include/odp_config_internal.h | 29 ++++++++++++++++ platform/linux-generic/odp_thread.c | 9 ++--- platform/linux-generic/odp_thrmask.c | 4 +-- test/performance/odp_pktio_perf.c | 40 +++++++++++++++++++--- test/validation/thread/thread.c | 2 +- 9 files changed, 78 insertions(+), 21 deletions(-) create mode 100644 platform/linux-generic/include/odp_config_internal.h diff --git a/include/odp/api/config.h b/include/odp/api/config.h index 302eaf5..bf88be8 100644 --- a/include/odp/api/config.h +++ b/include/odp/api/config.h @@ -24,11 +24,6 @@ extern "C" { */ /** - * Maximum number of threads - */ -#define ODP_CONFIG_MAX_THREADS 128 - -/** * Maximum number of pools */ #define ODP_CONFIG_POOLS 16 diff --git a/platform/linux-generic/include/odp/plat/cpumask_types.h b/platform/linux-generic/include/odp/plat/cpumask_types.h index 6fba832..d3bf988 100644 --- a/platform/linux-generic/include/odp/plat/cpumask_types.h +++ b/platform/linux-generic/include/odp/plat/cpumask_types.h @@ -23,11 +23,12 @@ extern "C" { */ #include <odp/std_types.h> +#include <odp_config_internal.h> /** * Minimum size of output buffer for odp_cpumask_to_str() */ -#define ODP_CPUMASK_STR_SIZE ((ODP_CONFIG_MAX_THREADS + 3) / 4 + 3) +#define ODP_CPUMASK_STR_SIZE ((__ODP_CONFIG_MAX_THREADS + 3) / 4 + 3) /** * CPU mask diff --git a/platform/linux-generic/include/odp/plat/rwlock_recursive_types.h b/platform/linux-generic/include/odp/plat/rwlock_recursive_types.h index 9e220f5..0e20b40 100644 --- a/platform/linux-generic/include/odp/plat/rwlock_recursive_types.h +++ b/platform/linux-generic/include/odp/plat/rwlock_recursive_types.h @@ -19,7 +19,7 @@ extern "C" { #include <odp/rwlock.h> #include <odp/std_types.h> -#include <odp/config.h> +#include <odp_config_internal.h> /** * @internal @@ -29,7 +29,7 @@ struct odp_rwlock_recursive_s { odp_rwlock_t lock; /**< the lock */ int wr_owner; /**< write owner thread */ uint32_t wr_cnt; /**< write recursion count */ - uint8_t rd_cnt[ODP_CONFIG_MAX_THREADS]; /**< read recursion count */ + uint8_t rd_cnt[__ODP_CONFIG_MAX_THREADS]; /**< read recursion count */ }; /** @addtogroup odp_synchronizers diff --git a/platform/linux-generic/include/odp_buffer_internal.h b/platform/linux-generic/include/odp_buffer_internal.h index 4cacca1..7671ea7 100644 --- a/platform/linux-generic/include/odp_buffer_internal.h +++ b/platform/linux-generic/include/odp_buffer_internal.h @@ -30,6 +30,7 @@ extern "C" { #include <odp/thread.h> #include <odp/event.h> #include <odp_forward_typedefs_internal.h> +#include <odp_config_internal.h> #define ODP_BITSIZE(x) \ ((x) <= 2 ? 1 : \ @@ -143,7 +144,7 @@ struct odp_buffer_hdr_t { /** @internal Compile time assert that the * allocator field can handle any allocator id*/ -_ODP_STATIC_ASSERT(INT16_MAX >= ODP_CONFIG_MAX_THREADS, +_ODP_STATIC_ASSERT(INT16_MAX >= __ODP_CONFIG_MAX_THREADS, "ODP_BUFFER_HDR_T__ALLOCATOR__SIZE_ERROR"); typedef struct odp_buffer_hdr_stride { diff --git a/platform/linux-generic/include/odp_config_internal.h b/platform/linux-generic/include/odp_config_internal.h new file mode 100644 index 0000000..c60ec66 --- /dev/null +++ b/platform/linux-generic/include/odp_config_internal.h @@ -0,0 +1,29 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * Linux-generic platform internal configuration + */ + +#ifndef ODP_INTERNAL_CONFIG_H_ +#define ODP_INTERNAL_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Maximum number of threads + */ +#define __ODP_CONFIG_MAX_THREADS 128 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c index a8ce133..8acf647 100644 --- a/platform/linux-generic/odp_thread.c +++ b/platform/linux-generic/odp_thread.c @@ -18,6 +18,7 @@ #include <odp/shared_memory.h> #include <odp/align.h> #include <odp/cpu.h> +#include <odp_config_internal.h> #include <string.h> #include <stdio.h> @@ -31,7 +32,7 @@ typedef struct { typedef struct { - thread_state_t thr[ODP_CONFIG_MAX_THREADS]; + thread_state_t thr[__ODP_CONFIG_MAX_THREADS]; union { /* struct order must be kept in sync with schedule_types.h */ struct { @@ -101,10 +102,10 @@ static int alloc_id(odp_thread_type_t type) int thr; odp_thrmask_t *all = &thread_globals->all; - if (thread_globals->num >= ODP_CONFIG_MAX_THREADS) + if (thread_globals->num >= __ODP_CONFIG_MAX_THREADS) return -1; - for (thr = 0; thr < ODP_CONFIG_MAX_THREADS; thr++) { + for (thr = 0; thr < __ODP_CONFIG_MAX_THREADS; thr++) { if (odp_thrmask_isset(all, thr) == 0) { odp_thrmask_set(all, thr); @@ -128,7 +129,7 @@ static int free_id(int thr) { odp_thrmask_t *all = &thread_globals->all; - if (thr < 0 || thr >= ODP_CONFIG_MAX_THREADS) + if (thr < 0 || thr >= __ODP_CONFIG_MAX_THREADS) return -1; if (odp_thrmask_isset(all, thr) == 0) diff --git a/platform/linux-generic/odp_thrmask.c b/platform/linux-generic/odp_thrmask.c index d10bbf1..d8cf261 100644 --- a/platform/linux-generic/odp_thrmask.c +++ b/platform/linux-generic/odp_thrmask.c @@ -9,11 +9,11 @@ #endif #include <sched.h> -#include <odp/config.h> +#include <odp_config_internal.h> #include <odp/thrmask.h> #include <odp/cpumask.h> -#if CPU_SETSIZE < ODP_CONFIG_MAX_THREADS +#if CPU_SETSIZE < __ODP_CONFIG_MAX_THREADS #error Thread mask does not fit all thread IDs #endif diff --git a/test/performance/odp_pktio_perf.c b/test/performance/odp_pktio_perf.c index 709becf..185375e 100644 --- a/test/performance/odp_pktio_perf.c +++ b/test/performance/odp_pktio_perf.c @@ -121,10 +121,12 @@ typedef struct { odp_barrier_t tx_barrier; odp_pktio_t pktio_tx; odp_pktio_t pktio_rx; - pkt_rx_stats_t rx_stats[ODP_CONFIG_MAX_THREADS]; - pkt_tx_stats_t tx_stats[ODP_CONFIG_MAX_THREADS]; + pkt_rx_stats_t *rx_stats; + pkt_tx_stats_t *tx_stats; uint8_t src_mac[ODPH_ETHADDR_LEN]; uint8_t dst_mac[ODPH_ETHADDR_LEN]; + uint32_t rx_stats_size; + uint32_t tx_stats_size; } test_globals_t; /* Status of max rate search */ @@ -468,7 +470,7 @@ static int process_results(uint64_t expected_tx_cnt, char str[512]; int len = 0; - for (i = 0; i < ODP_CONFIG_MAX_THREADS; ++i) { + for (i = 0; i < odp_thread_count_max(); ++i) { rx_pkts += gbl_args->rx_stats[i].s.rx_cnt; tx_pkts += gbl_args->tx_stats[i].s.tx_cnt; } @@ -610,8 +612,8 @@ static int run_test_single(odp_cpumask_t *thd_mask_tx, odp_atomic_store_u32(&shutdown, 0); memset(thd_tbl, 0, sizeof(thd_tbl)); - memset(&gbl_args->rx_stats, 0, sizeof(gbl_args->rx_stats)); - memset(&gbl_args->tx_stats, 0, sizeof(gbl_args->tx_stats)); + memset(gbl_args->rx_stats, 0, gbl_args->rx_stats_size); + memset(gbl_args->tx_stats, 0, gbl_args->tx_stats_size); expected_tx_cnt = status->pps_curr * gbl_args->args.duration; @@ -989,6 +991,7 @@ int main(int argc, char **argv) { int ret; odp_shm_t shm; + int max_thrs; if (odp_init_global(NULL, NULL) != 0) LOG_ABORT("Failed global init.\n"); @@ -1003,6 +1006,33 @@ int main(int argc, char **argv) LOG_ABORT("Shared memory reserve failed.\n"); memset(gbl_args, 0, sizeof(test_globals_t)); + max_thrs = odp_thread_count_max(); + + gbl_args->rx_stats_size = max_thrs * sizeof(pkt_rx_stats_t); + gbl_args->tx_stats_size = max_thrs * sizeof(pkt_tx_stats_t); + + shm = odp_shm_reserve("test_globals.rx_stats", + gbl_args->rx_stats_size, + ODP_CACHE_LINE_SIZE, 0); + + gbl_args->rx_stats = odp_shm_addr(shm); + + if (gbl_args->rx_stats == NULL) + LOG_ABORT("Shared memory reserve failed.\n"); + + memset(gbl_args->rx_stats, 0, gbl_args->rx_stats_size); + + shm = odp_shm_reserve("test_globals.tx_stats", + gbl_args->tx_stats_size, + ODP_CACHE_LINE_SIZE, 0); + + gbl_args->tx_stats = odp_shm_addr(shm); + + if (gbl_args->tx_stats == NULL) + LOG_ABORT("Shared memory reserve failed.\n"); + + memset(gbl_args->tx_stats, 0, gbl_args->tx_stats_size); + parse_args(argc, argv, &gbl_args->args); ret = test_init(); diff --git a/test/validation/thread/thread.c b/test/validation/thread/thread.c index d4f3ee0..093e688 100644 --- a/test/validation/thread/thread.c +++ b/test/validation/thread/thread.c @@ -74,7 +74,7 @@ void thread_test_odp_thrmask_worker(void) ret = odp_thrmask_worker(&mask); CU_ASSERT(ret == odp_thrmask_count(&mask)); CU_ASSERT(ret == args.numthrds); - CU_ASSERT(ret <= ODP_CONFIG_MAX_THREADS); + CU_ASSERT(ret <= odp_thread_count_max()); /* allow thread(s) to exit */ odp_barrier_wait(&bar_exit); -- 2.5.1 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
