diff options
author | Eran Ben Elisha <eranbe@mellanox.com> | 2016-04-20 09:01:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-21 15:02:40 -0400 |
commit | d21ed3a311a1031dddc78e9270d1aa9adc8f8a93 (patch) | |
tree | d46447637b7bfd4d00a1fcd0d3fc370dd89a4fb7 | |
parent | 2a500090a4ea2ccd713f3c782a2fb27681bd6e67 (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.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_port.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 |
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 | }; |