Hi Yongseok, On Thu, Apr 13, 2017 at 10:46:51AM -0700, Yongseok Koh wrote: > Current implementation is error-prone if the max inline size > (txq->max_inilne) is decoupled from txq->inline_en and becomes zero. If it > becomes zero, HW can crash due to WQ overflow.
By reading this log, it seems more to be a fix, no? > Signed-off-by: Yongseok Koh <ys...@mellanox.com> > Acked-by: Shahaf Shuler <shah...@mellanox.com> > --- > drivers/net/mlx5/mlx5_rxtx.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c > index 2e208bf96..6254228a9 100644 > --- a/drivers/net/mlx5/mlx5_rxtx.c > +++ b/drivers/net/mlx5/mlx5_rxtx.c > @@ -499,6 +499,8 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, > uint16_t pkts_n) > unsigned int j = 0; > unsigned int k = 0; > unsigned int max; > + unsigned int max_inline = txq->max_inline; Cannot it be declared as const too? Seems it is only read in the whole Tx burst function, as it a chance to be update in the middle? > + const unsigned int inline_en = !!max_inline && txq->inline_en; > uint16_t max_wqe; > unsigned int comp; > volatile struct mlx5_wqe_v *wqe = NULL; > @@ -685,14 +687,14 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, > uint16_t pkts_n) > } > } > /* Inline if enough room. */ > - if (txq->inline_en || tso) { > + if (inline_en || tso) { > uintptr_t end = (uintptr_t) > (((uintptr_t)txq->wqes) + > (1 << txq->wqe_n) * MLX5_WQE_SIZE); > - unsigned int max_inline = txq->max_inline * > - RTE_CACHE_LINE_SIZE - > - (pkt_inline_sz - 2); > - uintptr_t addr_end = (addr + max_inline) & > + unsigned int inline_room = max_inline * > + RTE_CACHE_LINE_SIZE - > + (pkt_inline_sz - 2); > + uintptr_t addr_end = (addr + inline_room) & > ~(RTE_CACHE_LINE_SIZE - 1); > unsigned int copy_b = (addr_end > addr) ? > RTE_MIN((addr_end - addr), length) : > -- > 2.11.0 Thanks, -- Nélio Laranjeiro 6WIND