Track the number of GSO and wire packets transmitted and expose the counters via the queue stats. Signed-off-by: Paolo Abeni --- drivers/net/ethernet/intel/i40e/i40e.h | 2 ++ drivers/net/ethernet/intel/i40e/i40e_main.c | 13 ++++++++++++- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 8 +++++++- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 ++ drivers/net/ethernet/intel/i40e/i40e_txrx_common.h | 6 +++++- drivers/net/ethernet/intel/i40e/i40e_xsk.c | 2 +- 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index fe642c464e9c..4a88c7d69f61 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -845,6 +845,8 @@ struct i40e_vsi { u64 tx_stopped_base; u64 tx_bytes; u64 tx_packets; + u64 tx_gso_packets; + u64 tx_gso_wire_packets; u64 rx_buf_failed; u64 rx_page_failed; u64 rx_page_reuse; diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 0d0b3619ec56..7c2af738ccc5 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -11695,6 +11695,8 @@ static void i40e_vsi_aggregate_tx_counters(struct i40e_vsi *vsi, vsi->tx_bytes += tx_ring->stats.bytes; vsi->tx_packets += tx_ring->stats.packets; + vsi->tx_gso_packets += tx_ring->tx_stats.tx_gso_packets; + vsi->tx_gso_wire_packets += tx_ring->tx_stats.tx_gso_wire_packets; } static void i40e_vsi_aggregate_rx_counters(struct i40e_vsi *vsi, @@ -13684,6 +13686,8 @@ static void i40e_zero_tx_ring_stats(struct netdev_queue_stats_tx *tx) { tx->bytes = 0; tx->packets = 0; + tx->hw_gso_packets = 0; + tx->hw_gso_wire_packets = 0; tx->stop = 0; tx->wake = 0; tx->hw_drops = 0; @@ -13692,17 +13696,21 @@ static void i40e_zero_tx_ring_stats(struct netdev_queue_stats_tx *tx) static void i40e_add_tx_ring_stats(struct i40e_ring *tx_ring, struct netdev_queue_stats_tx *tx) { - u64 bytes, packets; + u64 bytes, packets, gso_packets, gso_wire_packets; unsigned int start; do { start = u64_stats_fetch_begin(&tx_ring->syncp); bytes = tx_ring->stats.bytes; packets = tx_ring->stats.packets; + gso_packets = tx_ring->tx_stats.tx_gso_packets; + gso_wire_packets = tx_ring->tx_stats.tx_gso_wire_packets; } while (u64_stats_fetch_retry(&tx_ring->syncp, start)); tx->bytes += bytes; tx->packets += packets; + tx->hw_gso_packets += gso_packets; + tx->hw_gso_wire_packets += gso_wire_packets; tx->stop += tx_ring->tx_stats.tx_stopped; tx->wake += tx_ring->tx_stats.restart_queue; @@ -13743,6 +13751,9 @@ static void i40e_get_base_stats(struct net_device *dev, tx->bytes = vsi->tx_bytes; tx->packets = vsi->tx_packets; + tx->hw_gso_packets = vsi->tx_gso_packets; + tx->hw_gso_wire_packets = vsi->tx_gso_wire_packets; + tx->wake = vsi->tx_restart_base; tx->stop = vsi->tx_stopped_base; tx->hw_drops = vsi->tx_busy_base; diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 894f2d06d39d..ec61cc43ae39 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -928,6 +928,7 @@ static bool i40e_clean_tx_irq(struct i40e_vsi *vsi, struct i40e_ring *tx_ring, int napi_budget, unsigned int *tx_cleaned) { + unsigned int total_gso_packets = 0, total_gso_wire_packets = 0; int i = tx_ring->next_to_clean; struct i40e_tx_buffer *tx_buf; struct i40e_tx_desc *tx_head; @@ -959,6 +960,10 @@ static bool i40e_clean_tx_irq(struct i40e_vsi *vsi, /* update the statistics for this packet */ total_bytes += tx_buf->bytecount; total_packets += tx_buf->gso_segs; + if (tx_buf->gso_segs > 1) { + total_gso_packets++; + total_gso_wire_packets += tx_buf->gso_segs; + } /* free the skb/XDP data */ if (ring_is_xdp(tx_ring)) @@ -1018,7 +1023,8 @@ static bool i40e_clean_tx_irq(struct i40e_vsi *vsi, i += tx_ring->count; tx_ring->next_to_clean = i; - i40e_update_tx_stats(tx_ring, total_packets, total_bytes); + i40e_update_tx_stats(tx_ring, total_packets, total_bytes, + total_gso_packets, total_gso_wire_packets); i40e_arm_wb(tx_ring, vsi, budget); if (ring_is_xdp(tx_ring)) diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h index 1e5fd63d47f4..15c608378467 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h @@ -295,6 +295,8 @@ struct i40e_tx_queue_stats { u64 tx_linearize; u64 tx_force_wb; u64 tx_stopped; + u64 tx_gso_packets; + u64 tx_gso_wire_packets; int prev_pkt_ctr; }; diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h b/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h index e26807fd2123..24220594ff1a 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h @@ -45,11 +45,15 @@ static inline __le64 build_ctob(u32 td_cmd, u32 td_offset, unsigned int size, **/ static inline void i40e_update_tx_stats(struct i40e_ring *tx_ring, unsigned int total_packets, - unsigned int total_bytes) + unsigned int total_bytes, + unsigned int total_gso, + unsigned int total_gso_wire) { u64_stats_update_begin(&tx_ring->syncp); tx_ring->stats.bytes += total_bytes; tx_ring->stats.packets += total_packets; + tx_ring->tx_stats.tx_gso_packets += total_gso; + tx_ring->tx_stats.tx_gso_wire_packets += total_gso_wire; u64_stats_update_end(&tx_ring->syncp); tx_ring->q_vector->tx.total_bytes += total_bytes; tx_ring->q_vector->tx.total_packets += total_packets; diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c index 9f47388eaba5..c2a465416a33 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c @@ -599,7 +599,7 @@ static bool i40e_xmit_zc(struct i40e_ring *xdp_ring, unsigned int budget) i40e_set_rs_bit(xdp_ring); i40e_xdp_ring_update_tail(xdp_ring); - i40e_update_tx_stats(xdp_ring, nb_pkts, total_bytes); + i40e_update_tx_stats(xdp_ring, nb_pkts, total_bytes, 0, 0); return nb_pkts < budget; } -- 2.53.0