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

Reply via email to