net/mlx4: fix Tx packet drop application report
authorMatan Azrad <matan@mellanox.com>
Wed, 6 Dec 2017 17:57:49 +0000 (17:57 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jan 2018 17:47:49 +0000 (18:47 +0100)
When invalid lkey is sent to HW, HW sends an error notification in
completion function.

The previous code wouldn't crash but doesn't add any application report
in case of completion error, so application cannot know that packet
actually was dropped in case of invalid lkey.

Return back the lkey validation to Tx path.

Fixes: 2eee458746bc ("net/mlx4: remove error flows from Tx fast path")
Cc: stable@dpdk.org
Signed-off-by: Matan Azrad <matan@mellanox.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
drivers/net/mlx4/mlx4_rxtx.c

index 5bc9874..5a78bc0 100644 (file)
@@ -468,7 +468,6 @@ mlx4_tx_burst_segs(struct rte_mbuf *buf, struct txq *txq,
                /* Memory region key (big endian) for this memory pool. */
                lkey = mlx4_txq_mp2mr(txq, mlx4_txq_mb2mp(sbuf));
                dseg->lkey = rte_cpu_to_be_32(lkey);
-#ifndef NDEBUG
                /* Calculate the needed work queue entry size for this packet */
                if (unlikely(dseg->lkey == rte_cpu_to_be_32((uint32_t)-1))) {
                        /* MR does not exist. */
@@ -486,7 +485,6 @@ mlx4_tx_burst_segs(struct rte_mbuf *buf, struct txq *txq,
                                        (sq->head & sq->txbb_cnt) ? 0 : 1);
                        return -1;
                }
-#endif /* NDEBUG */
                if (likely(sbuf->data_len)) {
                        byte_count = rte_cpu_to_be_32(sbuf->data_len);
                } else {
@@ -636,7 +634,6 @@ mlx4_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
                        /* Memory region key (big endian). */
                        lkey = mlx4_txq_mp2mr(txq, mlx4_txq_mb2mp(buf));
                        dseg->lkey = rte_cpu_to_be_32(lkey);
-#ifndef NDEBUG
                        if (unlikely(dseg->lkey ==
                                rte_cpu_to_be_32((uint32_t)-1))) {
                                /* MR does not exist. */
@@ -655,7 +652,6 @@ mlx4_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
                                elt->buf = NULL;
                                break;
                        }
-#endif /* NDEBUG */
                        /* Never be TXBB aligned, no need compiler barrier. */
                        dseg->byte_count = rte_cpu_to_be_32(buf->data_len);
                        /* Fill the control parameters for this packet. */