diff options
author | Matias Elo <matias.elo@nokia.com> | 2021-09-21 10:07:06 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2021-09-22 16:01:54 +0300 |
commit | 0b8d0f7aa26c0cf08adf09fb49be8a06404a3119 (patch) | |
tree | 25ec83460ca841abdbaf6a39ed4511d757cfc892 /test/validation | |
parent | 2bc64857084e338ce9a3417177b537cdf0ca0aa0 (diff) |
validation: pool: add test for creating max pools and shm blocks
Add new validation test which creates a maximum number of packet pools and
SHM blocks simultaneously. Reveals capability bugs if an implementation is
using SHM to implement pools.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Diffstat (limited to 'test/validation')
-rw-r--r-- | test/validation/api/pool/pool.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/test/validation/api/pool/pool.c b/test/validation/api/pool/pool.c index d791063e2..861ac18ae 100644 --- a/test/validation/api/pool/pool.c +++ b/test/validation/api/pool/pool.c @@ -893,6 +893,63 @@ static void pool_test_pool_index(void) } } +static void pool_test_create_max_pkt_pools(void) +{ + uint32_t max_pools = global_pool_capa.pkt.max_pools; + uint32_t i, num_pools, num_shm; + odp_pool_t pool[max_pools]; + odp_pool_param_t param; + odp_shm_capability_t shm_capa; + uint32_t shm_size = 32; + uint32_t uarea_size = 32; + + CU_ASSERT_FATAL(max_pools > 0); + + /* Reserve maximum number of SHM blocks */ + CU_ASSERT_FATAL(odp_shm_capability(&shm_capa) == 0); + CU_ASSERT_FATAL(shm_capa.max_blocks > 0); + + odp_shm_t shm[shm_capa.max_blocks]; + + if (shm_capa.max_size && shm_capa.max_size < shm_size) + shm_size = shm_capa.max_size; + + for (i = 0; i < shm_capa.max_blocks; i++) { + shm[i] = odp_shm_reserve(NULL, shm_size, 0, 0); + + if (shm[i] == ODP_SHM_INVALID) + break; + } + num_shm = i; + CU_ASSERT(num_shm == shm_capa.max_blocks); + + /* Create maximum number of packet pools */ + if (global_pool_capa.pkt.max_uarea_size && global_pool_capa.pkt.max_uarea_size < uarea_size) + uarea_size = global_pool_capa.pkt.max_uarea_size; + + odp_pool_param_init(¶m); + param.type = ODP_POOL_PACKET; + param.pkt.len = PKT_LEN; + param.pkt.num = 1; + param.pkt.max_num = 1; + param.pkt.uarea_size = uarea_size; + + for (i = 0; i < max_pools; i++) { + pool[i] = odp_pool_create(NULL, ¶m); + + if (pool[i] == ODP_POOL_INVALID) + break; + } + num_pools = i; + CU_ASSERT(num_pools == max_pools); + + for (i = 0; i < num_pools; i++) + CU_ASSERT(odp_pool_destroy(pool[i]) == 0); + + for (i = 0; i < num_shm; i++) + CU_ASSERT(odp_shm_free(shm[i]) == 0); +} + static int pool_check_buffer_pool_statistics(void) { if (global_pool_capa.buf.stats.all == 0) @@ -1706,6 +1763,7 @@ odp_testinfo_t pool_suite[] = { ODP_TEST_INFO(pool_test_tmo_max_num), ODP_TEST_INFO(pool_test_create_after_fork), ODP_TEST_INFO(pool_test_pool_index), + ODP_TEST_INFO(pool_test_create_max_pkt_pools), ODP_TEST_INFO_CONDITIONAL(pool_test_buffer_pool_statistics, pool_check_buffer_pool_statistics), ODP_TEST_INFO_CONDITIONAL(pool_test_packet_pool_statistics, |