diff options
| author | Eric Dumazet <edumazet@google.com> | 2014-10-02 11:24:21 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-10-04 20:04:14 -0400 |
| commit | 9fab426de78140dc5cb0b85bbee6042c9c3d5ca5 (patch) | |
| tree | 191460414031ac67841797f90acece7b79b3d6bb | |
| parent | 6106253e69413785b29b9bfb493e2544c70461e7 (diff) | |
mlx4: add a new xmit_more counter
ethtool -S reports a new counter, tracking number of time doorbell
was not triggered, because skb->xmit_more was set.
$ ethtool -S eth0 | egrep "tx_packet|xmit_more"
tx_packets: 2413288400
xmit_more: 666121277
I merged the tso_packet false sharing avoidance in this patch as well.
Signed-off-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 | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_port.c | 17 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_tx.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 5 |
4 files changed, 19 insertions, 8 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 35ff2925110a..42c9f8b09a6e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
| @@ -112,6 +112,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = { | |||
| 112 | 112 | ||
| 113 | /* port statistics */ | 113 | /* port statistics */ |
| 114 | "tso_packets", | 114 | "tso_packets", |
| 115 | "xmit_more", | ||
| 115 | "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed", | 116 | "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed", |
| 116 | "rx_csum_good", "rx_csum_none", "tx_chksum_offload", | 117 | "rx_csum_good", "rx_csum_none", "tx_chksum_offload", |
| 117 | 118 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c index c2cfb05e7290..0a0261d128b9 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_port.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c | |||
| @@ -150,14 +150,19 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
| 150 | priv->port_stats.tx_chksum_offload = 0; | 150 | priv->port_stats.tx_chksum_offload = 0; |
| 151 | priv->port_stats.queue_stopped = 0; | 151 | priv->port_stats.queue_stopped = 0; |
| 152 | priv->port_stats.wake_queue = 0; | 152 | priv->port_stats.wake_queue = 0; |
| 153 | priv->port_stats.tso_packets = 0; | ||
| 154 | priv->port_stats.xmit_more = 0; | ||
| 153 | 155 | ||
| 154 | for (i = 0; i < priv->tx_ring_num; i++) { | 156 | for (i = 0; i < priv->tx_ring_num; i++) { |
| 155 | stats->tx_packets += priv->tx_ring[i]->packets; | 157 | const struct mlx4_en_tx_ring *ring = priv->tx_ring[i]; |
| 156 | stats->tx_bytes += priv->tx_ring[i]->bytes; | 158 | |
| 157 | priv->port_stats.tx_chksum_offload += priv->tx_ring[i]->tx_csum; | 159 | stats->tx_packets += ring->packets; |
| 158 | priv->port_stats.queue_stopped += | 160 | stats->tx_bytes += ring->bytes; |
| 159 | priv->tx_ring[i]->queue_stopped; | 161 | priv->port_stats.tx_chksum_offload += ring->tx_csum; |
| 160 | priv->port_stats.wake_queue += priv->tx_ring[i]->wake_queue; | 162 | priv->port_stats.queue_stopped += ring->queue_stopped; |
| 163 | priv->port_stats.wake_queue += ring->wake_queue; | ||
| 164 | priv->port_stats.tso_packets += ring->tso_packets; | ||
| 165 | priv->port_stats.xmit_more += ring->xmit_more; | ||
| 161 | } | 166 | } |
| 162 | 167 | ||
| 163 | stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) + | 168 | stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) + |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index adedc47e947d..0c501253fdab 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
| @@ -840,7 +840,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 840 | * note that we already verified that it is linear */ | 840 | * note that we already verified that it is linear */ |
| 841 | memcpy(tx_desc->lso.header, skb->data, lso_header_size); | 841 | memcpy(tx_desc->lso.header, skb->data, lso_header_size); |
| 842 | 842 | ||
| 843 | priv->port_stats.tso_packets++; | 843 | ring->tso_packets++; |
| 844 | i = ((skb->len - lso_header_size) / skb_shinfo(skb)->gso_size) + | 844 | i = ((skb->len - lso_header_size) / skb_shinfo(skb)->gso_size) + |
| 845 | !!((skb->len - lso_header_size) % skb_shinfo(skb)->gso_size); | 845 | !!((skb->len - lso_header_size) % skb_shinfo(skb)->gso_size); |
| 846 | tx_info->nr_bytes = skb->len + (i - 1) * lso_header_size; | 846 | tx_info->nr_bytes = skb->len + (i - 1) * lso_header_size; |
| @@ -910,6 +910,8 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 910 | wmb(); | 910 | wmb(); |
| 911 | iowrite32be(ring->doorbell_qpn, | 911 | iowrite32be(ring->doorbell_qpn, |
| 912 | ring->bf.uar->map + MLX4_SEND_DOORBELL); | 912 | ring->bf.uar->map + MLX4_SEND_DOORBELL); |
| 913 | } else { | ||
| 914 | ring->xmit_more++; | ||
| 913 | } | 915 | } |
| 914 | } | 916 | } |
| 915 | 917 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 6a4fc2394cf2..84c9d5dbfa4f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -279,6 +279,8 @@ struct mlx4_en_tx_ring { | |||
| 279 | unsigned long tx_csum; | 279 | unsigned long tx_csum; |
| 280 | unsigned long queue_stopped; | 280 | unsigned long queue_stopped; |
| 281 | unsigned long wake_queue; | 281 | unsigned long wake_queue; |
| 282 | unsigned long tso_packets; | ||
| 283 | unsigned long xmit_more; | ||
| 282 | struct mlx4_bf bf; | 284 | struct mlx4_bf bf; |
| 283 | bool bf_enabled; | 285 | bool bf_enabled; |
| 284 | bool bf_alloced; | 286 | bool bf_alloced; |
| @@ -426,6 +428,7 @@ struct mlx4_en_pkt_stats { | |||
| 426 | 428 | ||
| 427 | struct mlx4_en_port_stats { | 429 | struct mlx4_en_port_stats { |
| 428 | unsigned long tso_packets; | 430 | unsigned long tso_packets; |
| 431 | unsigned long xmit_more; | ||
| 429 | unsigned long queue_stopped; | 432 | unsigned long queue_stopped; |
| 430 | unsigned long wake_queue; | 433 | unsigned long wake_queue; |
| 431 | unsigned long tx_timeout; | 434 | unsigned long tx_timeout; |
| @@ -433,7 +436,7 @@ struct mlx4_en_port_stats { | |||
| 433 | unsigned long rx_chksum_good; | 436 | unsigned long rx_chksum_good; |
| 434 | unsigned long rx_chksum_none; | 437 | unsigned long rx_chksum_none; |
| 435 | unsigned long tx_chksum_offload; | 438 | unsigned long tx_chksum_offload; |
| 436 | #define NUM_PORT_STATS 8 | 439 | #define NUM_PORT_STATS 9 |
| 437 | }; | 440 | }; |
| 438 | 441 | ||
| 439 | struct mlx4_en_perf_stats { | 442 | struct mlx4_en_perf_stats { |
