Fill new odp_pool_info_t fields when calling odp_pool_info(). Also make sure that enough ring slots are allocated in pool_create() in a case that the requested length packets (odp_pool_param_t.pkt.len) will be segmented.
Signed-off-by: Matias Elo <matias....@nokia.com> --- .../linux-generic/include/odp_packet_internal.h | 22 ++++++++++++++++++++++ platform/linux-generic/include/odp_pool_internal.h | 1 + platform/linux-generic/odp_packet.c | 22 ---------------------- platform/linux-generic/odp_pool.c | 21 ++++++++++++++++++--- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index d0db700..a6b4052 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -237,6 +237,28 @@ int packet_parse_common(packet_parser_t *pkt_hdr, const uint8_t *ptr, int _odp_cls_parse(odp_packet_hdr_t *pkt_hdr, const uint8_t *parseptr); +/* Calculate the number of segments */ +static inline int num_segments(uint32_t len) +{ + uint32_t max_seg_len; + int num; + + if (CONFIG_PACKET_MAX_SEGS == 1) + return 1; + + num = 1; + max_seg_len = CONFIG_PACKET_MAX_SEG_LEN; + + if (odp_unlikely(len > max_seg_len)) { + num = len / max_seg_len; + + if (odp_likely((num * max_seg_len) != len)) + num += 1; + } + + return num; +} + #ifdef __cplusplus } #endif diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h index ebb779d..89be862 100644 --- a/platform/linux-generic/include/odp_pool_internal.h +++ b/platform/linux-generic/include/odp_pool_internal.h @@ -55,6 +55,7 @@ typedef struct pool_t { odp_shm_t uarea_shm; int reserved; uint32_t num; + uint32_t num_max_len; uint32_t align; uint32_t headroom; uint32_t tailroom; diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 0b70c5c..79a25d1 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -298,28 +298,6 @@ static inline void init_segments(odp_packet_hdr_t *pkt_hdr[], int num) } } -/* Calculate the number of segments */ -static inline int num_segments(uint32_t len) -{ - uint32_t max_seg_len; - int num; - - if (CONFIG_PACKET_MAX_SEGS == 1) - return 1; - - num = 1; - max_seg_len = CONFIG_PACKET_MAX_SEG_LEN; - - if (odp_unlikely(len > max_seg_len)) { - num = len / max_seg_len; - - if (odp_likely((num * max_seg_len) != len)) - num += 1; - } - - return num; -} - static inline void add_all_segs(odp_packet_hdr_t *to, odp_packet_hdr_t *from) { int i; diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 9dba734..6f732ce 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -293,6 +293,7 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, uint32_t max_len, max_seg_len; uint32_t ring_size; int name_len; + int num_max_len; const char *postfix = "_uarea"; char uarea_name[ODP_POOL_NAME_LEN + sizeof(postfix)]; @@ -321,6 +322,7 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, data_size = 0; max_len = 0; max_seg_len = 0; + num_max_len = 0; uarea_size = 0; switch (params->type) { @@ -332,11 +334,17 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, case ODP_POOL_PACKET: headroom = CONFIG_PACKET_HEADROOM; tailroom = CONFIG_PACKET_TAILROOM; - num = params->pkt.num; + + num = params->pkt.num * num_segments(params->pkt.len); + + max_seg_len = CONFIG_PACKET_MAX_SEG_LEN; + max_len = (params->pkt.max_len != 0) ? params->pkt.max_len : + CONFIG_PACKET_MAX_SEGS * max_seg_len; + + num_max_len = num / num_segments(max_len); + uarea_size = params->pkt.uarea_size; data_size = CONFIG_PACKET_MAX_SEG_LEN; - max_seg_len = CONFIG_PACKET_MAX_SEG_LEN; - max_len = CONFIG_PACKET_MAX_SEGS * max_seg_len; break; case ODP_POOL_TIMEOUT: @@ -385,6 +393,7 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, pool->ring_mask = ring_size - 1; pool->num = num; + pool->num_max_len = num_max_len; pool->align = align; pool->headroom = headroom; pool->data_size = data_size; @@ -593,8 +602,13 @@ int odp_pool_info(odp_pool_t pool_hdl, odp_pool_info_t *info) if (pool == NULL || info == NULL) return -1; + memset(info, 0, sizeof(odp_pool_info_t)); + info->name = pool->name; info->params = pool->params; + info->pkt.max_num = pool->num; + info->pkt.num_min_len = pool->num; + info->pkt.num_max_len = pool->num_max_len; return 0; } @@ -854,6 +868,7 @@ void odp_pool_print(odp_pool_t pool_hdl) printf(" user area shm %" PRIu64 "\n", odp_shm_to_u64(pool->uarea_shm)); printf(" num %u\n", pool->num); + printf(" num max len %u\n", pool->num_max_len); printf(" align %u\n", pool->align); printf(" headroom %u\n", pool->headroom); printf(" data size %u\n", pool->data_size); -- 2.7.4