X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fmempool%2Fdpaa%2Fdpaa_mempool.c;h=27736e6c22b7f54223e0184993fd7cb5b3f76fec;hb=23bdcedcd8caa0d268b615df3bdb08411f97856e;hp=dc4bcc9ac5aa685a201db2568c849b7fdc16c0b4;hpb=2bd0d5b951a92ce1be828f6614a27197b30e1e07;p=dpdk.git diff --git a/drivers/mempool/dpaa/dpaa_mempool.c b/drivers/mempool/dpaa/dpaa_mempool.c index dc4bcc9ac5..27736e6c22 100644 --- a/drivers/mempool/dpaa/dpaa_mempool.c +++ b/drivers/mempool/dpaa/dpaa_mempool.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright 2017 NXP + * Copyright 2017,2019 NXP * */ @@ -26,8 +26,16 @@ #include #include +#include -struct dpaa_bp_info rte_dpaa_bpid_info[DPAA_MAX_BPOOLS]; +/* List of all the memseg information locally maintained in dpaa driver. This + * is to optimize the PA_to_VA searches until a better mechanism (algo) is + * available. + */ +struct dpaa_memseg_list rte_dpaa_memsegs + = TAILQ_HEAD_INITIALIZER(rte_dpaa_memsegs); + +struct dpaa_bp_info *rte_dpaa_bpid_info; static int dpaa_mbuf_create_pool(struct rte_mempool *mp) @@ -43,6 +51,15 @@ dpaa_mbuf_create_pool(struct rte_mempool *mp) MEMPOOL_INIT_FUNC_TRACE(); + if (unlikely(!RTE_PER_LCORE(dpaa_io))) { + ret = rte_dpaa_portal_init((void *)0); + if (ret) { + DPAA_MEMPOOL_ERR( + "rte_dpaa_portal_init failed with ret: %d", + ret); + return -1; + } + } bp = bman_new_pool(¶ms); if (!bp) { DPAA_MEMPOOL_ERR("bman_new_pool() failed"); @@ -66,6 +83,16 @@ dpaa_mbuf_create_pool(struct rte_mempool *mp) DPAA_MEMPOOL_WARN("drained %u bufs from BPID %d", num_bufs, bpid); + if (rte_dpaa_bpid_info == NULL) { + rte_dpaa_bpid_info = (struct dpaa_bp_info *)rte_zmalloc(NULL, + sizeof(struct dpaa_bp_info) * DPAA_MAX_BPOOLS, + RTE_CACHE_LINE_SIZE); + if (rte_dpaa_bpid_info == NULL) { + bman_free_pool(bp); + return -ENOMEM; + } + } + rte_dpaa_bpid_info[bpid].mp = mp; rte_dpaa_bpid_info[bpid].bpid = bpid; rte_dpaa_bpid_info[bpid].size = mp->elt_size; @@ -115,7 +142,8 @@ dpaa_buf_free(struct dpaa_bp_info *bp_info, uint64_t addr) struct bm_buffer buf; int ret; - DPAA_MEMPOOL_DEBUG("Free 0x%lx to bpid: %d", addr, bp_info->bpid); + DPAA_MEMPOOL_DPDEBUG("Free 0x%" PRIx64 " to bpid: %d", + addr, bp_info->bpid); bm_buffer_set64(&buf, addr); retry: @@ -139,21 +167,22 @@ dpaa_mbuf_free_bulk(struct rte_mempool *pool, DPAA_MEMPOOL_DPDEBUG("Request to free %d buffers in bpid = %d", n, bp_info->bpid); - ret = rte_dpaa_portal_init((void *)0); - if (ret) { - DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d", - ret); - return 0; + if (unlikely(!RTE_PER_LCORE(dpaa_io))) { + ret = rte_dpaa_portal_init((void *)0); + if (ret) { + DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d", + ret); + return 0; + } } while (i < n) { uint64_t phy = rte_mempool_virt2iova(obj_table[i]); if (unlikely(!bp_info->ptov_off)) { - /* buffers are not from multiple memzones */ - if (!(bp_info->flags & DPAA_MPOOL_MULTI_MEMZONE)) { - bp_info->ptov_off - = (uint64_t)obj_table[i] - phy; + /* buffers are from single mem segment */ + if (bp_info->flags & DPAA_MPOOL_SINGLE_SEGMENT) { + bp_info->ptov_off = (size_t)obj_table[i] - phy; rte_dpaa_bpid_info[bp_info->bpid].ptov_off = bp_info->ptov_off; } @@ -193,11 +222,13 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool, return -1; } - ret = rte_dpaa_portal_init((void *)0); - if (ret) { - DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d", - ret); - return -1; + if (unlikely(!RTE_PER_LCORE(dpaa_io))) { + ret = rte_dpaa_portal_init((void *)0); + if (ret) { + DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d", + ret); + return -1; + } } while (n < count) { @@ -260,43 +291,68 @@ dpaa_mbuf_get_count(const struct rte_mempool *mp) } static int -dpaa_register_memory_area(const struct rte_mempool *mp, - char *vaddr __rte_unused, - rte_iova_t paddr __rte_unused, - size_t len) +dpaa_populate(struct rte_mempool *mp, unsigned int max_objs, + void *vaddr, rte_iova_t paddr, size_t len, + rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg) { struct dpaa_bp_info *bp_info; unsigned int total_elt_sz; - MEMPOOL_INIT_FUNC_TRACE(); - if (!mp || !mp->pool_data) { DPAA_MEMPOOL_ERR("Invalid mempool provided\n"); return 0; } + /* Update the PA-VA Table */ + dpaax_iova_table_update(paddr, vaddr, len); + bp_info = DPAA_MEMPOOL_TO_POOL_INFO(mp); total_elt_sz = mp->header_size + mp->elt_size + mp->trailer_size; - DPAA_MEMPOOL_DEBUG("Req size %lu vs Available %u\n", - len, total_elt_sz * mp->size); + DPAA_MEMPOOL_DPDEBUG("Req size %" PRIx64 " vs Available %u\n", + (uint64_t)len, total_elt_sz * mp->size); /* Detect pool area has sufficient space for elements in this memzone */ - if (len < total_elt_sz * mp->size) - /* Else, Memory will be allocated from multiple memzones */ - bp_info->flags |= DPAA_MPOOL_MULTI_MEMZONE; + if (len >= total_elt_sz * mp->size) + bp_info->flags |= DPAA_MPOOL_SINGLE_SEGMENT; + struct dpaa_memseg *ms; + + /* For each memory chunk pinned to the Mempool, a linked list of the + * contained memsegs is created for searching when PA to VA + * conversion is required. + */ + ms = rte_zmalloc(NULL, sizeof(struct dpaa_memseg), 0); + if (!ms) { + DPAA_MEMPOOL_ERR("Unable to allocate internal memory."); + DPAA_MEMPOOL_WARN("Fast Physical to Virtual Addr translation would not be available."); + /* If the element is not added, it would only lead to failure + * in searching for the element and the logic would Fallback + * to traditional DPDK memseg traversal code. So, this is not + * a blocking error - but, error would be printed on screen. + */ + return 0; + } - return 0; + ms->vaddr = vaddr; + ms->iova = paddr; + ms->len = len; + /* Head insertions are generally faster than tail insertions as the + * buffers pinned are picked from rear end. + */ + TAILQ_INSERT_HEAD(&rte_dpaa_memsegs, ms, next); + + return rte_mempool_op_populate_helper(mp, max_objs, vaddr, paddr, len, + obj_cb, obj_cb_arg); } -struct rte_mempool_ops dpaa_mpool_ops = { +static const struct rte_mempool_ops dpaa_mpool_ops = { .name = DPAA_MEMPOOL_OPS_NAME, .alloc = dpaa_mbuf_create_pool, .free = dpaa_mbuf_free_pool, .enqueue = dpaa_mbuf_free_bulk, .dequeue = dpaa_mbuf_alloc_bulk, .get_count = dpaa_mbuf_get_count, - .register_memory_area = dpaa_register_memory_area, + .populate = dpaa_populate, }; MEMPOOL_REGISTER_OPS(dpaa_mpool_ops);