aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEran Ben Elisha <eranbe@mellanox.com>2016-04-20 09:01:18 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-21 15:02:40 -0400
commitd21ed3a311a1031dddc78e9270d1aa9adc8f8a93 (patch)
treed46447637b7bfd4d00a1fcd0d3fc370dd89a4fb7
parent2a500090a4ea2ccd713f3c782a2fb27681bd6e67 (diff)
net/mlx4_en: Split SW RX dropped counter per RX ring
Count SW packet drops per RX ring instead of a global counter. This will allow monitoring the number of rx drops per ring. In addition, SW rx_dropped counter was overwritten by HW rx_dropped counter, sum both of them instead to show the accurate value. Fixes: a3333b35da16 ('net/mlx4_en: Moderate ethtool callback to [...] ') Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com> Reported-by: Brenden Blanco <bblanco@plumgrid.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Reported-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_ethtool.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_port.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h1
4 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index f69584a9b47f..c761194bb323 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -337,7 +337,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
337 case ETH_SS_STATS: 337 case ETH_SS_STATS:
338 return bitmap_iterator_count(&it) + 338 return bitmap_iterator_count(&it) +
339 (priv->tx_ring_num * 2) + 339 (priv->tx_ring_num * 2) +
340 (priv->rx_ring_num * 2); 340 (priv->rx_ring_num * 3);
341 case ETH_SS_TEST: 341 case ETH_SS_TEST:
342 return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags 342 return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags
343 & MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2; 343 & MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2;
@@ -404,6 +404,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
404 for (i = 0; i < priv->rx_ring_num; i++) { 404 for (i = 0; i < priv->rx_ring_num; i++) {
405 data[index++] = priv->rx_ring[i]->packets; 405 data[index++] = priv->rx_ring[i]->packets;
406 data[index++] = priv->rx_ring[i]->bytes; 406 data[index++] = priv->rx_ring[i]->bytes;
407 data[index++] = priv->rx_ring[i]->dropped;
407 } 408 }
408 spin_unlock_bh(&priv->stats_lock); 409 spin_unlock_bh(&priv->stats_lock);
409 410
@@ -477,6 +478,8 @@ static void mlx4_en_get_strings(struct net_device *dev,
477 "rx%d_packets", i); 478 "rx%d_packets", i);
478 sprintf(data + (index++) * ETH_GSTRING_LEN, 479 sprintf(data + (index++) * ETH_GSTRING_LEN,
479 "rx%d_bytes", i); 480 "rx%d_bytes", i);
481 sprintf(data + (index++) * ETH_GSTRING_LEN,
482 "rx%d_dropped", i);
480 } 483 }
481 break; 484 break;
482 case ETH_SS_PRIV_FLAGS: 485 case ETH_SS_PRIV_FLAGS:
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c
index 3904b5fc0b7c..20b6c2e678b8 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c
@@ -158,6 +158,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
158 u64 in_mod = reset << 8 | port; 158 u64 in_mod = reset << 8 | port;
159 int err; 159 int err;
160 int i, counter_index; 160 int i, counter_index;
161 unsigned long sw_rx_dropped = 0;
161 162
162 mailbox = mlx4_alloc_cmd_mailbox(mdev->dev); 163 mailbox = mlx4_alloc_cmd_mailbox(mdev->dev);
163 if (IS_ERR(mailbox)) 164 if (IS_ERR(mailbox))
@@ -180,6 +181,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
180 for (i = 0; i < priv->rx_ring_num; i++) { 181 for (i = 0; i < priv->rx_ring_num; i++) {
181 stats->rx_packets += priv->rx_ring[i]->packets; 182 stats->rx_packets += priv->rx_ring[i]->packets;
182 stats->rx_bytes += priv->rx_ring[i]->bytes; 183 stats->rx_bytes += priv->rx_ring[i]->bytes;
184 sw_rx_dropped += priv->rx_ring[i]->dropped;
183 priv->port_stats.rx_chksum_good += priv->rx_ring[i]->csum_ok; 185 priv->port_stats.rx_chksum_good += priv->rx_ring[i]->csum_ok;
184 priv->port_stats.rx_chksum_none += priv->rx_ring[i]->csum_none; 186 priv->port_stats.rx_chksum_none += priv->rx_ring[i]->csum_none;
185 priv->port_stats.rx_chksum_complete += priv->rx_ring[i]->csum_complete; 187 priv->port_stats.rx_chksum_complete += priv->rx_ring[i]->csum_complete;
@@ -236,7 +238,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
236 &mlx4_en_stats->MCAST_prio_1, 238 &mlx4_en_stats->MCAST_prio_1,
237 NUM_PRIORITIES); 239 NUM_PRIORITIES);
238 stats->collisions = 0; 240 stats->collisions = 0;
239 stats->rx_dropped = be32_to_cpu(mlx4_en_stats->RDROP); 241 stats->rx_dropped = be32_to_cpu(mlx4_en_stats->RDROP) +
242 sw_rx_dropped;
240 stats->rx_length_errors = be32_to_cpu(mlx4_en_stats->RdropLength); 243 stats->rx_length_errors = be32_to_cpu(mlx4_en_stats->RdropLength);
241 stats->rx_over_errors = 0; 244 stats->rx_over_errors = 0;
242 stats->rx_crc_errors = be32_to_cpu(mlx4_en_stats->RCRC); 245 stats->rx_crc_errors = be32_to_cpu(mlx4_en_stats->RCRC);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 7d25bc9c1b22..b723e3bcab39 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -943,7 +943,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
943 /* GRO not possible, complete processing here */ 943 /* GRO not possible, complete processing here */
944 skb = mlx4_en_rx_skb(priv, rx_desc, frags, length); 944 skb = mlx4_en_rx_skb(priv, rx_desc, frags, length);
945 if (!skb) { 945 if (!skb) {
946 priv->stats.rx_dropped++; 946 ring->dropped++;
947 goto next; 947 goto next;
948 } 948 }
949 949
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index d12ab6a73344..63b1aeae2c03 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -323,6 +323,7 @@ struct mlx4_en_rx_ring {
323 unsigned long csum_ok; 323 unsigned long csum_ok;
324 unsigned long csum_none; 324 unsigned long csum_none;
325 unsigned long csum_complete; 325 unsigned long csum_complete;
326 unsigned long dropped;
326 int hwtstamp_rx_filter; 327 int hwtstamp_rx_filter;
327 cpumask_var_t affinity_mask; 328 cpumask_var_t affinity_mask;
328}; 329};