Commit 9fab426d authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6106253e
...@@ -112,6 +112,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = { ...@@ -112,6 +112,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
/* port statistics */ /* port statistics */
"tso_packets", "tso_packets",
"xmit_more",
"queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed", "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed",
"rx_csum_good", "rx_csum_none", "tx_chksum_offload", "rx_csum_good", "rx_csum_none", "tx_chksum_offload",
......
...@@ -150,14 +150,19 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) ...@@ -150,14 +150,19 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
priv->port_stats.tx_chksum_offload = 0; priv->port_stats.tx_chksum_offload = 0;
priv->port_stats.queue_stopped = 0; priv->port_stats.queue_stopped = 0;
priv->port_stats.wake_queue = 0; priv->port_stats.wake_queue = 0;
priv->port_stats.tso_packets = 0;
priv->port_stats.xmit_more = 0;
for (i = 0; i < priv->tx_ring_num; i++) { for (i = 0; i < priv->tx_ring_num; i++) {
stats->tx_packets += priv->tx_ring[i]->packets; const struct mlx4_en_tx_ring *ring = priv->tx_ring[i];
stats->tx_bytes += priv->tx_ring[i]->bytes;
priv->port_stats.tx_chksum_offload += priv->tx_ring[i]->tx_csum; stats->tx_packets += ring->packets;
priv->port_stats.queue_stopped += stats->tx_bytes += ring->bytes;
priv->tx_ring[i]->queue_stopped; priv->port_stats.tx_chksum_offload += ring->tx_csum;
priv->port_stats.wake_queue += priv->tx_ring[i]->wake_queue; priv->port_stats.queue_stopped += ring->queue_stopped;
priv->port_stats.wake_queue += ring->wake_queue;
priv->port_stats.tso_packets += ring->tso_packets;
priv->port_stats.xmit_more += ring->xmit_more;
} }
stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) + stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) +
......
...@@ -840,7 +840,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -840,7 +840,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
* note that we already verified that it is linear */ * note that we already verified that it is linear */
memcpy(tx_desc->lso.header, skb->data, lso_header_size); memcpy(tx_desc->lso.header, skb->data, lso_header_size);
priv->port_stats.tso_packets++; ring->tso_packets++;
i = ((skb->len - lso_header_size) / skb_shinfo(skb)->gso_size) + i = ((skb->len - lso_header_size) / skb_shinfo(skb)->gso_size) +
!!((skb->len - lso_header_size) % skb_shinfo(skb)->gso_size); !!((skb->len - lso_header_size) % skb_shinfo(skb)->gso_size);
tx_info->nr_bytes = skb->len + (i - 1) * lso_header_size; 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,6 +910,8 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
wmb(); wmb();
iowrite32be(ring->doorbell_qpn, iowrite32be(ring->doorbell_qpn,
ring->bf.uar->map + MLX4_SEND_DOORBELL); ring->bf.uar->map + MLX4_SEND_DOORBELL);
} else {
ring->xmit_more++;
} }
} }
......
...@@ -279,6 +279,8 @@ struct mlx4_en_tx_ring { ...@@ -279,6 +279,8 @@ struct mlx4_en_tx_ring {
unsigned long tx_csum; unsigned long tx_csum;
unsigned long queue_stopped; unsigned long queue_stopped;
unsigned long wake_queue; unsigned long wake_queue;
unsigned long tso_packets;
unsigned long xmit_more;
struct mlx4_bf bf; struct mlx4_bf bf;
bool bf_enabled; bool bf_enabled;
bool bf_alloced; bool bf_alloced;
...@@ -426,6 +428,7 @@ struct mlx4_en_pkt_stats { ...@@ -426,6 +428,7 @@ struct mlx4_en_pkt_stats {
struct mlx4_en_port_stats { struct mlx4_en_port_stats {
unsigned long tso_packets; unsigned long tso_packets;
unsigned long xmit_more;
unsigned long queue_stopped; unsigned long queue_stopped;
unsigned long wake_queue; unsigned long wake_queue;
unsigned long tx_timeout; unsigned long tx_timeout;
...@@ -433,7 +436,7 @@ struct mlx4_en_port_stats { ...@@ -433,7 +436,7 @@ struct mlx4_en_port_stats {
unsigned long rx_chksum_good; unsigned long rx_chksum_good;
unsigned long rx_chksum_none; unsigned long rx_chksum_none;
unsigned long tx_chksum_offload; unsigned long tx_chksum_offload;
#define NUM_PORT_STATS 8 #define NUM_PORT_STATS 9
}; };
struct mlx4_en_perf_stats { struct mlx4_en_perf_stats {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment