net/mlx5e: IPOIB, Fix overflowing SQ WQE memset
authorTariq Toukan <tariqt@mellanox.com>
Thu, 31 May 2018 15:01:31 +0000 (18:01 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 1 Jun 2018 23:48:13 +0000 (16:48 -0700)
IPoIB WQE size is larger than a single WQEBB.  Must not fetch the WQE,
and surely not memset it, until it is guaranteed that there are enough
WQEBBs available before getting to SQ/frag edge.

Fixes: 043dc78ecf07 ("net/mlx5e: TX, Use actual WQE size for SQ edge fill")
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c

index aafd75257fd0c6aacfd8e2b3f827d0a4321135ae..9829ee02de31a3aec7ae91dbe6d920ce64e7c0e2 100644 (file)
@@ -653,8 +653,6 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
        int num_dma;
        __be16 mss;
 
-       mlx5i_sq_fetch_wqe(sq, &wqe, &pi);
-
        /* Calc ihs and ds cnt, no writes to wqe yet */
        ds_cnt = sizeof(*wqe) / MLX5_SEND_WQE_DS;
        if (skb_is_gso(skb)) {
@@ -686,10 +684,12 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
        num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
        frag_pi = mlx5_wq_cyc_ctr2fragix(wq, sq->pc);
        if (unlikely(frag_pi + num_wqebbs > mlx5_wq_cyc_get_frag_size(wq))) {
+               pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
                mlx5e_fill_sq_frag_edge(sq, wq, pi, frag_pi);
-               mlx5i_sq_fetch_wqe(sq, &wqe, &pi);
        }
 
+       mlx5i_sq_fetch_wqe(sq, &wqe, &pi);
+
        /* fill wqe */
        wi       = &sq->db.wqe_info[pi];
        cseg     = &wqe->ctrl;