From de58db5f0d950c56f2fe488d04fdf376dd5ad2a6 Mon Sep 17 00:00:00 2001 From: Gal Pressman Date: Mon, 4 May 2026 21:37:00 +0300 Subject: [PATCH 1/5] net/mlx5e: Count full skb length in TSO byte counters The tso_bytes and tso_inner_bytes counters currently subtract the header length from skb->len, counting only the payload. This is confusing and doesn't align with the behavior of other _bytes counters in the driver. Report the full skb length to align with this expectation. This also makes our behavior consistent with the netdev stats API and virtio spec definition. Signed-off-by: Gal Pressman Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260504183704.272322-2-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index 9f0272649fa1..0b5e600e4a6a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c @@ -164,14 +164,14 @@ mlx5e_tx_get_gso_ihs(struct mlx5e_txqsq *sq, struct sk_buff *skb) else ihs = skb_inner_tcp_all_headers(skb); stats->tso_inner_packets++; - stats->tso_inner_bytes += skb->len - ihs; + stats->tso_inner_bytes += skb->len; } else { if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) ihs = skb_transport_offset(skb) + sizeof(struct udphdr); else ihs = skb_tcp_all_headers(skb); stats->tso_packets++; - stats->tso_bytes += skb->len - ihs; + stats->tso_bytes += skb->len; } return ihs; From 38e7e4a209c250cff438ee9ac7607515555eeb3f Mon Sep 17 00:00:00 2001 From: Gal Pressman Date: Mon, 4 May 2026 21:37:01 +0300 Subject: [PATCH 2/5] net/mlx5e: Report hw_gso_packets and hw_gso_bytes netdev stats Report hardware GSO statistics via the netdev queue stats API by mapping the existing TSO counters to hw_gso_packets and hw_gso_bytes fields. Signed-off-by: Gal Pressman Reviewed-by: Dragos Tatulea Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260504183704.272322-3-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 5a46870c4b74..f3a936d5a62d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -5518,6 +5518,10 @@ static void mlx5e_get_queue_stats_tx(struct net_device *dev, int i, sq_stats = priv->txq2sq_stats[i]; stats->packets = sq_stats->packets; stats->bytes = sq_stats->bytes; + + stats->hw_gso_packets = + sq_stats->tso_packets + sq_stats->tso_inner_packets; + stats->hw_gso_bytes = sq_stats->tso_bytes + sq_stats->tso_inner_bytes; } static void mlx5e_get_base_stats(struct net_device *dev, @@ -5557,6 +5561,8 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->packets = 0; tx->bytes = 0; + tx->hw_gso_packets = 0; + tx->hw_gso_bytes = 0; for (i = 0; i < priv->stats_nch; i++) { struct mlx5e_channel_stats *channel_stats = priv->channel_stats[i]; @@ -5583,6 +5589,10 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->packets += sq_stats->packets; tx->bytes += sq_stats->bytes; + tx->hw_gso_packets += sq_stats->tso_packets + + sq_stats->tso_inner_packets; + tx->hw_gso_bytes += sq_stats->tso_bytes + + sq_stats->tso_inner_bytes; } } @@ -5601,6 +5611,10 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->packets += sq_stats->packets; tx->bytes += sq_stats->bytes; + tx->hw_gso_packets += sq_stats->tso_packets + + sq_stats->tso_inner_packets; + tx->hw_gso_bytes += sq_stats->tso_bytes + + sq_stats->tso_inner_bytes; } } } From 97b96c3b47d12a99a81187d544ae0a3a6dedacb7 Mon Sep 17 00:00:00 2001 From: Gal Pressman Date: Mon, 4 May 2026 21:37:02 +0300 Subject: [PATCH 3/5] net/mlx5e: Report RX HW-GRO netdev stats Report RX hardware GRO statistics via the netdev queue stats API by mapping the existing gro_packets, gro_bytes and gro_skbs counters to the hw_gro_wire_packets, hw_gro_wire_bytes and hw_gro_packets fields. Signed-off-by: Gal Pressman Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260504183704.272322-4-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index f3a936d5a62d..a8b55af21ec0 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -5500,6 +5500,11 @@ static void mlx5e_get_queue_stats_rx(struct net_device *dev, int i, stats->bytes = rq_stats->bytes + xskrq_stats->bytes; stats->alloc_fail = rq_stats->buff_alloc_err + xskrq_stats->buff_alloc_err; + + stats->hw_gro_packets = rq_stats->gro_skbs + xskrq_stats->gro_skbs; + stats->hw_gro_wire_packets = + rq_stats->gro_packets + xskrq_stats->gro_packets; + stats->hw_gro_wire_bytes = rq_stats->gro_bytes + xskrq_stats->gro_bytes; } static void mlx5e_get_queue_stats_tx(struct net_device *dev, int i, @@ -5536,6 +5541,9 @@ static void mlx5e_get_base_stats(struct net_device *dev, rx->packets = 0; rx->bytes = 0; rx->alloc_fail = 0; + rx->hw_gro_packets = 0; + rx->hw_gro_wire_packets = 0; + rx->hw_gro_wire_bytes = 0; for (i = priv->channels.params.num_channels; i < priv->stats_nch; i++) { struct netdev_queue_stats_rx rx_i = {0}; @@ -5545,6 +5553,9 @@ static void mlx5e_get_base_stats(struct net_device *dev, rx->packets += rx_i.packets; rx->bytes += rx_i.bytes; rx->alloc_fail += rx_i.alloc_fail; + rx->hw_gro_packets += rx_i.hw_gro_packets; + rx->hw_gro_wire_packets += rx_i.hw_gro_wire_packets; + rx->hw_gro_wire_bytes += rx_i.hw_gro_wire_bytes; } /* always report PTP RX stats from base as there is no @@ -5556,6 +5567,9 @@ static void mlx5e_get_base_stats(struct net_device *dev, rx->packets += rq_stats->packets; rx->bytes += rq_stats->bytes; + rx->hw_gro_packets += rq_stats->gro_skbs; + rx->hw_gro_wire_packets += rq_stats->gro_packets; + rx->hw_gro_wire_bytes += rq_stats->gro_bytes; } } From d8e5b2f7a5c314fc9ff3a342d667a42165845c21 Mon Sep 17 00:00:00 2001 From: Gal Pressman Date: Mon, 4 May 2026 21:37:03 +0300 Subject: [PATCH 4/5] net/mlx5e: Report TX csum_none netdev stat Report TX csum_none statistic via the netdev queue stats API by mapping the existing csum_none counter to the csum_none field. Signed-off-by: Gal Pressman Reviewed-by: Dragos Tatulea Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260504183704.272322-5-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index a8b55af21ec0..6fc354a7c5c6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -5527,6 +5527,8 @@ static void mlx5e_get_queue_stats_tx(struct net_device *dev, int i, stats->hw_gso_packets = sq_stats->tso_packets + sq_stats->tso_inner_packets; stats->hw_gso_bytes = sq_stats->tso_bytes + sq_stats->tso_inner_bytes; + + stats->csum_none = sq_stats->csum_none; } static void mlx5e_get_base_stats(struct net_device *dev, @@ -5577,6 +5579,7 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->bytes = 0; tx->hw_gso_packets = 0; tx->hw_gso_bytes = 0; + tx->csum_none = 0; for (i = 0; i < priv->stats_nch; i++) { struct mlx5e_channel_stats *channel_stats = priv->channel_stats[i]; @@ -5607,6 +5610,7 @@ static void mlx5e_get_base_stats(struct net_device *dev, sq_stats->tso_inner_packets; tx->hw_gso_bytes += sq_stats->tso_bytes + sq_stats->tso_inner_bytes; + tx->csum_none += sq_stats->csum_none; } } @@ -5629,6 +5633,7 @@ static void mlx5e_get_base_stats(struct net_device *dev, sq_stats->tso_inner_packets; tx->hw_gso_bytes += sq_stats->tso_bytes + sq_stats->tso_inner_bytes; + tx->csum_none += sq_stats->csum_none; } } } From 32b7e50e284a816389831bef142de4f7d2d691ee Mon Sep 17 00:00:00 2001 From: Gal Pressman Date: Mon, 4 May 2026 21:37:04 +0300 Subject: [PATCH 5/5] net/mlx5e: Report stop and wake TX queue stats Report TX queue stop and wake statistics via the netdev queue stats API by mapping the existing stopped and wake counters to the stop and wake fields. Signed-off-by: Gal Pressman Reviewed-by: Dragos Tatulea Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260504183704.272322-6-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 6fc354a7c5c6..469e066dc432 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -5529,6 +5529,9 @@ static void mlx5e_get_queue_stats_tx(struct net_device *dev, int i, stats->hw_gso_bytes = sq_stats->tso_bytes + sq_stats->tso_inner_bytes; stats->csum_none = sq_stats->csum_none; + + stats->stop = sq_stats->stopped; + stats->wake = sq_stats->wake; } static void mlx5e_get_base_stats(struct net_device *dev, @@ -5580,6 +5583,8 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->hw_gso_packets = 0; tx->hw_gso_bytes = 0; tx->csum_none = 0; + tx->stop = 0; + tx->wake = 0; for (i = 0; i < priv->stats_nch; i++) { struct mlx5e_channel_stats *channel_stats = priv->channel_stats[i]; @@ -5611,6 +5616,8 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->hw_gso_bytes += sq_stats->tso_bytes + sq_stats->tso_inner_bytes; tx->csum_none += sq_stats->csum_none; + tx->stop += sq_stats->stopped; + tx->wake += sq_stats->wake; } } @@ -5634,6 +5641,8 @@ static void mlx5e_get_base_stats(struct net_device *dev, tx->hw_gso_bytes += sq_stats->tso_bytes + sq_stats->tso_inner_bytes; tx->csum_none += sq_stats->csum_none; + tx->stop += sq_stats->stopped; + tx->wake += sq_stats->wake; } } }