diff options
author | Matias Elo <matias.elo@nokia.com> | 2019-08-23 10:23:42 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2019-08-23 13:17:03 +0300 |
commit | f2a20ef1c75ee2cac4db0e64b7c05ab3be2b5128 (patch) | |
tree | 49182c65c578399965008128039e6dd9b0554444 | |
parent | c201d8b9af3c32a9cb2aa6a3d667672101756499 (diff) |
linux-dpdk: pool: use rte_pktmbuf_pool_create() to create packet pools
Some platforms require that rte_pktmbuf_pool_create() API is used instead
of rte_mempool_create() to select correct underlying pool implementation.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
-rw-r--r-- | platform/linux-dpdk/odp_pool.c | 91 |
1 files changed, 37 insertions, 54 deletions
diff --git a/platform/linux-dpdk/odp_pool.c b/platform/linux-dpdk/odp_pool.c index fbf011ea6..5c0149d68 100644 --- a/platform/linux-dpdk/odp_pool.c +++ b/platform/linux-dpdk/odp_pool.c @@ -182,34 +182,13 @@ int odp_pool_capability(odp_pool_capability_t *capa) } struct mbuf_ctor_arg { + pool_t *pool; uint16_t seg_buf_offset; /* To skip the ODP buf/pkt/tmo header */ uint16_t seg_buf_size; /* size of user data */ int type; int pkt_uarea_size; /* size of user area in bytes */ }; -struct mbuf_pool_ctor_arg { - /* This has to be the first member */ - struct rte_pktmbuf_pool_private pkt; - pool_t *pool; -}; - -static void -odp_dpdk_mbuf_pool_ctor(struct rte_mempool *mp, - void *opaque_arg) -{ - struct mbuf_pool_ctor_arg *mbp_priv; - - if (mp->private_data_size < sizeof(struct mbuf_pool_ctor_arg)) { - ODP_ERR("(%s) private_data_size %d < %d", - mp->name, (int)mp->private_data_size, - (int)sizeof(struct mbuf_pool_ctor_arg)); - return; - } - mbp_priv = rte_mempool_get_priv(mp); - *mbp_priv = *((struct mbuf_pool_ctor_arg *)opaque_arg); -} - /* ODP DPDK mbuf constructor. * This is a combination of rte_pktmbuf_init in rte_mbuf.c * and testpmd_mbuf_ctor in testpmd.c @@ -223,8 +202,6 @@ odp_dpdk_mbuf_ctor(struct rte_mempool *mp, struct mbuf_ctor_arg *mb_ctor_arg; struct rte_mbuf *mb = raw_mbuf; struct odp_buffer_hdr_t *buf_hdr; - struct mbuf_pool_ctor_arg *mbp_ctor_arg = rte_mempool_get_priv(mp); - pool_t *pool = mbp_ctor_arg->pool; /* The rte_mbuf is at the begninning in all cases */ mb_ctor_arg = (struct mbuf_ctor_arg *)opaque_arg; @@ -266,7 +243,7 @@ odp_dpdk_mbuf_ctor(struct rte_mempool *mp, /* Save index, might be useful for debugging purposes */ buf_hdr = (struct odp_buffer_hdr_t *)raw_mbuf; buf_hdr->index = i; - buf_hdr->pool_ptr = pool; + buf_hdr->pool_ptr = mb_ctor_arg->pool; buf_hdr->type = mb_ctor_arg->type; buf_hdr->event_type = mb_ctor_arg->type; } @@ -395,7 +372,7 @@ static unsigned int calc_cache_size(uint32_t num) odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) { - struct mbuf_pool_ctor_arg mbp_ctor_arg; + struct rte_pktmbuf_pool_private mbp_ctor_arg; struct mbuf_ctor_arg mb_ctor_arg; odp_pool_t pool_hdl = ODP_POOL_INVALID; unsigned mb_size, i, cache_size; @@ -404,7 +381,7 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) uint32_t buf_align, blk_size, headroom, tailroom, min_seg_len; uint32_t max_len, min_align; char pool_name[ODP_POOL_NAME_LEN]; - char *rte_name = NULL; + char rte_name[RTE_MEMPOOL_NAMESIZE]; if (check_params(params)) return ODP_POOL_INVALID; @@ -454,7 +431,7 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) hdr_size = sizeof(odp_buffer_hdr_t); CHECK_U16_OVERFLOW(blk_size); - mbp_ctor_arg.pkt.mbuf_data_room_size = blk_size; + mbp_ctor_arg.mbuf_data_room_size = blk_size; num = params->buf.num; ODP_DBG("type: buffer name: %s num: " "%u size: %u align: %u\n", pool_name, num, @@ -494,7 +471,7 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) params->pkt.uarea_size; mb_ctor_arg.pkt_uarea_size = params->pkt.uarea_size; CHECK_U16_OVERFLOW(blk_size); - mbp_ctor_arg.pkt.mbuf_data_room_size = blk_size; + mbp_ctor_arg.mbuf_data_room_size = blk_size; num = params->pkt.num; ODP_DBG("type: packet, name: %s, " @@ -505,7 +482,7 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) break; case ODP_POOL_TIMEOUT: hdr_size = sizeof(odp_timeout_hdr_t); - mbp_ctor_arg.pkt.mbuf_data_room_size = 0; + mbp_ctor_arg.mbuf_data_room_size = 0; num = params->tmo.num; ODP_DBG("type: tmo name: %s num: %u\n", pool_name, num); @@ -519,11 +496,11 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) mb_ctor_arg.seg_buf_offset = (uint16_t)ROUNDUP_CACHE_LINE(hdr_size); - mb_ctor_arg.seg_buf_size = mbp_ctor_arg.pkt.mbuf_data_room_size; + mb_ctor_arg.seg_buf_size = mbp_ctor_arg.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 = pool; - mbp_ctor_arg.pkt.mbuf_priv_size = mb_ctor_arg.seg_buf_offset - + mb_ctor_arg.pool = pool; + mbp_ctor_arg.mbuf_priv_size = mb_ctor_arg.seg_buf_offset - sizeof(struct rte_mbuf); ODP_DBG("Metadata size: %u, mb_size %d\n", @@ -531,34 +508,40 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) cache_size = calc_cache_size(num); - if (strlen(pool_name) > RTE_MEMPOOL_NAMESIZE - 1) { + if (strlen(pool_name) > RTE_MEMPOOL_NAMESIZE - 1) ODP_ERR("Max pool name size: %u. Trimming %u long, name collision might happen!\n", RTE_MEMPOOL_NAMESIZE - 1, strlen(pool_name)); - rte_name = malloc(RTE_MEMPOOL_NAMESIZE); - snprintf(rte_name, RTE_MEMPOOL_NAMESIZE - 1, "%s", - pool_name); - } - pool->rte_mempool = - rte_mempool_create(rte_name ? rte_name : pool_name, - num, - mb_size, - cache_size, - sizeof(struct mbuf_pool_ctor_arg), - odp_dpdk_mbuf_pool_ctor, - &mbp_ctor_arg, - odp_dpdk_mbuf_ctor, - &mb_ctor_arg, - rte_socket_id(), - 0); - free(rte_name); - if (pool->rte_mempool == NULL) { + snprintf(rte_name, RTE_MEMPOOL_NAMESIZE, "%s", pool_name); + + if (params->type == ODP_POOL_PACKET) { + uint16_t data_room_size, priv_size; + + data_room_size = mbp_ctor_arg.mbuf_data_room_size; + priv_size = mbp_ctor_arg.mbuf_priv_size; + mp = rte_pktmbuf_pool_create(rte_name, num, cache_size, + priv_size, data_room_size, + rte_socket_id()); + } else { + unsigned int priv_size; + + priv_size = sizeof(struct rte_pktmbuf_pool_private); + mp = rte_mempool_create(rte_name, num, mb_size, + cache_size, priv_size, + rte_pktmbuf_pool_init, + &mbp_ctor_arg, NULL, NULL, + rte_socket_id(), 0); + } + if (mp == NULL) { ODP_ERR("Cannot init DPDK mbuf pool: %s\n", rte_strerror(rte_errno)); UNLOCK(&pool->lock); return ODP_POOL_INVALID; } - /* found free pool */ + + /* Initialize pool objects */ + rte_mempool_obj_iter(mp, odp_dpdk_mbuf_ctor, &mb_ctor_arg); + if (name == NULL) { pool->name[0] = 0; } else { @@ -567,8 +550,8 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) pool->name[ODP_POOL_NAME_LEN - 1] = 0; } + pool->rte_mempool = mp; pool->params = *params; - mp = pool->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, |