This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, cloud-dev has been updated via 344fe21a06ef4273f34c4441edd0caef876517d9 (commit) via 80aec96b85b20f6513e13851a19d3b4f34fe0e4d (commit) from d3fe76f2af39af17a3661b866a442878abc31ddc (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 344fe21a06ef4273f34c4441edd0caef876517d9 Author: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Date: Wed Aug 30 16:01:49 2017 -0500
linux-dpdk: optimize pool's data plane
Separate the pool's control plane and data plane data structures. This provides the following advantages: 1) Avoids sharing control plane related data and dataplane related data on the same cache line 2) Allows for tight packing of data plane only data to reduce the required cache size
Signed-off-by: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Reviewed-by: Brian Brooks brian.brooks@arm.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Yi He yi.he@linaro.org
diff --git a/platform/linux-dpdk/include/odp_pool_internal.h b/platform/linux-dpdk/include/odp_pool_internal.h index 2da6b122..2b3fc18c 100644 --- a/platform/linux-dpdk/include/odp_pool_internal.h +++ b/platform/linux-dpdk/include/odp_pool_internal.h @@ -47,8 +47,8 @@ extern "C" { #include <odp/api/spinlock.h> #endif
- -struct pool_entry_s { +/* Control plane structure - Accessed only by control plane code */ +typedef struct pool_entry_cp_t { #ifdef POOL_USE_TICKETLOCK odp_ticketlock_t lock ODP_ALIGNED_CACHE; #else @@ -57,36 +57,51 @@ struct pool_entry_s { char name[ODP_POOL_NAME_LEN]; odp_pool_param_t params; odp_pool_t pool_hdl; - struct rte_mempool *rte_mempool; -}; - -typedef union pool_entry_u { - struct pool_entry_s s; +} pool_entry_cp_t;
- uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct pool_entry_s))]; +/* Data plane structure - Accessed only by data plane code */ +typedef struct pool_entry_dp_t { + struct rte_mempool *rte_mempool; +} pool_entry_dp_t;
-} pool_entry_t; +/* Control plane only pool info */ +typedef struct pool_table_cp_t { + pool_entry_cp_t pool[ODP_CONFIG_POOLS]; + odp_shm_t shm_cp; + odp_shm_t shm_dp; +} pool_table_cp_t;
-typedef struct pool_table_t { - pool_entry_t pool[ODP_CONFIG_POOLS]; - odp_shm_t shm; -} pool_table_t; +/* Data plane only pool info */ +typedef struct pool_table_dp_t { + pool_entry_dp_t pool[ODP_CONFIG_POOLS]; +} pool_table_dp_t ODP_ALIGNED_CACHE;
-extern pool_table_t *pool_tbl; +extern pool_table_cp_t *pool_tbl_cp; +extern pool_table_dp_t *pool_tbl_dp;
static inline uint32_t pool_handle_to_index(odp_pool_t pool_hdl) { return _odp_typeval(pool_hdl); }
-static inline void *get_pool_entry(uint32_t pool_id) +static inline void *get_pool_entry_cp(uint32_t pool_id) +{ + return &pool_tbl_cp->pool[pool_id]; +} + +static inline void *get_pool_entry_dp(uint32_t pool_id) +{ + return &pool_tbl_dp->pool[pool_id]; +} + +static inline pool_entry_cp_t *odp_pool_to_entry_cp(odp_pool_t pool) { - return &pool_tbl->pool[pool_id]; + return (pool_entry_cp_t *)get_pool_entry_cp(pool_handle_to_index(pool)); }
-static inline pool_entry_t *odp_pool_to_entry(odp_pool_t pool) +static inline pool_entry_dp_t *odp_pool_to_entry_dp(odp_pool_t pool) { - return (pool_entry_t *)get_pool_entry(pool_handle_to_index(pool)); + return (pool_entry_dp_t *)get_pool_entry_dp(pool_handle_to_index(pool)); }
static inline odp_pool_t pool_index_to_handle(uint32_t pool_id) diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c index af4f8259..23aec95e 100644 --- a/platform/linux-dpdk/odp_packet.c +++ b/platform/linux-dpdk/odp_packet.c @@ -81,17 +81,20 @@ static inline odp_packet_hdr_t *buf_to_packet_hdr(odp_buffer_t buf) return (odp_packet_hdr_t *)buf_hdl_to_hdr(buf); }
-static odp_packet_t packet_alloc(pool_entry_t* pool, uint32_t len) +static odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len) { + pool_entry_dp_t *pool_dp; odp_packet_t pkt; uintmax_t totsize = RTE_PKTMBUF_HEADROOM + len; odp_packet_hdr_t *pkt_hdr; struct rte_mbuf *mbuf;
- if (pool->s.params.type != ODP_POOL_PACKET) - return ODP_PACKET_INVALID; + ODP_ASSERT(odp_pool_to_entry_cp(pool_hdl)->params.type + != ODP_POOL_PACKET); + + pool_dp = odp_pool_to_entry_dp(pool_hdl);
- mbuf = rte_pktmbuf_alloc(pool->s.rte_mempool); + mbuf = rte_pktmbuf_alloc(pool_dp->rte_mempool); if (mbuf == NULL) { rte_errno = ENOMEM; return ODP_PACKET_INVALID; @@ -105,7 +108,7 @@ static odp_packet_t packet_alloc(pool_entry_t* pool, uint32_t len)
do { struct rte_mbuf *nextseg = - rte_pktmbuf_alloc(pool->s.rte_mempool); + rte_pktmbuf_alloc(pool_dp->rte_mempool);
if (nextseg == NULL) { rte_pktmbuf_free(mbuf); @@ -130,19 +133,16 @@ static odp_packet_t packet_alloc(pool_entry_t* pool, uint32_t len)
odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len) { - pool_entry_t *pool = odp_pool_to_entry(pool_hdl); - - return packet_alloc(pool, len); + return packet_alloc(pool_hdl, len); }
int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, odp_packet_t pkt[], int num) { int i; - pool_entry_t *pool = odp_pool_to_entry(pool_hdl);
for (i = 0; i < num; i++) { - pkt[i] = packet_alloc(pool, len); + pkt[i] = packet_alloc(pool_hdl, len); if (pkt[i] == ODP_PACKET_INVALID) return rte_errno == ENOMEM ? i : -EINVAL; } diff --git a/platform/linux-dpdk/odp_packet_dpdk.c b/platform/linux-dpdk/odp_packet_dpdk.c index 649fbf4b..d808f130 100644 --- a/platform/linux-dpdk/odp_packet_dpdk.c +++ b/platform/linux-dpdk/odp_packet_dpdk.c @@ -198,8 +198,10 @@ static int start_pkt_dpdk(pktio_entry_t *pktio_entry) int sid = rte_eth_dev_socket_id(pkt_dpdk->portid); int socket_id = sid < 0 ? 0 : sid; uint16_t nbrxq, nbtxq; - pool_entry_t *pool_entry = - get_pool_entry(_odp_typeval(pktio_entry->s.pool)); + pool_entry_cp_t *pool_entry_cp = + odp_pool_to_entry_cp(pktio_entry->s.pool); + pool_entry_dp_t *pool_entry_dp = + odp_pool_to_entry_dp(pktio_entry->s.pool); uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; struct rte_eth_rss_conf rss_conf; @@ -234,7 +236,7 @@ static int start_pkt_dpdk(pktio_entry_t *pktio_entry) * VLAN tag */ port_conf.rxmode.max_rx_pkt_len = - rte_pktmbuf_data_room_size(pool_entry->s.rte_mempool) - + rte_pktmbuf_data_room_size(pool_entry_dp->rte_mempool) - 2 * 4 - RTE_PKTMBUF_HEADROOM;
nbtxq = pktio_entry->s.num_out_queue; @@ -247,20 +249,20 @@ static int start_pkt_dpdk(pktio_entry_t *pktio_entry) return -1; }
- if (nb_rxd + nb_txd > pool_entry->s.params.pkt.num / 4) { - double downrate = (double)(pool_entry->s.params.pkt.num / 4) / + if (nb_rxd + nb_txd > pool_entry_cp->params.pkt.num / 4) { + double downrate = (double)(pool_entry_cp->params.pkt.num / 4) / (double)(nb_rxd + nb_txd); nb_rxd >>= (int)ceil(downrate); nb_txd >>= (int)ceil(downrate); ODP_DBG("downrate %f\n", downrate); ODP_DBG("Descriptors scaled down. RX: %u TX: %u pool: %u\n", - nb_rxd, nb_txd, pool_entry->s.params.pkt.num); + nb_rxd, nb_txd, pool_entry_cp->params.pkt.num); } /* init one RX queue on each port */ for (i = 0; i < nbrxq; i++) { ret = rte_eth_rx_queue_setup(portid, i, nb_rxd, socket_id, NULL, - pool_entry->s.rte_mempool); + pool_entry_dp->rte_mempool); if (ret < 0) { ODP_ERR("rxq:err=%d, port=%u\n", ret, (unsigned)portid); return -1; @@ -313,9 +315,9 @@ static void _odp_pktio_send_completion(pktio_entry_t *pktio_entry) int i; unsigned j; odp_packet_t dummy; - pool_entry_t *pool_entry = - get_pool_entry(_odp_typeval(pktio_entry->s.pool)); - struct rte_mempool *rte_mempool = pool_entry->s.rte_mempool; + pool_entry_dp_t *pool_entry_dp = + odp_pool_to_entry_dp(pktio_entry->s.pool); + struct rte_mempool *rte_mempool = pool_entry_dp->rte_mempool;
for (j = 0; j < pktio_entry->s.num_out_queue; j++) send_pkt_dpdk(pktio_entry, j, &dummy, 0); @@ -376,10 +378,10 @@ static int recv_pkt_dpdk(pktio_entry_t *pktio_entry, int index, }
if (nb_rx == 0 && !pkt_dpdk->lockless_tx) { - pool_entry_t *pool_entry = - get_pool_entry(_odp_typeval(pktio_entry->s.pool)); + pool_entry_dp_t *pool_entry_dp = + odp_pool_to_entry_dp(pktio_entry->s.pool); struct rte_mempool *rte_mempool = - pool_entry->s.rte_mempool; + pool_entry_dp->rte_mempool; if (rte_mempool_avail_count(rte_mempool) == 0) _odp_pktio_send_completion(pktio_entry); } diff --git a/platform/linux-dpdk/pool/dpdk.c b/platform/linux-dpdk/pool/dpdk.c index 258f31ce..499bea12 100644 --- a/platform/linux-dpdk/pool/dpdk.c +++ b/platform/linux-dpdk/pool/dpdk.c @@ -44,40 +44,61 @@ #define MAX_SIZE (10 * 1024 * 1024)
/* The pool table ptr - resides in shared memory */ -pool_table_t *pool_tbl; +pool_table_cp_t *pool_tbl_cp; +pool_table_dp_t *pool_tbl_dp;
static int dpdk_pool_init_global(void) { uint32_t i; odp_shm_t shm;
- shm = odp_shm_reserve("odp_pools", - sizeof(pool_table_t), - sizeof(pool_entry_t), 0); + shm = odp_shm_reserve("odp_pools_cp", + sizeof(pool_table_cp_t), + sizeof(pool_entry_cp_t), 0); + if (shm == ODP_SHM_INVALID) + return -1; + + pool_tbl_cp = odp_shm_addr(shm); + if (pool_tbl_cp == NULL) + return -1;
- pool_tbl = odp_shm_addr(shm); + memset(pool_tbl_cp, 0, sizeof(pool_table_cp_t)); + pool_tbl_cp->shm_cp = shm;
- if (pool_tbl == NULL) + shm = odp_shm_reserve("odp_pools_dp", + sizeof(pool_table_dp_t), + ODP_CACHE_LINE_SIZE, 0); + if (shm == ODP_SHM_INVALID) return -1;
- memset(pool_tbl, 0, sizeof(pool_table_t)); - pool_tbl->shm = shm; + pool_tbl_dp = odp_shm_addr(shm); + if (pool_tbl_dp == NULL) + goto dp_tbl_alloc_failed; + + memset(pool_tbl_dp, 0, sizeof(pool_table_dp_t)); + pool_tbl_cp->shm_dp = shm;
for (i = 0; i < ODP_CONFIG_POOLS; i++) { /* init locks */ - pool_entry_t *pool = &pool_tbl->pool[i]; + pool_entry_cp_t *pool_cp = &pool_tbl_cp->pool[i];
- LOCK_INIT(&pool->s.lock); - pool->s.pool_hdl = pool_index_to_handle(i); + LOCK_INIT(&pool_cp->lock); + pool_cp->pool_hdl = pool_index_to_handle(i); }
ODP_DBG("\nPool init global\n"); - ODP_DBG(" pool_entry_s size %zu\n", sizeof(struct pool_entry_s)); - ODP_DBG(" pool_entry_t size %zu\n", sizeof(pool_entry_t)); + ODP_DBG(" pool_entry_cp_t size %zu\n", sizeof(pool_entry_cp_t)); + ODP_DBG(" pool_entry_dp_t size %zu\n", sizeof(pool_entry_dp_t)); + ODP_DBG(" pool_table_cp_t size %zu\n", sizeof(pool_table_cp_t)); + ODP_DBG(" pool_table_dp_t size %zu\n", sizeof(pool_table_dp_t)); ODP_DBG(" odp_buffer_hdr_t size %zu\n", sizeof(odp_buffer_hdr_t)); ODP_DBG("\n");
return 0; + +dp_tbl_alloc_failed: + odp_shm_free(pool_tbl_cp->shm_cp); + return -1; }
static int dpdk_pool_init_local(void) @@ -89,9 +110,13 @@ static int dpdk_pool_term_global(void) { int ret;
- ret = odp_shm_free(pool_tbl->shm); + ret = odp_shm_free(pool_tbl_cp->shm_dp); + if (ret < 0) + ODP_ERR("Pool DP shm free failed\n"); + + ret = odp_shm_free(pool_tbl_cp->shm_cp); if (ret < 0) - ODP_ERR("shm free failed"); + ODP_ERR("Pool CP shm free failed\n");
return ret; } @@ -222,7 +247,7 @@ odp_dpdk_mbuf_ctor(struct rte_mempool *mp, #define CHECK_U16_OVERFLOW(X) do { \ if (odp_unlikely(X > UINT16_MAX)) { \ ODP_ERR("Invalid size: %d", X); \ - UNLOCK(&pool->s.lock); \ + UNLOCK(&pool_cp->lock); \ return ODP_POOL_INVALID; \ } \ } while (0) @@ -297,7 +322,8 @@ static odp_pool_t dpdk_pool_create(const char *name, odp_pool_t pool_hdl = ODP_POOL_INVALID; unsigned mb_size, i, cache_size; size_t hdr_size; - pool_entry_t *pool; + pool_entry_cp_t *pool_cp; + pool_entry_dp_t *pool_dp; uint32_t buf_align, blk_size, headroom, tailroom, min_seg_len; uint32_t max_len, min_align; char pool_name[ODP_POOL_NAME_LEN]; @@ -321,11 +347,12 @@ static odp_pool_t dpdk_pool_create(const char *name, uint32_t num; struct rte_mempool *mp;
- pool = get_pool_entry(i); + pool_cp = get_pool_entry_cp(i); + pool_dp = get_pool_entry_dp(i);
- LOCK(&pool->s.lock); - if (pool->s.rte_mempool != NULL) { - UNLOCK(&pool->s.lock); + LOCK(&pool_cp->lock); + if (pool_dp->rte_mempool != NULL) { + UNLOCK(&pool_cp->lock); continue; }
@@ -338,7 +365,7 @@ static odp_pool_t dpdk_pool_create(const char *name, if (buf_align > ODP_CONFIG_BUFFER_ALIGN_MAX || buf_align != ROUNDDOWN_POWER2(buf_align, buf_align)) { - UNLOCK(&pool->s.lock); + UNLOCK(&pool_cp->lock); return ODP_POOL_INVALID; }
@@ -413,7 +440,7 @@ static odp_pool_t dpdk_pool_create(const char *name, default: ODP_ERR("Bad type %i\n", params->type); - UNLOCK(&pool->s.lock); + UNLOCK(&pool_cp->lock); return ODP_POOL_INVALID; }
@@ -422,7 +449,7 @@ static odp_pool_t dpdk_pool_create(const char *name, mb_ctor_arg.seg_buf_size = mbp_ctor_arg.pkt.mbuf_data_room_size; mb_ctor_arg.type = params->type; mb_size = mb_ctor_arg.seg_buf_offset + mb_ctor_arg.seg_buf_size; - mbp_ctor_arg.pool_hdl = pool->s.pool_hdl; + mbp_ctor_arg.pool_hdl = pool_cp->pool_hdl; mbp_ctor_arg.pkt.mbuf_priv_size = mb_ctor_arg.seg_buf_offset - sizeof(struct rte_mbuf);
@@ -453,7 +480,7 @@ static odp_pool_t dpdk_pool_create(const char *name, pool_name); }
- pool->s.rte_mempool = + pool_dp->rte_mempool = rte_mempool_create(rte_name ? rte_name : pool_name, num, mb_size, @@ -466,30 +493,30 @@ static odp_pool_t dpdk_pool_create(const char *name, rte_socket_id(), 0); free(rte_name); - if (pool->s.rte_mempool == NULL) { + if (pool_dp->rte_mempool == NULL) { ODP_ERR("Cannot init DPDK mbuf pool: %s\n", rte_strerror(rte_errno)); - UNLOCK(&pool->s.lock); + UNLOCK(&pool_cp->lock); return ODP_POOL_INVALID; } /* found free pool */ if (name == NULL) { - pool->s.name[0] = 0; + pool_cp->name[0] = 0; } else { - strncpy(pool->s.name, name, + strncpy(pool_cp->name, name, ODP_POOL_NAME_LEN - 1); - pool->s.name[ODP_POOL_NAME_LEN - 1] = 0; + pool_cp->name[ODP_POOL_NAME_LEN - 1] = 0; }
- pool->s.params = *params; - mp = pool->s.rte_mempool; + pool_cp->params = *params; + mp = pool_dp->rte_mempool; ODP_DBG("Header/element/trailer size: %u/%u/%u, " "total pool size: %lu\n", mp->header_size, mp->elt_size, mp->trailer_size, (unsigned long)((mp->header_size + mp->elt_size + mp->trailer_size) * num)); - UNLOCK(&pool->s.lock); - pool_hdl = pool->s.pool_hdl; + UNLOCK(&pool_cp->lock); + pool_hdl = pool_cp->pool_hdl; break; }
@@ -507,30 +534,34 @@ static odp_pool_t dpdk_pool_lookup(const char *name) return ODP_POOL_INVALID;
for (i = 0; i < ODP_CONFIG_POOLS; i++) { - pool_entry_t *pool = get_pool_entry(i); + pool_entry_cp_t *pool_cp = get_pool_entry_cp(i); + pool_entry_dp_t *pool_dp = get_pool_entry_dp(i);
- LOCK(&pool->s.lock); - if (pool->s.rte_mempool != mp) { - UNLOCK(&pool->s.lock); + LOCK(&pool_cp->lock); + if (pool_dp->rte_mempool != mp) { + UNLOCK(&pool_cp->lock); continue; } - UNLOCK(&pool->s.lock); - pool_hdl = pool->s.pool_hdl; + UNLOCK(&pool_cp->lock); + pool_hdl = pool_cp->pool_hdl; + break; } return pool_hdl; }
-static odp_buffer_t buffer_alloc(pool_entry_t *pool) +static odp_buffer_t buffer_alloc(odp_pool_t pool_hdl) { odp_buffer_t buffer; + pool_entry_cp_t *pool_cp; + pool_entry_dp_t *pool_dp;
- if (odp_unlikely(pool->s.params.type != ODP_POOL_BUFFER && - pool->s.params.type != ODP_POOL_TIMEOUT)) { - rte_errno = EINVAL; - return ODP_BUFFER_INVALID; - } + pool_cp = odp_pool_to_entry_cp(pool_hdl); + pool_dp = odp_pool_to_entry_dp(pool_hdl); + + ODP_ASSERT(pool_cp->params.type != ODP_POOL_BUFFER && + pool_cp->params.type != ODP_POOL_TIMEOUT);
- buffer = (odp_buffer_t)rte_ctrlmbuf_alloc(pool->s.rte_mempool); + buffer = (odp_buffer_t)rte_ctrlmbuf_alloc(pool_dp->rte_mempool);
if ((struct rte_mbuf *)buffer == NULL) { rte_errno = ENOMEM; @@ -545,9 +576,7 @@ odp_buffer_t odp_buffer_alloc(odp_pool_t pool_hdl) { ODP_ASSERT(ODP_POOL_INVALID != pool_hdl);
- pool_entry_t *pool = odp_pool_to_entry(pool_hdl); - - return buffer_alloc(pool); + return buffer_alloc(pool_hdl); }
int odp_buffer_alloc_multi(odp_pool_t pool_hdl, odp_buffer_t buf[], int num) @@ -556,10 +585,8 @@ int odp_buffer_alloc_multi(odp_pool_t pool_hdl, odp_buffer_t buf[], int num)
ODP_ASSERT(ODP_POOL_INVALID != pool_hdl);
- pool_entry_t *pool = odp_pool_to_entry(pool_hdl); - for (i = 0; i < num; i++) { - buf[i] = buffer_alloc(pool); + buf[i] = buffer_alloc(pool_hdl); if (buf[i] == ODP_BUFFER_INVALID) return rte_errno == ENOMEM ? i : -EINVAL; } @@ -586,23 +613,20 @@ void odp_buffer_free_multi(const odp_buffer_t buf[], int num)
static void dpdk_pool_print(odp_pool_t pool_hdl) { - uint32_t pool_id = pool_handle_to_index(pool_hdl); - pool_entry_t *pool = get_pool_entry(pool_id); + pool_entry_dp_t *pool_dp = odp_pool_to_entry_dp(pool_hdl);
- rte_mempool_dump(stdout, pool->s.rte_mempool); + rte_mempool_dump(stdout, pool_dp->rte_mempool); }
static int dpdk_pool_info(odp_pool_t pool_hdl, odp_pool_info_t *info) { - uint32_t pool_id = pool_handle_to_index(pool_hdl); - - pool_entry_t *pool = get_pool_entry(pool_id); + pool_entry_cp_t *pool_cp = odp_pool_to_entry_cp(pool_hdl);
- if (pool == NULL || info == NULL) + if (pool_cp == NULL || info == NULL) return -1;
- info->name = pool->s.name; - info->params = pool->s.params; + info->name = pool_cp->name; + info->params = pool_cp->params;
return 0; } @@ -613,17 +637,15 @@ static int dpdk_pool_info(odp_pool_t pool_hdl, odp_pool_info_t *info) */ static int dpdk_pool_destroy(odp_pool_t pool_hdl) { - uint32_t pool_id = pool_handle_to_index(pool_hdl); - pool_entry_t *pool = get_pool_entry(pool_id); - struct rte_mempool *mp = rte_mempool_lookup(pool->s.name); + pool_entry_dp_t *pool_dp = odp_pool_to_entry_dp(pool_hdl);
- if (mp == NULL) { - ODP_ERR("Can't find pool with this name!\n"); + if (pool_dp->rte_mempool == NULL) { + ODP_ERR("Can't find pool!\n"); return -1; }
- rte_mempool_free(mp); - pool->s.rte_mempool = NULL; + rte_mempool_free(pool_dp->rte_mempool); + pool_dp->rte_mempool = NULL; /* The pktio supposed to be closed by now */ return 0; }
commit 80aec96b85b20f6513e13851a19d3b4f34fe0e4d Author: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Date: Sun Aug 27 22:24:15 2017 -0500
linux-dpdk: remove unwanted caching of pool pointers
Pointers to pool entry were cached in pool_entry_ptr array. This does not provide any advantage than accessing from pool_tbl.
Signed-off-by: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Reviewed-by: Brian Brooks brian.brooks@arm.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Yi He yi.he@linaro.org
diff --git a/platform/linux-dpdk/include/odp_pool_internal.h b/platform/linux-dpdk/include/odp_pool_internal.h index b49cc114..2da6b122 100644 --- a/platform/linux-dpdk/include/odp_pool_internal.h +++ b/platform/linux-dpdk/include/odp_pool_internal.h @@ -67,7 +67,12 @@ typedef union pool_entry_u {
} pool_entry_t;
-extern void *pool_entry_ptr[]; +typedef struct pool_table_t { + pool_entry_t pool[ODP_CONFIG_POOLS]; + odp_shm_t shm; +} pool_table_t; + +extern pool_table_t *pool_tbl;
static inline uint32_t pool_handle_to_index(odp_pool_t pool_hdl) { @@ -76,7 +81,7 @@ static inline uint32_t pool_handle_to_index(odp_pool_t pool_hdl)
static inline void *get_pool_entry(uint32_t pool_id) { - return pool_entry_ptr[pool_id]; + return &pool_tbl->pool[pool_id]; }
static inline pool_entry_t *odp_pool_to_entry(odp_pool_t pool) diff --git a/platform/linux-dpdk/pool/dpdk.c b/platform/linux-dpdk/pool/dpdk.c index 1209553b..258f31ce 100644 --- a/platform/linux-dpdk/pool/dpdk.c +++ b/platform/linux-dpdk/pool/dpdk.c @@ -43,16 +43,8 @@ /* Define a practical limit for contiguous memory allocations */ #define MAX_SIZE (10 * 1024 * 1024)
-typedef struct pool_table_t { - pool_entry_t pool[ODP_CONFIG_POOLS]; - odp_shm_t shm; -} pool_table_t; - /* The pool table ptr - resides in shared memory */ -static pool_table_t *pool_tbl; - -/* Pool entry pointers (for inlining) */ -void *pool_entry_ptr[ODP_CONFIG_POOLS]; +pool_table_t *pool_tbl;
static int dpdk_pool_init_global(void) { @@ -77,8 +69,6 @@ static int dpdk_pool_init_global(void)
LOCK_INIT(&pool->s.lock); pool->s.pool_hdl = pool_index_to_handle(i); - - pool_entry_ptr[i] = pool; }
ODP_DBG("\nPool init global\n");
-----------------------------------------------------------------------
Summary of changes: platform/linux-dpdk/include/odp_pool_internal.h | 46 +++++-- platform/linux-dpdk/odp_packet.c | 20 +-- platform/linux-dpdk/odp_packet_dpdk.c | 28 ++-- platform/linux-dpdk/pool/dpdk.c | 170 +++++++++++++----------- 4 files changed, 149 insertions(+), 115 deletions(-)
hooks/post-receive