Improve performance by changing the first parameter of
buffer_alloc_multi() to pool pointer (from handle), to avoid
double lookup of the pool pointer. Pointer is available for
packet alloc calls already.

Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
---
 platform/linux-generic/include/odp_buffer_internal.h |  4 ----
 platform/linux-generic/include/odp_pool_internal.h   |  4 ++++
 platform/linux-generic/odp_packet.c                  |  6 +++---
 platform/linux-generic/odp_pool.c                    | 16 ++++++++++------
 4 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/platform/linux-generic/include/odp_buffer_internal.h 
b/platform/linux-generic/include/odp_buffer_internal.h
index 64ba221..0ca13f8 100644
--- a/platform/linux-generic/include/odp_buffer_internal.h
+++ b/platform/linux-generic/include/odp_buffer_internal.h
@@ -105,10 +105,6 @@ struct odp_buffer_hdr_t {
 };
 
 /* Forward declarations */
-int buffer_alloc_multi(odp_pool_t pool_hdl, odp_buffer_t buf[],
-                      odp_buffer_hdr_t *buf_hdr[], int num);
-void buffer_free_multi(const odp_buffer_t buf[], int num_free);
-
 int seg_alloc_head(odp_buffer_hdr_t *buf_hdr, int segcount);
 void seg_free_head(odp_buffer_hdr_t *buf_hdr, int segcount);
 int seg_alloc_tail(odp_buffer_hdr_t *buf_hdr, int segcount);
diff --git a/platform/linux-generic/include/odp_pool_internal.h 
b/platform/linux-generic/include/odp_pool_internal.h
index f7c315c..f7e951a 100644
--- a/platform/linux-generic/include/odp_pool_internal.h
+++ b/platform/linux-generic/include/odp_pool_internal.h
@@ -109,6 +109,10 @@ static inline odp_buffer_hdr_t 
*buf_hdl_to_hdr(odp_buffer_t buf)
        return buf_hdr;
 }
 
+int buffer_alloc_multi(pool_t *pool, odp_buffer_t buf[],
+                      odp_buffer_hdr_t *buf_hdr[], int num);
+void buffer_free_multi(const odp_buffer_t buf[], int num_free);
+
 uint32_t pool_headroom(odp_pool_t pool);
 uint32_t pool_tailroom(odp_pool_t pool);
 
diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index c44f687..2eee775 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -84,7 +84,7 @@ int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len,
        int num, i;
        odp_packet_hdr_t *pkt_hdrs[max_num];
 
-       num = buffer_alloc_multi(pool_hdl, (odp_buffer_t *)pkt,
+       num = buffer_alloc_multi(pool, (odp_buffer_t *)pkt,
                                 (odp_buffer_hdr_t **)pkt_hdrs, max_num);
 
        for (i = 0; i < num; i++) {
@@ -115,7 +115,7 @@ odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t 
len)
        if (odp_unlikely(len > pool->max_len))
                return ODP_PACKET_INVALID;
 
-       ret = buffer_alloc_multi(pool_hdl, (odp_buffer_t *)&pkt, NULL, 1);
+       ret = buffer_alloc_multi(pool, (odp_buffer_t *)&pkt, NULL, 1);
        if (ret != 1)
                return ODP_PACKET_INVALID;
 
@@ -146,7 +146,7 @@ int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t 
len,
        if (odp_unlikely(len > pool->max_len))
                return -1;
 
-       count = buffer_alloc_multi(pool_hdl, (odp_buffer_t *)pkt,
+       count = buffer_alloc_multi(pool, (odp_buffer_t *)pkt,
                                   (odp_buffer_hdr_t **)pkt_hdrs, num);
 
        for (i = 0; i < count; ++i) {
diff --git a/platform/linux-generic/odp_pool.c 
b/platform/linux-generic/odp_pool.c
index faea2fc..364df97 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -528,19 +528,17 @@ int odp_pool_info(odp_pool_t pool_hdl, odp_pool_info_t 
*info)
        return 0;
 }
 
-int buffer_alloc_multi(odp_pool_t pool_hdl, odp_buffer_t buf[],
+int buffer_alloc_multi(pool_t *pool, odp_buffer_t buf[],
                       odp_buffer_hdr_t *buf_hdr[], int max_num)
 {
-       pool_t *pool;
        ring_t *ring;
        uint32_t mask, i;
        pool_cache_t *cache;
        uint32_t cache_num, num_ch, num_deq, burst;
 
-       pool  = pool_entry_from_hdl(pool_hdl);
        ring  = &pool->ring.hdr;
        mask  = pool->ring_mask;
-       cache = local.cache[_odp_typeval(pool_hdl)];
+       cache = local.cache[pool->pool_idx];
 
        cache_num = cache->num;
        num_ch    = max_num;
@@ -696,9 +694,11 @@ void buffer_free_multi(const odp_buffer_t buf[], int 
num_total)
 odp_buffer_t odp_buffer_alloc(odp_pool_t pool_hdl)
 {
        odp_buffer_t buf;
+       pool_t *pool;
        int ret;
 
-       ret = buffer_alloc_multi(pool_hdl, &buf, NULL, 1);
+       pool = pool_entry_from_hdl(pool_hdl);
+       ret = buffer_alloc_multi(pool, &buf, NULL, 1);
 
        if (odp_likely(ret == 1))
                return buf;
@@ -708,7 +708,11 @@ odp_buffer_t odp_buffer_alloc(odp_pool_t pool_hdl)
 
 int odp_buffer_alloc_multi(odp_pool_t pool_hdl, odp_buffer_t buf[], int num)
 {
-       return buffer_alloc_multi(pool_hdl, buf, NULL, num);
+       pool_t *pool;
+
+       pool = pool_entry_from_hdl(pool_hdl);
+
+       return buffer_alloc_multi(pool, buf, NULL, num);
 }
 
 void odp_buffer_free(odp_buffer_t buf)
-- 
2.8.1

Reply via email to