Wednesday, January 24, 2018 10:14 AM, Nélio Laranjeiro: > Hi Shahaf, > > On Tue, Jan 23, 2018 at 07:08:20PM +0200, Shahaf Shuler wrote: > > 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 > > Why such limitation? Registering a new memory is independent of searching > a new one when the cache is too small. > > > - 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); > > + } > > This code should be inside priv_txq_mp2mr_reg() to let the secondary > search inside the MR list when the cache is too small.
You probably mean below code and not above. Yes good suggestion. Regarding the above code - the assert in un-accessible from the secondary process as it tries to access ibv_mr. I will add another patch to remove this assert completely (in order to save the comparison logic). > > If it does not find any MR it should fail before calling priv_mr_new(). > > > 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 > > -- > Nélio Laranjeiro > 6WIND