55#include "em_libconfig.h"
69 EM_ODP_EM_DEFAULT_POOL_ERROR);
71 EM_ODP_EM_POOL_UNDEF_ERROR);
74 EM_ODP_EM_EVENT_USER_AREA_MAX_SIZE_ERROR);
81#define ALIGN_OFFSET_MAX ((int)(16))
84COMPILE_TIME_ASSERT(ALIGN_OFFSET_MAX <=
85 ((1 << (sizeof_field(
event_hdr_t, align_offset) * 8)) - 1),
86 ALIGN_OFFSET_MAX__TOO_LARGE);
94COMPILE_TIME_ASSERT(ALIGN_OFFSET_MAX < 32, ALIGN_OFFSET_MAX__BREAKS_32B_BASE);
126 const odp_pool_capability_t *capa =
127 &
em_shm->mpool_tbl.odp_pool_capability;
129 uint32_t align = ODP_CACHE_LINE_SIZE;
133 if (align > capa->pkt.max_align)
134 return capa->pkt.max_align;
136 if (align > capa->buf.max_align)
137 return capa->buf.max_align;
144pool_alloc(em_pool_t pool)
152 if (unlikely(objpool_elem == NULL))
155 mpool_elem = mpool_poolelem2pool(objpool_elem);
159 mpool_elem = pool_elem_get(pool);
160 if (unlikely(mpool_elem == NULL))
163 ret = objpool_rem_elem(&
em_shm->mpool_pool.objpool,
165 if (unlikely(ret != 0))
174pool_free(em_pool_t pool)
178 if (unlikely(mpool_elem == NULL))
181 objpool_add(&
em_shm->mpool_pool.objpool,
189static int event_type_from_string(
const char *str,
em_event_type_t *event_type )
191 if (strstr(str,
"EM_EVENT_TYPE_SW")) {
193 }
else if (strstr(str,
"EM_EVENT_TYPE_PACKET")) {
195 }
else if (strstr(str,
"EM_EVENT_TYPE_VECTOR")) {
198 EM_LOG(EM_LOG_ERR,
"Event type %s not supported.\n", str);
206static inline int read_config_subpool(
const libconfig_list_t *subpool,
int index,
211 ret = em_libconfig_list_lookup_int(subpool, index,
"size",
213 if (unlikely(ret != 1)) {
215 "Option '%s.subpools[%d].size' not found or wrong type.\n",
216 pool_cfg_str, index);
221 EM_LOG(EM_LOG_ERR,
"Invalid '%s.subpools[%d].size'.\n",
222 pool_cfg_str, index);
227 ret = em_libconfig_list_lookup_int(subpool, index,
"num",
229 if (unlikely(ret != 1)) {
231 "Option '%s.subpools[%d].num' not found or wrong type.\n",
232 pool_cfg_str, index);
237 EM_LOG(EM_LOG_ERR,
"Invalid '%s.subpools[%d].num'.\n",
238 pool_cfg_str, index);
246 ret = em_libconfig_list_lookup_int(subpool, index,
"cache_size",
251 uint32_t min_cache_size = 0;
252 const odp_pool_capability_t *capa;
254 capa = &
em_shm->mpool_tbl.odp_pool_capability;
258 min_cache_size = capa->buf.min_cache_size;
261 min_cache_size = capa->pkt.min_cache_size;
264 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET)
265 min_cache_size = capa->vector.min_cache_size;
267 min_cache_size = capa->event_vector.min_cache_size;
272 "'%s.subpools[%d].cache_size' for pool type:%u not available.\n",
279 "'%s.subpools[%d].cache_size' too small.\n",
280 pool_cfg_str, index);
283 }
else if (ret == 0) {
285 "'%s.subpools[%d].cache_size' wrong data type.\n",
286 pool_cfg_str, index);
295 const char **err_str)
297 const odp_pool_capability_t *capa = &
em_shm->mpool_tbl.odp_pool_capability;
300 if (capa->buf.max_pools == 0) {
301 *err_str =
"SW (buf) pool type unsupported";
305 if (capa->pkt.max_pools == 0) {
306 *err_str =
"PACKET pool type unsupported";
310 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET) {
311 if (capa->vector.max_pools == 0) {
312 *err_str =
"VECTOR (pkt) pool type unsupported";
317 if (capa->event_vector.max_pools == 0) {
318 *err_str =
"EVENT_VECTOR pool type unsupported";
323 *err_str =
"Pool type unsupported, use _SW, _PACKET or _VECTOR";
333static inline int is_align_offset_valid(
const em_pool_cfg_t *pool_cfg)
335 uint32_t offset = align_offset_get(pool_cfg);
336 uint32_t align = odp_align_get(pool_cfg);
339 if (!POWEROF2(offset)) {
340 EM_LOG(EM_LOG_ERR,
"align_offset %d must be power of 2\n",
345 if (!POWEROF2(align)) {
346 EM_LOG(EM_LOG_ERR,
"Invalid max_align value: %d\n"
347 "max_align must be power of 2\n",
352 if (offset > ALIGN_OFFSET_MAX) {
354 "align_offset %d must be less or equal than max align_offset %d\n",
355 offset, ALIGN_OFFSET_MAX);
359 if (offset >= align) {
361 "align offset %d must be less than configuration max_align %d\n",
369static inline int is_user_area_valid(
const em_pool_cfg_t *pool_cfg,
370 const odp_pool_capability_t *capa,
371 const char **err_str)
378 *err_str =
"Event user area too large";
385 if (req_odp_uarea_sz > capa->pkt.max_uarea_size) {
386 *err_str =
"ODP pkt max uarea not large enough";
393 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET) {
394 if (req_odp_uarea_sz > capa->vector.max_uarea_size) {
395 *err_str =
"ODP pkt-vector max uarea not large enough";
400 if (req_odp_uarea_sz > capa->event_vector.max_uarea_size) {
401 *err_str =
"ODP event-vector max uarea not large enough";
411static inline int read_config_align_offset(
const libconfig_group_t *align_offset,
412 const char *pool_cfg_str,
418 ret = em_libconfig_group_lookup_bool(align_offset,
"in_use",
420 if (unlikely(!ret)) {
422 "'%s.align_offset.in_use' not found or wrong type\n",
428 ret = em_libconfig_group_lookup_int(align_offset,
"value",
430 if (unlikely(!ret)) {
432 "'%s.align_offset.value' not found or wrong type\n",
438 ret = is_align_offset_valid(cfg);
440 EM_LOG(EM_LOG_ERR,
"Failure detected when checking '%s.align_offset.value': %d\n",
449static inline int read_config_user_area(
const libconfig_group_t *user_area,
450 const char *pool_cfg_str,
454 const odp_pool_capability_t *capa;
455 const char *err_str =
"";
458 ret = em_libconfig_group_lookup_bool(user_area,
"in_use",
460 if (unlikely(!ret)) {
462 "'%s.user_area.in_use' not found or wrong type\n",
468 ret = em_libconfig_group_lookup_int(user_area,
"size",
470 if (unlikely(!ret)) {
472 "'%s.user_area.size' not found or wrong type\n",
477 capa = &
em_shm->mpool_tbl.odp_pool_capability;
479 if (is_user_area_valid(cfg, capa, &err_str) < 0) {
480 EM_LOG(EM_LOG_ERR,
"%s: %ld\n", err_str, cfg->
user_area.
size);
488static inline int read_config_pkt_headroom(
const libconfig_group_t *pkt_headroom,
489 const char *pool_cfg_str,
493 const odp_pool_capability_t *capa;
496 ret = em_libconfig_group_lookup_bool(pkt_headroom,
"in_use",
498 if (unlikely(!ret)) {
500 "'%s.pkt.headroom.in_use' not found or wrong type\n",
506 ret = em_libconfig_group_lookup_int(pkt_headroom,
"value",
508 if (unlikely(!ret)) {
510 "'%s.pkt.headroom.value' not found or wrong type\n",
516 capa = &
em_shm->mpool_tbl.odp_pool_capability;
520 "'%s.pkt.headroom.value' %d too large (max=%d)\n",
522 capa->pkt.max_headroom);
530static int read_config_startup_pools_conf(
const libconfig_list_t *list,
int index)
536 const char *pool_name;
537 const char *event_type;
538 char pool_cfg_str[40];
539 libconfig_group_t *pool_cfg;
540 const libconfig_list_t *subpool;
541 const libconfig_group_t *headroom;
542 const libconfig_group_t *user_area;
543 const libconfig_group_t *align_offset;
546 const char *err_str =
"";
548 snprintf(pool_cfg_str,
sizeof(pool_cfg_str),
549 "startup_pools.conf[%d].pool_cfg", index);
551 pool_cfg = em_libconfig_list_lookup_group(list, index,
"pool_cfg");
553 EM_LOG(EM_LOG_ERR,
"Conf option '%s' not found\n", pool_cfg_str);
565 ret = em_libconfig_group_lookup_string(pool_cfg,
"event_type", &event_type);
566 if (unlikely(!ret)) {
567 EM_LOG(EM_LOG_ERR,
"'%s.event_type' not found.\n", pool_cfg_str);
571 ret = event_type_from_string(event_type, &cfg->
event_type);
572 if (unlikely(ret < 0))
575 ret = is_pool_type_supported(cfg->
event_type, &err_str);
577 EM_LOG(EM_LOG_ERR,
"%s", err_str);
582 ret = em_libconfig_group_lookup_int(pool_cfg,
"num_subpools",
584 if (unlikely(!ret)) {
585 EM_LOG(EM_LOG_ERR,
"'%s.num_subpools' not found.\n", pool_cfg_str);
590 EM_LOG(EM_LOG_ERR,
"Invalid '%s.num_subpools'\n"
591 "Valid value range is [1, %d]\n", pool_cfg_str,
597 subpool = em_libconfig_group_lookup_list(pool_cfg,
"subpools");
598 if (unlikely(!subpool)) {
599 EM_LOG(EM_LOG_ERR,
"'%s.subpools' not found.\n", pool_cfg_str);
603 num_subpools = em_libconfig_list_length(subpool);
605 EM_LOG(EM_LOG_ERR,
"The number of subpool configuration given\n"
606 "in '%s.subpools' does not match '%s.num_subpools'.\n",
607 pool_cfg_str, pool_cfg_str);
611 for (
int j = 0; j < num_subpools; j++) {
612 ret = read_config_subpool(subpool, j, pool_cfg_str, cfg);
614 if (unlikely(ret < 0))
621 ret_pool = em_libconfig_list_lookup_int(list, index,
"pool", &pool);
622 if (unlikely(ret_pool == 0)) {
624 "'startup_pools.conf[%d].pool' has wrong data type(expect int)\n",
632 EM_LOG(EM_LOG_ERR,
"Invalid pool ID %d, valid IDs are within [0, %d]\n",
637 conf->pool = (em_pool_t)(uintptr_t)pool;
641 ret = em_libconfig_list_lookup_string(list, index,
"name", &pool_name);
642 if (unlikely(ret == 0)) {
644 "'startup_pools.conf[%d].name' has wrong data type(expect string)\n",
649 if (ret_pool == 1 && ret == 1) {
653 if (is_default_name && !is_default_id) {
655 "Default name \"%s\" with non-default ID %d\n",
660 if (is_default_id && !is_default_name) {
662 "Default pool ID 1 with non-default name \"%s\"\n",
673 align_offset = em_libconfig_group_lookup_group(pool_cfg,
"align_offset");
675 if (align_offset && read_config_align_offset(align_offset, pool_cfg_str, cfg))
678 user_area = em_libconfig_group_lookup_group(pool_cfg,
"user_area");
679 if (user_area && read_config_user_area(user_area, pool_cfg_str, cfg))
682 headroom = em_libconfig_group_lookup_group(pool_cfg,
"pkt.headroom");
684 if (read_config_pkt_headroom(headroom, pool_cfg_str, cfg))
689 EM_PRINT(
"pkt.headroom will be ignored for non packet type!\n");
696static void print_config_startup_pools(
void)
700 const char *str =
"";
702 EM_PRINT(
" startup_pools.num: %u\n",
em_shm->
opt.startup_pools.num);
704 for (uint32_t i = 0; i <
em_shm->
opt.startup_pools.num; i++) {
705 conf = &
em_shm->
opt.startup_pools.conf[i];
707 snprintf(str_conf,
sizeof(str_conf),
" startup_pools.conf[%d]", i);
710 EM_PRINT(
"%s.name: %s\n", str_conf, conf->name);
713 EM_PRINT(
"%s.pool: %d\n", str_conf, (
int)(uintptr_t)conf->pool);
717 str =
"EM_EVENT_TYPE_SW";
719 str =
"EM_EVENT_TYPE_PACKET";
721 str =
"EM_EVENT_TYPE_VECTOR";
722 EM_PRINT(
"%s.pool_cfg.event_type: %s\n", str_conf, str);
726 EM_PRINT(
"%s.pool_cfg.align_offset.in_use: %s\n", str_conf, str);
727 EM_PRINT(
"%s.pool_cfg.align_offset.value: %d\n", str_conf,
732 EM_PRINT(
"%s.pool_cfg.user_area.in_use: %s\n", str_conf, str);
733 EM_PRINT(
"%s.pool_cfg.user_area.size: %ld\n", str_conf,
738 EM_PRINT(
"%s.pool_cfg.pkt.headroom.in_use: %s\n", str_conf, str);
739 EM_PRINT(
"%s.pool_cfg.pkt.headroom.value: %d\n", str_conf,
743 EM_PRINT(
"%s.pool_cfg.num_subpools: %u\n", str_conf,
748 EM_PRINT(
"%s.pool_cfg.subpools[%d].size: %u\n", str_conf,
751 EM_PRINT(
"%s.pool_cfg.subpools[%d].num: %u\n", str_conf,
754 EM_PRINT(
"%s.pool_cfg.subpools[%d].cache_size: %u\n",
761static int read_config_startup_pools(
void)
765 int num_startup_pools;
766 const libconfig_list_t *conf_list;
767 libconfig_setting_t *default_setting;
768 libconfig_setting_t *runtime_setting;
769 libconfig_setting_t *startup_pools_setting;
771 em_libconfig_lookup(&
em_shm->libconfig,
"startup_pools",
772 &default_setting, &runtime_setting);
784 if (
em_shm->libconfig.has_cfg_runtime) {
786 startup_pools_setting = runtime_setting;
791 startup_pools_setting = default_setting;
796 EM_PRINT(
"EM-startup_pools config:\n");
801 ret = em_libconfig_setting_lookup_int(startup_pools_setting,
"num",
803 if (unlikely(!ret)) {
804 EM_LOG(EM_LOG_ERR,
"Option 'startup_pools.num' not found\n");
808 if (num_startup_pools <= 0 || num_startup_pools >
EM_CONFIG_POOLS - 1) {
810 "Number of startup_pools %d is too large or too small\n"
811 "Valid value range is [1, %d]\n",
816 conf_list = em_libconfig_setting_get_list(startup_pools_setting,
"conf");
818 EM_LOG(EM_LOG_ERR,
"Conf option 'startup_pools.conf' not found\n");
822 list_len = em_libconfig_list_length(conf_list);
823 if (list_len != num_startup_pools) {
825 "The number of pool configuration(s) given in\n"
826 "'startup_pools.conf':%d does not match number of\n"
827 "startup_pools specified in 'startup_pools.num': %d\n",
828 list_len, num_startup_pools);
832 for (
int i = 0; i < list_len; i++) {
833 if (read_config_startup_pools_conf(conf_list, i) < 0)
837 em_shm->
opt.startup_pools.num = num_startup_pools;
839 print_config_startup_pools();
844static int read_config_pool(
void)
846 const char *conf_str;
847 bool val_bool =
false;
851 const odp_pool_capability_t *capa =
852 &
em_shm->mpool_tbl.odp_pool_capability;
854 EM_PRINT(
"EM pool config:\n");
859 conf_str =
"pool.statistics.available";
860 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
861 if (unlikely(!ret)) {
862 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
866 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
871 conf_str =
"pool.statistics.alloc_ops";
872 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
873 if (unlikely(!ret)) {
874 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
878 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
883 conf_str =
"pool.statistics.alloc_fails";
884 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
885 if (unlikely(!ret)) {
886 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
890 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
895 conf_str =
"pool.statistics.free_ops";
896 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
897 if (unlikely(!ret)) {
898 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
902 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
907 conf_str =
"pool.statistics.total_ops";
908 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
909 if (unlikely(!ret)) {
910 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
914 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
919 conf_str =
"pool.statistics.cache_available";
920 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
921 if (unlikely(!ret)) {
922 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
926 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
931 conf_str =
"pool.statistics.cache_alloc_ops";
932 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
933 if (unlikely(!ret)) {
934 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
938 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
943 conf_str =
"pool.statistics.cache_free_ops";
944 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
945 if (unlikely(!ret)) {
946 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
950 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
955 conf_str =
"pool.statistics.core_cache_available";
956 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
957 if (unlikely(!ret)) {
958 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
962 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false", val_bool);
967 conf_str =
"pool.align_offset";
968 ret = em_libconfig_lookup_int(&
em_shm->libconfig, conf_str, &val);
969 if (unlikely(!ret)) {
970 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found.\n", conf_str);
973 if (val < 0 || val > ALIGN_OFFSET_MAX || !POWEROF2(val)) {
975 "Bad config value '%s = %d' (max: %d and value must be power of 2)\n",
976 conf_str, val, ALIGN_OFFSET_MAX);
981 EM_PRINT(
" %s (default): %d (max: %d)\n",
982 conf_str, val, ALIGN_OFFSET_MAX);
987 conf_str =
"pool.user_area_size";
988 ret = em_libconfig_lookup_int(&
em_shm->libconfig, conf_str, &val);
989 if (unlikely(!ret)) {
990 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found.\n", conf_str);
993 if (val < 0 || (
unsigned int)val > capa->pkt.max_uarea_size ||
995 EM_LOG(EM_LOG_ERR,
"Bad config value '%s = %d'\n",
1001 EM_PRINT(
" %s (default): %d (max: %d)\n",
1008 conf_str =
"pool.pkt_headroom";
1009 ret = em_libconfig_lookup_int(&
em_shm->libconfig, conf_str, &val);
1010 if (unlikely(!ret)) {
1011 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found.\n", conf_str);
1015 if (val < 0 || (
unsigned int)val > capa->pkt.max_headroom) {
1016 EM_LOG(EM_LOG_ERR,
"Bad config value '%s = %d'\n",
1022 EM_PRINT(
" %s (default): %d (max: %u)\n",
1023 conf_str, val, capa->pkt.max_headroom);
1029read_config_file(
void)
1032 if (read_config_pool() < 0)
1036 if (read_config_startup_pools() < 0)
1053 "Size of odp_pool_stats_t must be smaller than that of em_pool_subpool_stats_t");
1055ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, available) ==
1057 sizeof_field(odp_pool_stats_t, available) ==
1059 "em_pool_subpool_stats_t.available differs from odp_pool_stats_t.available!");
1061ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, alloc_ops) ==
1063 sizeof_field(odp_pool_stats_t, alloc_ops) ==
1065 "em_pool_subpool_stats_t.alloc_ops differs from odp_pool_stats_t.alloc_ops!");
1067ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, alloc_fails) ==
1069 sizeof_field(odp_pool_stats_t, alloc_fails) ==
1071 "em_pool_subpool_stats_t.alloc_fails differs from odp_pool_stats_t.alloc_fails!");
1073ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, free_ops) ==
1075 sizeof_field(odp_pool_stats_t, free_ops) ==
1077 "em_pool_subpool_stats_t.free_ops differs from odp_pool_stats_t.free_ops!");
1079ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, total_ops) ==
1081 sizeof_field(odp_pool_stats_t, total_ops) ==
1083 "em_pool_subpool_stats_t.total_ops differs from odp_pool_stats_t.total_ops!");
1085ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, cache_available) ==
1087 sizeof_field(odp_pool_stats_t, cache_available) ==
1089 "em_pool_subpool_stats_t.cache_available differs from that of odp_pool_stats_t!");
1091ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, cache_alloc_ops) ==
1093 sizeof_field(odp_pool_stats_t, cache_alloc_ops) ==
1095 "em_pool_subpool_stats_t.cache_alloc_ops differs from that of odp_pool_stats_t!");
1097ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, cache_free_ops) ==
1099 sizeof_field(odp_pool_stats_t, cache_free_ops) ==
1101 "em_pool_subpool_stats_t.cache_free_ops differs from that of odp_pool_stats_t!");
1103ODP_STATIC_ASSERT(offsetof(odp_pool_stats_t, thread) ==
1105 sizeof_field(odp_pool_stats_t, thread) <=
1107 "em_pool_subpool_stats_t.__internal_use differs from odp_pool_stats_t.thread");
1109#define STRUCT_ERR_STR \
1110"em_pool_subpool_stats_t.%s differs from odp_pool_stats_t.%s either in size or in offset!\n"
1112static int check_em_pool_subpool_stats(
void)
1116 "Size of odp_pool_stats_t bigger than that of em_pool_subpool_stats_t\n");
1120 if (offsetof(odp_pool_stats_t, available) !=
1122 sizeof_field(odp_pool_stats_t, available) !=
1124 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"available",
"available");
1128 if (offsetof(odp_pool_stats_t, alloc_ops) !=
1130 sizeof_field(odp_pool_stats_t, alloc_ops) !=
1132 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"alloc_ops",
"alloc_ops");
1136 if (offsetof(odp_pool_stats_t, alloc_fails) !=
1138 sizeof_field(odp_pool_stats_t, alloc_fails) !=
1140 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"alloc_fails",
"alloc_fails");
1144 if (offsetof(odp_pool_stats_t, free_ops) !=
1146 sizeof_field(odp_pool_stats_t, free_ops) !=
1148 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"free_ops",
"free_ops");
1152 if (offsetof(odp_pool_stats_t, total_ops) !=
1154 sizeof_field(odp_pool_stats_t, total_ops) !=
1156 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"total_ops",
"total_ops");
1160 if (offsetof(odp_pool_stats_t, cache_available) !=
1162 sizeof_field(odp_pool_stats_t, cache_available) !=
1164 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"cache_available",
"cache_available");
1168 if (offsetof(odp_pool_stats_t, cache_alloc_ops) !=
1170 sizeof_field(odp_pool_stats_t, cache_alloc_ops) !=
1172 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"cache_alloc_ops",
"cache_alloc_ops");
1176 if (offsetof(odp_pool_stats_t, cache_free_ops) !=
1178 sizeof_field(odp_pool_stats_t, cache_free_ops) !=
1180 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"cache_free_ops",
"cache_free_ops");
1184 if (offsetof(odp_pool_stats_t, thread) !=
1186 sizeof_field(odp_pool_stats_t, thread) >
1188 EM_LOG(EM_LOG_ERR, STRUCT_ERR_STR,
"__internal_use",
"thread");
1203#define SIZE_NOT_EQUAL_ERR_STR \
1204"Size of odp_pool_stats_selected_t must equal to that of em_pool_subpool_stats_selected_t\n"
1207 SIZE_NOT_EQUAL_ERR_STR);
1209ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, available) ==
1211 sizeof_field(odp_pool_stats_selected_t, available) ==
1213 "available in em_pool_subpool_stats_selected_t and odp_pool_stats_selected_t differs!");
1215ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, alloc_ops) ==
1217 sizeof_field(odp_pool_stats_selected_t, alloc_ops) ==
1219 "em_pool_subpool_stats_selected_t.alloc_ops differs from odp_pool_stats_selected_t.alloc_ops!");
1221ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, alloc_fails) ==
1223 sizeof_field(odp_pool_stats_selected_t, alloc_fails) ==
1225 "em_pool_subpool_stats_selected_t.alloc_fails differs from odp_pool_stats_selected_t.alloc_fails!");
1227ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, free_ops) ==
1229 sizeof_field(odp_pool_stats_selected_t, free_ops) ==
1231 "em_pool_subpool_stats_selected_t.free_ops differs from odp_pool_stats_selected_t.free_ops!");
1233ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, total_ops) ==
1235 sizeof_field(odp_pool_stats_selected_t, total_ops) ==
1237 "em_pool_subpool_stats_selected_t.total_ops differs from odp_pool_stats_selected_t.total_ops!");
1239ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, cache_available) ==
1241 sizeof_field(odp_pool_stats_selected_t, cache_available) ==
1243 "em_pool_subpool_stats_selected_t.cache_available differs from that of odp_pool_stats_selected_t!");
1245ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, cache_alloc_ops) ==
1247 sizeof_field(odp_pool_stats_selected_t, cache_alloc_ops) ==
1249 "em_pool_subpool_stats_selected_t.cache_alloc_ops differs from that of odp_pool_stats_selected_t!");
1251ODP_STATIC_ASSERT(offsetof(odp_pool_stats_selected_t, cache_free_ops) ==
1253 sizeof_field(odp_pool_stats_selected_t, cache_free_ops) ==
1255 "em_pool_subpool_stats_selected_t.cache_free_ops differs from that of odp_pool_stats_selected_t!");
1257#define SELECTED_TYPE_ERR_FMT \
1258"em_pool_subpool_stats_selected_t.%s differs from odp_pool_stats_selected_t.%s\n"
1260static int check_em_pool_subpool_stats_selected(
void)
1264 "odp_pool_stats_selected_t vs em_pool_subpool_stats_selected_t size diff\n");
1268 if (offsetof(odp_pool_stats_selected_t, available) !=
1270 sizeof_field(odp_pool_stats_selected_t, available) !=
1272 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"available",
"available");
1276 if (offsetof(odp_pool_stats_selected_t, alloc_ops) !=
1278 sizeof_field(odp_pool_stats_selected_t, alloc_ops) !=
1280 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"alloc_ops",
"alloc_ops");
1284 if (offsetof(odp_pool_stats_selected_t, alloc_fails) !=
1286 sizeof_field(odp_pool_stats_selected_t, alloc_fails) !=
1288 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"alloc_fails",
"alloc_fails");
1292 if (offsetof(odp_pool_stats_selected_t, free_ops) !=
1294 sizeof_field(odp_pool_stats_selected_t, free_ops) !=
1296 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"free_ops",
"free_ops");
1300 if (offsetof(odp_pool_stats_selected_t, total_ops) !=
1302 sizeof_field(odp_pool_stats_selected_t, total_ops) !=
1304 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"total_ops",
"total_ops");
1308 if (offsetof(odp_pool_stats_selected_t, cache_available) !=
1310 sizeof_field(odp_pool_stats_selected_t, cache_available) !=
1312 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"cache_available",
"cache_available");
1316 if (offsetof(odp_pool_stats_selected_t, cache_alloc_ops) !=
1318 sizeof_field(odp_pool_stats_selected_t, cache_alloc_ops) !=
1320 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"cache_alloc_ops",
"cache_alloc_ops");
1324 if (offsetof(odp_pool_stats_selected_t, cache_free_ops) !=
1326 sizeof_field(odp_pool_stats_selected_t, cache_free_ops) !=
1328 EM_LOG(EM_LOG_ERR, SELECTED_TYPE_ERR_FMT,
"cache_free_ops",
"cache_free_ops");
1336 "Size of odp_pool_stats_opt_t differs from that of em_pool_stats_opt_t\n");
1344 em_pool_t pool_default;
1346 bool default_pool_set =
false;
1350 if (check_em_pool_subpool_stats())
1354 if (check_em_pool_subpool_stats_selected())
1361 ret = objpool_init(&mpool_pool->objpool, objpool_subpools);
1366 pool = pool_idx2hdl(i);
1369 if (unlikely(!mpool_elem))
1375 mpool_elem->
odp_pool[j] = ODP_POOL_INVALID;
1376 mpool_elem->
size[j] = 0;
1379 objpool_add(&mpool_pool->objpool, i % objpool_subpools,
1390 if (odp_pool_capability(&mpool_tbl->odp_pool_capability) != 0)
1394 if (read_config_file())
1414 for (uint32_t i = 0; i <
em_shm->
opt.startup_pools.num; i++) {
1415 startup_pool_conf = &
em_shm->
opt.startup_pools.conf[i];
1420 default_pool_set =
true;
1424 &startup_pool_conf->cfg);
1427 startup_pool_conf->pool,
1428 &startup_pool_conf->cfg);
1436 if (!default_pool_set) {
1455 "Status before delete:\n");
1459 em_pool_t pool = pool_idx2hdl(i);
1463 if (mpool_elem && pool_allocated(mpool_elem)) {
1464 ret = pool_delete(pool);
1474static int invalid_pool_cache_cfg(
const em_pool_cfg_t *pool_cfg,
1475 const char **err_str)
1477 const odp_pool_capability_t *capa =
1478 &
em_shm->mpool_tbl.odp_pool_capability;
1479 uint32_t min_cache_size;
1480 uint32_t cache_size;
1483 min_cache_size = capa->buf.min_cache_size;
1485 min_cache_size = capa->pkt.min_cache_size;
1487 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET)
1488 min_cache_size = capa->vector.min_cache_size;
1490 min_cache_size = capa->event_vector.min_cache_size;
1497 *err_str =
"Invalid subpool size/num";
1498 return -(1 * 10 + i);
1502 if (unlikely(cache_size < min_cache_size)) {
1503 *err_str =
"Requested cache size too small";
1504 return -(2 * 10 + i);
1518int invalid_pool_cfg(
const em_pool_cfg_t *pool_cfg,
const char **err_str)
1521 const odp_pool_capability_t *capa = &
em_shm->mpool_tbl.odp_pool_capability;
1524 *err_str =
"Pool config NULL";
1528 *err_str =
"Not initialized: em_pool_cfg_init(pool_cfg) not called";
1534 *err_str =
"Invalid number of subpools";
1538 ret = is_pool_type_supported(pool_cfg->
event_type, err_str);
1542 ret = is_align_offset_valid(pool_cfg);
1544 *err_str =
"Invalid align offset";
1548 ret = is_user_area_valid(pool_cfg, capa, err_str);
1555 *err_str =
"Requested pkt headroom size too large";
1559 ret = invalid_pool_cache_cfg(pool_cfg, err_str);
1564int check_pool_uarea_persistence(
const em_pool_cfg_t *pool_cfg,
const char **err_str)
1566 bool has_uarea_persistence;
1567 const odp_pool_capability_t *capa = &
em_shm->mpool_tbl.odp_pool_capability;
1571 has_uarea_persistence = capa->buf.uarea_persistence ? true :
false;
1572 *err_str =
"buf-pool (EM_EVENT_TYPE_SW)";
1575 has_uarea_persistence = capa->pkt.uarea_persistence ? true :
false;
1576 *err_str =
"pkt-pool (EM_EVENT_TYPE_PACKET)";
1579 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET)
1580 has_uarea_persistence = capa->vector.uarea_persistence ? true :
false;
1582 has_uarea_persistence = capa->event_vector.uarea_persistence ? true :
false;
1583 *err_str =
"vector-pool (EM_EVENT_TYPE_VECTOR)";
1586 has_uarea_persistence =
false;
1587 *err_str =
"unknown pool-type";
1591 return has_uarea_persistence ? 0 : -1;
1602 uint64_t num_tot = 0;
1604 uint64_t num_free = 0;
1615 prealloc_hdr = event_prealloc(pool_elem, size);
1616 if (likely(prealloc_hdr)) {
1617 list_add(&evlist, &prealloc_hdr->
list_node);
1620 }
while (prealloc_hdr);
1622 if (unlikely(num < num_tot))
1624 EM_ESCOPE_POOL_CREATE,
1625 "alloc: events expected:%" PRIu64
" actual:%" PRIu64
"",
1628 while (!list_is_empty(&evlist)) {
1629 node = list_rem_first(&evlist);
1630 prealloc_hdr = list_node_to_prealloc_hdr(node);
1635 if (unlikely(num_free > num))
1637 EM_ESCOPE_POOL_CREATE,
1638 "free: events expected:%" PRIu64
" actual:%" PRIu64
"",
1650 *sorted_cfg = *pool_cfg;
1652 for (
int i = 0; i < num_subpools - 1; i++) {
1655 for (
int j = i + 1; j < num_subpools; j++) {
1688 const odp_pool_capability_t *capa =
1689 &
em_shm->mpool_tbl.odp_pool_capability;
1691 uint32_t max_cache_size;
1694 max_cache_size = capa->buf.max_cache_size;
1696 max_cache_size = capa->pkt.max_cache_size;
1699 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET)
1700 max_cache_size = capa->vector.max_cache_size;
1702 max_cache_size = capa->event_vector.max_cache_size;
1705 for (
int i = 0; i < num_subpools; i++) {
1706 if (max_cache_size < pool_cfg->subpool[i].cache_size)
1715set_uarea_size(
const em_pool_cfg_t *pool_cfg,
size_t *uarea_size)
1718 size_t max_size = 0;
1719 const odp_pool_capability_t *capa =
1720 &
em_shm->mpool_tbl.odp_pool_capability;
1730 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET) {
1731 max_size = MIN(capa->vector.max_uarea_size,
1734 max_size = MIN(capa->event_vector.max_uarea_size,
1737 }
else if (size > 0) {
1742 if (size > max_size)
1755 uint32_t *pkt_headroom ,
1756 uint32_t *max_headroom )
1758 const odp_pool_capability_t *capa =
1759 &
em_shm->mpool_tbl.odp_pool_capability;
1761 uint32_t headroom =
em_shm->
opt.pool.pkt_headroom;
1767 *pkt_headroom = headroom;
1768 *max_headroom = capa->pkt.max_headroom;
1770 if (unlikely(headroom > capa->pkt.max_headroom))
1777static void set_pool_params_stats(odp_pool_stats_opt_t *param_stats ,
1778 const odp_pool_stats_opt_t *capa_stats,
1781 param_stats->all = 0;
1783 if (capa_stats->bit.available)
1784 param_stats->bit.available = stats_opt->
available;
1786 if (capa_stats->bit.alloc_ops)
1787 param_stats->bit.alloc_ops = stats_opt->
alloc_ops;
1789 if (capa_stats->bit.alloc_fails)
1790 param_stats->bit.alloc_fails = stats_opt->
alloc_fails;
1792 if (capa_stats->bit.free_ops)
1793 param_stats->bit.free_ops = stats_opt->
free_ops;
1795 if (capa_stats->bit.total_ops)
1796 param_stats->bit.total_ops = stats_opt->
total_ops;
1798 if (capa_stats->bit.cache_alloc_ops)
1801 if (capa_stats->bit.cache_available)
1804 if (capa_stats->bit.cache_free_ops)
1807 if (capa_stats->bit.thread_cache_available)
1812static void set_pool_params_pkt(odp_pool_param_t *pool_params ,
1814 uint32_t size, uint32_t num, uint32_t cache_size,
1815 uint32_t align_offset, uint32_t odp_align,
1816 uint32_t uarea_size, uint32_t pkt_headroom)
1818 const odp_pool_capability_t *capa = &
em_shm->mpool_tbl.odp_pool_capability;
1820 odp_pool_param_init(pool_params);
1822 pool_params->type = ODP_POOL_PACKET;
1824 pool_params->pkt.num = num;
1825 pool_params->pkt.max_num = num;
1827 if (size > align_offset)
1828 size = size - align_offset;
1832 pool_params->pkt.len = size;
1833 pool_params->pkt.max_len = size;
1834 pool_params->pkt.seg_len = size;
1835 pool_params->pkt.align = odp_align;
1840 pool_params->pkt.uarea_size =
sizeof(
event_hdr_t) + uarea_size;
1845 pool_params->pkt.headroom = pkt_headroom;
1846 if (pkt_headroom < align_offset)
1847 pool_params->pkt.headroom = align_offset;
1849 pool_params->pkt.cache_size = cache_size;
1853 set_pool_params_stats(&pool_params->stats, &capa->pkt.stats,
1856 set_pool_params_stats(&pool_params->stats, &capa->pkt.stats,
1861static void set_pool_params_vector(odp_pool_param_t *pool_params ,
1863 uint32_t size, uint32_t num,
1864 uint32_t cache_size, uint32_t uarea_size)
1866 const odp_pool_capability_t *capa = &
em_shm->mpool_tbl.odp_pool_capability;
1867 const odp_pool_stats_opt_t *capa_stats_opt;
1869 odp_pool_param_init(pool_params);
1871 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET) {
1873 pool_params->type = ODP_POOL_VECTOR;
1874 pool_params->vector.num = num;
1875 pool_params->vector.max_size = size;
1877 pool_params->vector.uarea_size =
sizeof(
event_hdr_t) + uarea_size;
1878 pool_params->vector.cache_size = cache_size;
1879 capa_stats_opt = &capa->vector.stats;
1882 pool_params->type = ODP_POOL_EVENT_VECTOR;
1883 pool_params->event_vector.num = num;
1884 pool_params->event_vector.max_size = size;
1886 pool_params->event_vector.uarea_size =
sizeof(
event_hdr_t) + uarea_size;
1887 pool_params->event_vector.cache_size = cache_size;
1888 capa_stats_opt = &capa->event_vector.stats;
1893 set_pool_params_stats(&pool_params->stats, capa_stats_opt,
1896 set_pool_params_stats(&pool_params->stats, capa_stats_opt,
1901static void set_pool_params_buf(odp_pool_param_t *pool_params ,
1903 uint32_t size, uint32_t num, uint32_t cache_size,
1904 uint32_t align_offset, uint32_t odp_align,
1905 uint32_t uarea_size)
1907 const odp_pool_capability_t *capa = &
em_shm->mpool_tbl.odp_pool_capability;
1909 odp_pool_param_init(pool_params);
1911 pool_params->type = ODP_POOL_BUFFER;
1912 pool_params->buf.num = num;
1913 pool_params->buf.size = size;
1915 pool_params->buf.size += 32 - align_offset;
1916 pool_params->buf.align = odp_align;
1917 pool_params->buf.uarea_size =
sizeof(
event_hdr_t) + uarea_size;
1918 pool_params->buf.cache_size = cache_size;
1922 set_pool_params_stats(&pool_params->stats, &capa->buf.stats,
1925 set_pool_params_stats(&pool_params->stats, &capa->buf.stats,
1931 uint32_t align_offset, uint32_t odp_align,
1932 uint32_t uarea_size, uint32_t pkt_headroom,
1938 for (
int i = 0; i < num_subpools; i++) {
1939 char pool_name[ODP_POOL_NAME_LEN];
1940 odp_pool_param_t pool_params;
1946 set_pool_params_pkt(&pool_params , pool_cfg,
1947 size, num, cache_size,
1948 align_offset, odp_align,
1949 uarea_size, pkt_headroom);
1951 set_pool_params_vector(&pool_params , pool_cfg,
1952 size, num, cache_size,
1955 set_pool_params_buf(&pool_params , pool_cfg,
1956 size, num, cache_size,
1957 align_offset, odp_align, uarea_size);
1961 mpool_elem->
stats_opt = pool_params.stats;
1963 snprintf(pool_name,
sizeof(pool_name),
"%" PRI_POOL ":%d-%s",
1964 mpool_elem->
em_pool, i, mpool_elem->name);
1965 pool_name[
sizeof(pool_name) - 1] =
'\0';
1967 odp_pool_t odp_pool = odp_pool_create(pool_name, &pool_params);
1969 if (unlikely(odp_pool == ODP_POOL_INVALID))
1972 mpool_elem->
odp_pool[i] = odp_pool;
1975 int odp_pool_idx = odp_pool_index(odp_pool);
1977 if (unlikely(odp_pool_idx < 0))
1982 (uint32_t)(uintptr_t)mpool_elem->
em_pool;
1992pool_create(
const char *name, em_pool_t req_pool,
const em_pool_cfg_t *pool_cfg)
1998 const em_pool_t pool = pool_alloc(req_pool);
2006 if (!mpool_elem || mpool_elem->
em_pool != pool)
2013 if (name && *name) {
2014 strncpy(mpool_elem->name, name,
sizeof(mpool_elem->name) - 1);
2015 mpool_elem->name[
sizeof(mpool_elem->name) - 1] =
'\0';
2017 mpool_elem->name[0] =
'\0';
2025 sort_pool_cfg(pool_cfg, &sorted_cfg);
2031 set_poolcache_size(&sorted_cfg);
2041 uint32_t align_offset = align_offset_get(&sorted_cfg);
2042 uint32_t odp_align = odp_align_get(&sorted_cfg);
2051 size_t uarea_size = 0;
2053 err = set_uarea_size(&sorted_cfg, &uarea_size);
2054 if (unlikely(err)) {
2056 "EM-pool:\"%s\" invalid uarea config: req.size:%zu",
2067 uint32_t pkt_headroom = 0;
2068 uint32_t max_headroom = 0;
2071 err = set_pkt_headroom(&sorted_cfg, &pkt_headroom,
2073 if (unlikely(err)) {
2075 "EM-pool:\"%s\" invalid pkt headroom:\n"
2076 "headroom:%u vs. max:headroom:%u",
2077 name, pkt_headroom, max_headroom);
2086 err = create_subpools(&sorted_cfg, align_offset, odp_align,
2087 (uint32_t)uarea_size, pkt_headroom, mpool_elem );
2088 if (unlikely(err)) {
2090 EM_ESCOPE_POOL_CREATE,
2091 "EM-pool:\"%s\" create fails:%d\n"
2092 "subpools req:%d vs. subpools created:%d",
2101 if (esv_enabled() &&
em_shm->
opt.esv.prealloc_pools)
2102 pool_prealloc(mpool_elem);
2108 (void)pool_delete(pool);
2113pool_delete(em_pool_t pool)
2118 if (unlikely(mpool_elem == NULL || !pool_allocated(mpool_elem)))
2122 odp_pool_t odp_pool = mpool_elem->
odp_pool[i];
2126 if (odp_pool == ODP_POOL_INVALID)
2129 odp_pool_idx = odp_pool_index(odp_pool);
2131 ret = odp_pool_destroy(odp_pool);
2135 mpool_elem->
odp_pool[i] = ODP_POOL_INVALID;
2136 mpool_elem->
size[i] = 0;
2139 if (unlikely(odp_pool_idx < 0))
2144 mpool_elem->name[0] =
'\0';
2148 return pool_free(pool);
2152pool_find(
const char *name)
2154 if (name && *name) {
2157 &
em_shm->mpool_tbl.pool[i];
2159 if (pool_allocated(mpool_elem) &&
2175 const odp_pool_stats_opt_t *odp_stats_opt)
2177 memset(em_stats_opt, 0,
sizeof(*em_stats_opt));
2179 em_stats_opt->
available = odp_stats_opt->bit.available;
2180 em_stats_opt->
alloc_ops = odp_stats_opt->bit.alloc_ops;
2181 em_stats_opt->
alloc_fails = odp_stats_opt->bit.alloc_fails;
2182 em_stats_opt->
free_ops = odp_stats_opt->bit.free_ops;
2183 em_stats_opt->
total_ops = odp_stats_opt->bit.total_ops;
2186 em_stats_opt->
cache_free_ops = odp_stats_opt->bit.cache_free_ops;
2190#define POOL_INFO_HDR_STR \
2191" id name type offset uarea sizes [size count(used/free) cache]\n"
2193#define POOL_INFO_SUBSTR_FMT \
2194"%d:[sz=%" PRIu32 " n=%" PRIu32 "(%" PRIu32 "/%" PRIu32 ") $=%" PRIu32 "]"
2196#define POOL_INFO_SUBSTR_NO_STATS_FMT \
2197"%d:[sz=%" PRIu32 " n=%" PRIu32 "(-/-) cache=%" PRIu32 "]"
2199void pool_info_print_hdr(
unsigned int num_pools)
2201 if (num_pools == 1) {
2202 EM_PRINT(
"EM Event Pool\n"
2206 EM_PRINT(
"EM Event Pools:%2u\n"
2207 "-----------------\n"
2208 POOL_INFO_HDR_STR, num_pools);
2212void pool_info_print(em_pool_t pool)
2216 const char *pool_type;
2219 if (unlikely(stat !=
EM_OK)) {
2220 EM_PRINT(
" %-6" PRI_POOL " %-16s n/a n/a n/a n/a [n/a]\n",
2232 EM_PRINT(
" %-6" PRI_POOL " %-16s %4s %02u %02zu %02u ",
2233 pool, pool_info.name, pool_type,
2238 char subpool_str[42];
2240 if (pool_info.subpool[i].
used || pool_info.subpool[i].
free) {
2241 snprintf(subpool_str,
sizeof(subpool_str),
2242 POOL_INFO_SUBSTR_FMT, i,
2243 pool_info.subpool[i].
size,
2244 pool_info.subpool[i].
num,
2245 pool_info.subpool[i].
used,
2246 pool_info.subpool[i].
free,
2249 snprintf(subpool_str,
sizeof(subpool_str),
2250 POOL_INFO_SUBSTR_NO_STATS_FMT, i,
2251 pool_info.subpool[i].
size,
2252 pool_info.subpool[i].
num,
2255 subpool_str[
sizeof(subpool_str) - 1] =
'\0';
2256 EM_PRINT(
" %-42s", subpool_str);
2262#define POOL_STATS_OPT_HDR_STR \
2263"Pool Available Alloc_ops Alloc_fails Free_ops Total_ops Cache_available" \
2264" Cache_alloc_ops Cache_free_ops Core_cache_available\n"\
2266void pool_stats_opt_print_hdr(
void)
2268 EM_PRINT(
"EM pool statistic counter options: 1(enable) 0(disable)\n"
2269 "-------------------------------------------------------\n"
2270 POOL_STATS_OPT_HDR_STR);
2273void pool_stats_opt_print(em_pool_t pool)
2279 if (unlikely(stat !=
EM_OK)) {
2280 EM_PRINT(
"Fail to fetch pool statistics counters options for pool %" PRI_POOL "\n",
2285 EM_PRINT(
"%-8" PRI_POOL "%-10u%-10u%-12u%-9u%-10u%-16u%-16u%-15u%-21u\n",
2297#define POOL_STATS_HDR_STR \
2298"EM pool statistics for pool %" PRI_POOL ":\n\n"\
2299"Subpool Available Alloc_ops Alloc_fails Free_ops Total_ops Cache_available" \
2300" Cache_alloc_ops Cache_free_ops\n"\
2301"--------------------------------------------------------------------------" \
2302"-------------------------------\n%s"
2304#define POOL_STATS_LEN 107
2305#define POOL_STATS_FMT "%-8u%-10lu%-10lu%-12lu%-9lu%-10lu%-16lu%-16lu%-15lu\n"
2307void pool_stats_print(em_pool_t pool)
2316 char stats_str[stats_str_len];
2318 if (pool_elem == NULL || !pool_allocated(pool_elem)) {
2319 EM_LOG(EM_LOG_ERR,
"EM-pool:%" PRI_POOL " invalid\n", pool);
2324 if (unlikely(stat !=
EM_OK)) {
2325 EM_PRINT(
"Failed to fetch EM pool statistics\n");
2329 for (uint32_t i = 0; i < pool_stats.num_subpools; i++) {
2330 subpool_stats = &pool_stats.subpool_stats[i];
2331 n_print = snprintf(stats_str + len, stats_str_len - len,
2343 if (n_print >= stats_str_len - len)
2349 stats_str[len] =
'\0';
2350 EM_PRINT(POOL_STATS_HDR_STR, pool, stats_str);
2353#define POOL_STATS_SELECTED_HDR_STR \
2354"Selected EM pool statistics for pool %" PRI_POOL ":\n\n"\
2355"Selected statistic counters: %s\n\n"\
2356"Subpool Available Alloc_ops Alloc_fails Free_ops Total_ops Cache_available" \
2357" Cache_alloc_ops Cache_free_ops\n"\
2358"--------------------------------------------------------------------------" \
2359"-------------------------------\n%s"
2361#define OPT_STR_LEN 150
2369 n_print = snprintf(opt_str + len, 12,
"%s",
"available");
2374 n_print = snprintf(opt_str + len, 12,
"%s", len ?
", alloc_ops" :
"alloc_ops");
2379 n_print = snprintf(opt_str + len, 14,
"%s", len ?
", alloc_fails" :
"alloc_fails");
2384 n_print = snprintf(opt_str + len, 11,
"%s", len ?
", free_ops" :
"free_ops");
2389 n_print = snprintf(opt_str + len, 12,
"%s", len ?
", total_ops" :
"total_ops");
2394 n_print = snprintf(opt_str + len, 18,
"%s",
2395 len ?
", cache_available" :
"cache_available");
2400 n_print = snprintf(opt_str + len, 18,
"%s",
2401 len ?
", cache_alloc_ops" :
"cache_alloc_ops");
2406 snprintf(opt_str + len, 17,
"%s", len ?
", cache_free_ops" :
"cache_free_ops");
2417 char opt_str[OPT_STR_LEN];
2419 char stats_str[stats_str_len];
2421 if (pool_elem == NULL || !pool_allocated(pool_elem)) {
2422 EM_LOG(EM_LOG_ERR,
"EM-pool:%" PRI_POOL " invalid\n", pool);
2427 if (unlikely(stat !=
EM_OK)) {
2428 EM_PRINT(
"Failed to fetch EM selected pool statistics\n");
2432 for (uint32_t i = 0; i < pool_stats.num_subpools; i++) {
2433 subpool_stats = &pool_stats.subpool_stats[i];
2435 n_print = snprintf(stats_str + len, stats_str_len - len,
2448 if (n_print >= stats_str_len - len)
2453 stats_str[len] =
'\0';
2456 fill_opt_str(opt_str, opt);
2458 EM_PRINT(POOL_STATS_SELECTED_HDR_STR, pool, opt_str, stats_str);
2461#define SUBPOOL_STATS_HDR_STR \
2462"EM subpool statistics for pool %" PRI_POOL ":\n\n"\
2463"Subpool Available Alloc_ops Alloc_fails Free_ops Total_ops Cache_available" \
2464" Cache_alloc_ops Cache_free_ops\n"\
2465"--------------------------------------------------------------------------" \
2466"-------------------------------\n%s"
2468void subpools_stats_print(em_pool_t pool,
const int subpools[],
int num_subpools)
2475 const int stats_str_len = num_subpools * POOL_STATS_LEN + 1;
2476 char stats_str[stats_str_len];
2478 if (pool_elem == NULL || !pool_allocated(pool_elem)) {
2479 EM_LOG(EM_LOG_ERR,
"EM-pool:%" PRI_POOL " invalid\n", pool);
2484 if (unlikely(!num_stats || num_stats > num_subpools)) {
2485 EM_LOG(EM_LOG_ERR,
"Failed to fetch subpool statistics\n");
2490 for (
int i = 0; i < num_stats; i++) {
2491 n_print = snprintf(stats_str + len, stats_str_len - len,
2493 subpools[i], stats[i].available, stats[i].alloc_ops,
2494 stats[i].alloc_fails, stats[i].free_ops,
2495 stats[i].total_ops, stats[i].cache_available,
2496 stats[i].cache_alloc_ops, stats[i].cache_free_ops);
2499 if (n_print >= stats_str_len - len)
2505 stats_str[len] =
'\0';
2506 EM_PRINT(SUBPOOL_STATS_HDR_STR, pool, stats_str);
2509#define SUBPOOL_STATS_SELECTED_HDR_STR \
2510"Selected EM subpool statistics for pool %" PRI_POOL ":\n\n"\
2511"Selected statistic counters: %s\n\n"\
2512"Subpool Available Alloc_ops Alloc_fails Free_ops Total_ops Cache_available" \
2513" Cache_alloc_ops Cache_free_ops\n"\
2514"--------------------------------------------------------------------------" \
2515"-------------------------------\n%s"
2517void subpools_stats_selected_print(em_pool_t pool,
const int subpools[],
2521 char opt_str[OPT_STR_LEN];
2526 const int stats_str_len = num_subpools * POOL_STATS_LEN + 1;
2527 char stats_str[stats_str_len];
2529 if (pool_elem == NULL || !pool_allocated(pool_elem)) {
2530 EM_LOG(EM_LOG_ERR,
"EM-pool:%" PRI_POOL " invalid\n", pool);
2534 memset(stats, 0,
sizeof(stats));
2536 if (unlikely(!num_stats || num_stats > num_subpools)) {
2537 EM_LOG(EM_LOG_ERR,
"Failed to fetch selected subpool statistics\n");
2542 for (
int i = 0; i < num_stats; i++) {
2543 n_print = snprintf(stats_str + len, stats_str_len - len,
2545 subpools[i], stats[i].available, stats[i].alloc_ops,
2546 stats[i].alloc_fails, stats[i].free_ops,
2547 stats[i].total_ops, stats[i].cache_available,
2548 stats[i].cache_alloc_ops, stats[i].cache_free_ops);
2551 if (n_print >= stats_str_len - len)
2556 stats_str[len] =
'\0';
2559 fill_opt_str(opt_str, opt);
2560 EM_PRINT(SUBPOOL_STATS_SELECTED_HDR_STR, pool, opt_str, stats_str);
2563void print_pool_elem_info(
void)
2566 "pool-elem size: %zu B\n",
2569 DBG_PRINT(
"\t\toffset\tsize\n"
2570 "\t\t------\t-----\n"
2571 "event_type:\t%3zu B\t%3zu B\n"
2572 "align_offset:\t%3zu B\t%3zu B\n"
2573 "user_area info:\t%3zu B\t%3zu B\n"
2574 "num_subpools:\t%3zu B\t%3zu B\n"
2575 "size[]:\t\t%3zu B\t%3zu B\n"
2576 "odp_pool[]:\t%3zu B\t%3zu B\n"
2577 "em_pool:\t%3zu B\t%3zu B\n"
2578 "objpool_elem:\t%3zu B\t%3zu B\n"
2579 "stats_opt:\t%3zu B\t%3zu B\n"
2580 "pool_cfg:\t%3zu B\t%3zu B\n"
2581 "name[]:\t\t%3zu B\t%3zu B\n",
#define INTERNAL_ERROR(error, escope, fmt,...)
struct event_hdr event_hdr_t
#define EM_CHECK_INIT_CALLED
#define POOL_ODP2EM_TBL_LEN
#define EM_EVENT_USER_AREA_MAX_SIZE
#define EM_POOL_DEFAULT_NAME
#define EM_MAX_SUBPOOLS
The maximum number of subpools in each EM pool. The subpool is a pool with buffers of only one size.
@ EM_ERR_OPERATION_FAILED
void em_free(em_event_t event)
em_pool_t em_pool_create(const char *name, em_pool_t pool, const em_pool_cfg_t *pool_cfg)
void em_pool_cfg_init(em_pool_cfg_t *const pool_cfg)
int em_pool_subpool_stats_selected(em_pool_t pool, const int subpools[], int num_subpools, em_pool_subpool_stats_selected_t subpool_stats[], const em_pool_stats_opt_t *opt)
Retrieve selected statistics about subpool(s) of an EM pool.
em_status_t em_pool_stats_selected(em_pool_t pool, em_pool_stats_selected_t *pool_stats, const em_pool_stats_opt_t *opt)
Retrieve selected statistics about an EM pool.
em_status_t em_pool_info(em_pool_t pool, em_pool_info_t *pool_info)
em_status_t em_pool_stats_opt(em_pool_t pool, em_pool_stats_opt_t *pool_stats_opt)
int em_pool_subpool_stats(em_pool_t pool, const int subpools[], int num_subpools, em_pool_subpool_stats_t subpool_stats[])
Retrieve statistics about subpool(s) of an EM pool.
em_status_t em_pool_stats(em_pool_t pool, em_pool_stats_t *pool_stats)
Retrieve statistics about an EM pool.
void em_pool_info_print_all(void)
struct em_pool_cfg_t::@23 subpool[EM_MAX_SUBPOOLS]
uint32_t __internal_check
struct em_pool_cfg_t::@21 user_area
struct em_pool_cfg_t::@22::@25 headroom
em_event_type_t event_type
struct em_pool_cfg_t::@22 pkt
struct em_pool_cfg_t::@20 align_offset
struct em_pool_cfg_t::@24 stats_opt
em_event_type_t event_type
odp_atomic_u32_t pool_count
struct mpool_elem_t::@54 user_area
odp_pool_stats_opt_t stats_opt
objpool_elem_t objpool_elem
odp_pool_t odp_pool[EM_MAX_SUBPOOLS]
em_event_type_t event_type
pool_subpool_t pool_subpool_odp2em[POOL_ODP2EM_TBL_LEN]
uint64_t core_cache_available