net/mlx5: fix error statistics in SSE Rx
authorYongseok Koh <yskoh@mellanox.com>
Wed, 2 Aug 2017 17:25:54 +0000 (10:25 -0700)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 3 Aug 2017 21:27:06 +0000 (23:27 +0200)
If there's a Rx completion with error (e.g, MTU mismatch), it is handled
later out of main burst loop as a slow path for performance reason.
Statistics should be corrected by subtracting counters of errored packets.
Also, the last entry of mlx5_ptype_table[] must be RTE_PTYPE_ALL_MASK to
mark error in completion.

Fixes: ea16068c0064 ("net/mlx5: fix L4 packet type support")
Fixes: 6cb559d67b83 ("net/mlx5: add vectorized Rx/Tx burst for x86")

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
drivers/net/mlx5/mlx5_rxtx.c
drivers/net/mlx5/mlx5_rxtx_vec_sse.c

index 2572a16..b07bcd1 100644 (file)
@@ -94,7 +94,8 @@ mlx5_set_ptype_table(void)
        unsigned int i;
        uint32_t (*p)[RTE_DIM(mlx5_ptype_table)] = &mlx5_ptype_table;
 
-       for (i = 0; i < RTE_DIM(mlx5_ptype_table); ++i)
+       /* Last entry must not be overwritten, reserved for errored packet. */
+       for (i = 0; i < RTE_DIM(mlx5_ptype_table) - 1; ++i)
                (*p)[i] = RTE_PTYPE_UNKNOWN;
        /*
         * The index to the array should have:
index 8a8d94c..a5e1868 100644 (file)
@@ -887,16 +887,28 @@ rxq_handle_pending_error(struct rxq *rxq, struct rte_mbuf **pkts,
 {
        uint16_t n = 0;
        unsigned int i;
+#ifdef MLX5_PMD_SOFT_COUNTERS
+       uint32_t err_bytes = 0;
+#endif
 
        for (i = 0; i < pkts_n; ++i) {
                struct rte_mbuf *pkt = pkts[i];
 
-               if (pkt->packet_type == RTE_PTYPE_ALL_MASK)
+               if (pkt->packet_type == RTE_PTYPE_ALL_MASK) {
+#ifdef MLX5_PMD_SOFT_COUNTERS
+                       err_bytes += PKT_LEN(pkt);
+#endif
                        rte_pktmbuf_free_seg(pkt);
-               else
+               } else {
                        pkts[n++] = pkt;
+               }
        }
        rxq->stats.idropped += (pkts_n - n);
+#ifdef MLX5_PMD_SOFT_COUNTERS
+       /* Correct counters of errored completions. */
+       rxq->stats.ipackets -= (pkts_n - n);
+       rxq->stats.ibytes -= err_bytes;
+#endif
        rxq->pending_err = 0;
        return n;
 }