net/mlx5: fix queue wrap-around of multi-packet send
authorYongseok Koh <yskoh@mellanox.com>
Wed, 18 Jan 2017 00:51:55 +0000 (16:51 -0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 30 Jan 2017 21:18:26 +0000 (22:18 +0100)
When the WQ is wrapped around, it wrongly checks the condition when
resetting the pointer. It should be compared against the end of the queue,
not the beginning of the queue. And this isn't even needed when the length
of the copying data crosses the boundary.

Fixes: fdcb0f53053b ("net/mlx5: use work queue buffer as a raw buffer")
Cc: stable@dpdk.org
Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
drivers/net/mlx5/mlx5_rxtx.c

index 6c23899..fbfc5fb 100644 (file)
@@ -1038,11 +1038,13 @@ mlx5_tx_burst_mpw_inline(void *dpdk_txq, struct rte_mbuf **pkts,
                                rte_memcpy((void *)(uintptr_t)mpw.data.raw,
                                           (void *)addr,
                                           length);
-                               mpw.data.raw += length;
+
+                               if (length == max)
+                                       mpw.data.raw =
+                                               (volatile void *)txq->wqes;
+                               else
+                                       mpw.data.raw += length;
                        }
-                       if ((uintptr_t)mpw.data.raw ==
-                           (uintptr_t)tx_mlx5_wqe(txq, 1 << txq->wqe_n))
-                               mpw.data.raw = (volatile void *)txq->wqes;
                        ++mpw.pkts_n;
                        ++j;
                        if (mpw.pkts_n == MLX5_MPW_DSEG_MAX) {