net/mlx4_en: Low Latency recv statistics
authorAmir Vadai <amirv@mellanox.com>
Tue, 18 Jun 2013 13:18:28 +0000 (16:18 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Jun 2013 01:32:16 +0000 (18:32 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

index c9e6b62dd000955565fb0186d334221a834b0a40..727874f575cedc80e65d52d4918007151feb3c09 100644 (file)
@@ -222,7 +222,12 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
        switch (sset) {
        case ETH_SS_STATS:
                return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) +
-                       (priv->tx_ring_num + priv->rx_ring_num) * 2;
+                       (priv->tx_ring_num * 2) +
+#ifdef CONFIG_NET_LL_RX_POLL
+                       (priv->rx_ring_num * 5);
+#else
+                       (priv->rx_ring_num * 2);
+#endif
        case ETH_SS_TEST:
                return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags
                                        & MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2;
@@ -271,6 +276,11 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
        for (i = 0; i < priv->rx_ring_num; i++) {
                data[index++] = priv->rx_ring[i].packets;
                data[index++] = priv->rx_ring[i].bytes;
+#ifdef CONFIG_NET_LL_RX_POLL
+               data[index++] = priv->rx_ring[i].yields;
+               data[index++] = priv->rx_ring[i].misses;
+               data[index++] = priv->rx_ring[i].cleaned;
+#endif
        }
        spin_unlock_bh(&priv->stats_lock);
 
@@ -334,6 +344,14 @@ static void mlx4_en_get_strings(struct net_device *dev,
                                "rx%d_packets", i);
                        sprintf(data + (index++) * ETH_GSTRING_LEN,
                                "rx%d_bytes", i);
+#ifdef CONFIG_NET_LL_RX_POLL
+                       sprintf(data + (index++) * ETH_GSTRING_LEN,
+                               "rx%d_napi_yield", i);
+                       sprintf(data + (index++) * ETH_GSTRING_LEN,
+                               "rx%d_misses", i);
+                       sprintf(data + (index++) * ETH_GSTRING_LEN,
+                               "rx%d_cleaned", i);
+#endif
                }
                break;
        }
index ab9ec91d1f70c4a94d86ecfdba45ff7fa288a9aa..7299ada876c2b4ae3b4e0e5f2e4ba6bbf2af5d5f 100644 (file)
@@ -85,6 +85,10 @@ static int mlx4_en_low_latency_recv(struct napi_struct *napi)
                return LL_FLUSH_BUSY;
 
        done = mlx4_en_process_rx_cq(dev, cq, 4);
+       if (likely(done))
+               rx_ring->cleaned += done;
+       else
+               rx_ring->misses++;
 
        mlx4_en_cq_unlock_poll(cq);
 
index 11c862e4e69d258a66465bc32bb5243f5c8e9f65..57192a8f1d5e02f410e16be9382d7d2623b4128d 100644 (file)
@@ -290,6 +290,11 @@ struct mlx4_en_rx_ring {
        void *rx_info;
        unsigned long bytes;
        unsigned long packets;
+#ifdef CONFIG_NET_LL_RX_POLL
+       unsigned long yields;
+       unsigned long misses;
+       unsigned long cleaned;
+#endif
        unsigned long csum_ok;
        unsigned long csum_none;
        int hwtstamp_rx_filter;
@@ -625,6 +630,7 @@ static inline bool mlx4_en_cq_lock_poll(struct mlx4_en_cq *cq)
 
                cq->state |= MLX4_EN_CQ_STATE_POLL_YIELD;
                rc = false;
+               rx_ring->yields++;
        } else
                /* preserve yield marks */
                cq->state |= MLX4_EN_CQ_STATE_POLL;