[PATCH v5-S1 5/5] mempool/dpaa2: look up ops index locally in secondary
Prashant Gupta
prashant.gupta_3 at nxp.com
Tue Sep 29 16:21:17 CEST 2026
From: Jun Yang <jun.yang at nxp.com>
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 <jun.yang at nxp.com>
Signed-off-by: Hemant Agrawal <hemant.agrawal at nxp.com>
---
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;
}
More information about the dev
mailing list