Secondary process is not allowed to register mempools on the flight. The code will return invalid memory key for such case.
Fixes: 87ec44ce1651 ("net/mlx5: add operations for secondary process") Cc: sta...@dpdk.org Signed-off-by: Shahaf Shuler <shah...@mellanox.com> Signed-off-by: Xueming Li <xuemi...@mellanox.com> --- doc/guides/nics/mlx5.rst | 7 ++++++- drivers/net/mlx5/mlx5_rxtx.h | 17 ++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index bdc2216c0..2f860402f 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -106,7 +106,12 @@ Limitations - Inner RSS for VXLAN frames is not supported yet. - Hardware checksum RX offloads for VXLAN inner header are not supported yet. -- Forked secondary process not supported. +- For secondary process: + + - Forked secondary process not supported. + - All mempools must be initialized before rte_eth_dev_start(). + - Number of mempools must less than CONFIG_RTE_LIBRTE_MLX5_TX_MP_CACHE + - Flow pattern without any specific vlan will match for vlan packets as well: When VLAN spec is not specified in the pattern, the matching rule will be created with VLAN as a wild card. diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h index a63364d79..79cdfc793 100644 --- a/drivers/net/mlx5/mlx5_rxtx.h +++ b/drivers/net/mlx5/mlx5_rxtx.h @@ -550,6 +550,7 @@ mlx5_tx_mb2mr(struct mlx5_txq_data *txq, struct rte_mbuf *mb) uint16_t i = txq->mr_cache_idx; uintptr_t addr = rte_pktmbuf_mtod(mb, uintptr_t); struct mlx5_mr *mr; + struct rte_mempool *mp; assert(i < RTE_DIM(txq->mp2mr)); if (likely(txq->mp2mr[i]->start <= addr && txq->mp2mr[i]->end >= addr)) @@ -563,14 +564,24 @@ mlx5_tx_mb2mr(struct mlx5_txq_data *txq, struct rte_mbuf *mb) if (txq->mp2mr[i]->start <= addr && txq->mp2mr[i]->end >= addr) { assert(txq->mp2mr[i]->lkey != (uint32_t)-1); - assert(rte_cpu_to_be_32(txq->mp2mr[i]->mr->lkey) == - txq->mp2mr[i]->lkey); + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + assert(rte_cpu_to_be_32(txq->mp2mr[i]->mr->lkey) + == txq->mp2mr[i]->lkey); + } txq->mr_cache_idx = i; return txq->mp2mr[i]->lkey; } } txq->mr_cache_idx = 0; - mr = mlx5_txq_mp2mr_reg(txq, mlx5_tx_mb2mp(mb), i); + mp = mlx5_tx_mb2mp(mb); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + WARN("Using unregistered mempool 0x%p(%s) in secondary process," + " please create mempool before rte_eth_dev_start()", + (void *)mp, mp->name); + assert(rte_eal_process_type() == RTE_PROC_PRIMARY); + return (uint32_t)-1; + } + mr = mlx5_txq_mp2mr_reg(txq, mp, i); /* * Request the reference to use in this queue, the original one is * kept by the control plane. -- 2.12.0