From: Jun Yang <[email protected]>

Secondary processes call rte_dpaa2_mpool_get_ops_idx() but the ops
index was registered only in the primary process, so the function
returned the sentinel RTE_MEMPOOL_MAX_OPS_IDX on every call in a
secondary.

The ops index is process-invariant: mempool ops are registered by a
constructor at library load time in the same link order in every
process. Fix rte_dpaa2_mpool_get_ops_idx() to scan rte_mempool_ops_table
by name ("dpaa2") locally and cache the result. No IPC round-trip is
needed.

Also fix a duplicated word in an error message in rte_hw_mbuf_create_pool
("Only single ops index only" -> "Single ops index only") and improve the
error log in rte_hw_mbuf_free_pool to include the pool name.
Signed-off-by: Jun Yang <[email protected]>
Signed-off-by: Hemant Agrawal <[email protected]>
---
 drivers/mempool/dpaa2/dpaa2_hw_mempool.c | 25 ++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/drivers/mempool/dpaa2/dpaa2_hw_mempool.c 
b/drivers/mempool/dpaa2/dpaa2_hw_mempool.c
index ee001d8ce0..c2f2aecc2e 100644
--- a/drivers/mempool/dpaa2/dpaa2_hw_mempool.c
+++ b/drivers/mempool/dpaa2/dpaa2_hw_mempool.c
@@ -43,7 +43,25 @@ static int16_t s_dpaa2_pool_ops_idx = 
RTE_MEMPOOL_MAX_OPS_IDX;
 RTE_EXPORT_INTERNAL_SYMBOL(rte_dpaa2_mpool_get_ops_idx)
 int rte_dpaa2_mpool_get_ops_idx(void)
 {
-       return s_dpaa2_pool_ops_idx;
+       uint32_t i;
+
+       if (s_dpaa2_pool_ops_idx != RTE_MEMPOOL_MAX_OPS_IDX)
+               return s_dpaa2_pool_ops_idx;
+
+       /* Mempool ops are registered by constructor in the same order in
+        * every process, so the index is process-invariant. Scan the ops
+        * table locally and cache the result.
+        */
+       for (i = 0; i < rte_mempool_ops_table.num_ops; i++) {
+               if (strcmp(rte_mempool_ops_table.ops[i].name,
+                               DPAA2_MEMPOOL_OPS_NAME) == 0) {
+                       s_dpaa2_pool_ops_idx = (int16_t)i;
+                       return s_dpaa2_pool_ops_idx;
+               }
+       }
+
+       DPAA2_MEMPOOL_ERR("dpaa2 mempool ops not found");
+       return -ENOENT;
 }
 
 static int
@@ -128,11 +146,10 @@ rte_hw_mbuf_create_pool(struct rte_mempool *mp)
        if (s_dpaa2_pool_ops_idx == RTE_MEMPOOL_MAX_OPS_IDX) {
                s_dpaa2_pool_ops_idx = mp->ops_index;
        } else if (s_dpaa2_pool_ops_idx != mp->ops_index) {
-               DPAA2_MEMPOOL_ERR("Only single ops index only");
+               DPAA2_MEMPOOL_ERR("Single ops index only");
                ret = -EINVAL;
                goto err4;
        }
-
        bp_list->next = h_bp_list;
        bp_list->mp = mp;
 
@@ -172,7 +189,7 @@ rte_hw_mbuf_free_pool(struct rte_mempool *mp)
        struct dpaa2_dpbp_dev *dpbp_node;
 
        if (!mp->pool_data) {
-               DPAA2_MEMPOOL_ERR("Not a valid dpaa2 buffer pool");
+               DPAA2_MEMPOOL_ERR("Not a valid dpaa2 buffer pool %s", mp->name);
                return;
        }
 

Reply via email to