mempool: introduce helpers for populate and required size
[dpdk.git] / drivers / mempool / dpaa / dpaa_mempool.c
index 580e464..27736e6 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017 NXP
+ *   Copyright 2017,2019 NXP
  *
  */
 
 #include <rte_ring.h>
 
 #include <dpaa_mempool.h>
+#include <dpaax_iova_table.h>
 
-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(&params);
        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,7 @@ dpaa_buf_free(struct dpaa_bp_info *bp_info, uint64_t addr)
        struct bm_buffer buf;
        int ret;
 
-       DPAA_MEMPOOL_DEBUG("Free 0x%" PRIx64 " to bpid: %d",
+       DPAA_MEMPOOL_DPDEBUG("Free 0x%" PRIx64 " to bpid: %d",
                           addr, bp_info->bpid);
 
        bm_buffer_set64(&buf, addr);
@@ -271,29 +298,54 @@ dpaa_populate(struct rte_mempool *mp, unsigned int max_objs,
        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 %" PRIx64 " vs Available %u\n",
+       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)
                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 rte_mempool_op_populate_default(mp, max_objs, vaddr, paddr, len,
-                                              obj_cb, obj_cb_arg);
+       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,