mlx4: add rx_alloc_pages counter in ethtool -S
authorEric Dumazet <edumazet@google.com>
Wed, 8 Mar 2017 16:17:14 +0000 (08:17 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Mar 2017 17:54:46 +0000 (09:54 -0800)
This new counter tracks number of pages that we allocated for one port.

lpaa24:~# ethtool -S eth0 | egrep 'rx_alloc_pages|rx_packets'
     rx_packets: 306755183
     rx_alloc_pages: 932897

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Tariq Toukan <tariqt@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_port.c
drivers/net/ethernet/mellanox/mlx4/en_rx.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h

index c4d714fcc7dae759998a49a1f90f9ab1ee9bdda3..ffbcb27c05e55f43630a812249bab21609886dd9 100644 (file)
@@ -117,7 +117,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
        /* port statistics */
        "tso_packets",
        "xmit_more",
-       "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed",
+       "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_pages",
        "rx_csum_good", "rx_csum_none", "rx_csum_complete", "tx_chksum_offload",
 
        /* pf statistics */
index 9166d90e732858610b1407fe85cbf6cbe27f5e0b..e0eb695318e64ebcaf58d6edb5f9a57be6f9ddf6 100644 (file)
@@ -213,6 +213,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
        priv->port_stats.rx_chksum_good = 0;
        priv->port_stats.rx_chksum_none = 0;
        priv->port_stats.rx_chksum_complete = 0;
+       priv->port_stats.rx_alloc_pages = 0;
        priv->xdp_stats.rx_xdp_drop    = 0;
        priv->xdp_stats.rx_xdp_tx      = 0;
        priv->xdp_stats.rx_xdp_tx_full = 0;
@@ -223,6 +224,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
                priv->port_stats.rx_chksum_good += READ_ONCE(ring->csum_ok);
                priv->port_stats.rx_chksum_none += READ_ONCE(ring->csum_none);
                priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete);
+               priv->port_stats.rx_alloc_pages += READ_ONCE(ring->rx_alloc_pages);
                priv->xdp_stats.rx_xdp_drop     += READ_ONCE(ring->xdp_drop);
                priv->xdp_stats.rx_xdp_tx       += READ_ONCE(ring->xdp_tx);
                priv->xdp_stats.rx_xdp_tx_full  += READ_ONCE(ring->xdp_tx_full);
index 5edd0cf2999cbde37b3404aafd700584696af940..d3a425fa46b3924411e42a865b3a57aa063f1635 100644 (file)
@@ -72,6 +72,7 @@ static int mlx4_alloc_page(struct mlx4_en_priv *priv,
 }
 
 static int mlx4_en_alloc_frags(struct mlx4_en_priv *priv,
+                              struct mlx4_en_rx_ring *ring,
                               struct mlx4_en_rx_desc *rx_desc,
                               struct mlx4_en_rx_alloc *frags,
                               gfp_t gfp)
@@ -79,8 +80,11 @@ static int mlx4_en_alloc_frags(struct mlx4_en_priv *priv,
        int i;
 
        for (i = 0; i < priv->num_frags; i++, frags++) {
-               if (!frags->page && mlx4_alloc_page(priv, frags, gfp))
-                       return -ENOMEM;
+               if (!frags->page) {
+                       if (mlx4_alloc_page(priv, frags, gfp))
+                               return -ENOMEM;
+                       ring->rx_alloc_pages++;
+               }
                rx_desc->data[i].addr = cpu_to_be64(frags->dma +
                                                    frags->page_offset);
        }
@@ -133,7 +137,6 @@ static int mlx4_en_prepare_rx_desc(struct mlx4_en_priv *priv,
        struct mlx4_en_rx_desc *rx_desc = ring->buf + (index * ring->stride);
        struct mlx4_en_rx_alloc *frags = ring->rx_info +
                                        (index << priv->log_rx_info);
-
        if (ring->page_cache.index > 0) {
                /* XDP uses a single page per frame */
                if (!frags->page) {
@@ -147,7 +150,7 @@ static int mlx4_en_prepare_rx_desc(struct mlx4_en_priv *priv,
                return 0;
        }
 
-       return mlx4_en_alloc_frags(priv, rx_desc, frags, gfp);
+       return mlx4_en_alloc_frags(priv, ring, rx_desc, frags, gfp);
 }
 
 static bool mlx4_en_is_ring_empty(const struct mlx4_en_rx_ring *ring)
index 5f608026698100c9746aac9bbbafe9e3c8b86c2d..39f401aa30474e61c0b0029463b23a829ec35fa3 100644 (file)
@@ -346,6 +346,7 @@ struct mlx4_en_rx_ring {
        unsigned long csum_ok;
        unsigned long csum_none;
        unsigned long csum_complete;
+       unsigned long rx_alloc_pages;
        unsigned long xdp_drop;
        unsigned long xdp_tx;
        unsigned long xdp_tx_full;
index 48641cb0367f251a07537b82d0a16bf50d8479ef..926f3c3f3665c5d28fe5d35c41afaa0e5917c007 100644 (file)
@@ -37,7 +37,7 @@ struct mlx4_en_port_stats {
        unsigned long queue_stopped;
        unsigned long wake_queue;
        unsigned long tx_timeout;
-       unsigned long rx_alloc_failed;
+       unsigned long rx_alloc_pages;
        unsigned long rx_chksum_good;
        unsigned long rx_chksum_none;
        unsigned long rx_chksum_complete;