Skip to content

Commit c7db85d

Browse files
ffyuandakuba-moo
authored andcommitted
gve: Correct ethtool rx_dropped calculation
The gve driver's "rx_dropped" statistic, exposed via `ethtool -S`, incorrectly includes `rx_buf_alloc_fail` counts. These failures represent an inability to allocate receive buffers, not true packet drops where a received packet is discarded. This misrepresentation can lead to inaccurate diagnostics. This patch rectifies the ethtool "rx_dropped" calculation. It removes `rx_buf_alloc_fail` from the total and adds `xdp_tx_errors` and `xdp_redirect_errors`, which represent legitimate packet drops within the XDP path. Cc: stable@vger.kernel.org Fixes: 433e274 ("gve: Add stats for gve.") Signed-off-by: Max Yuan <maxyuan@google.com> Reviewed-by: Jordan Rhee <jordanrhee@google.com> Reviewed-by: Joshua Washington <joshwash@google.com> Reviewed-by: Matt Olson <maolson@google.com> Signed-off-by: Harshitha Ramamurthy <hramamurthy@google.com> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Link: https://patch.msgid.link/20260202193925.3106272-3-hramamurthy@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 7b9ebcc commit c7db85d

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

drivers/net/ethernet/google/gve/gve_ethtool.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,11 @@ gve_get_ethtool_stats(struct net_device *netdev,
152152
u64 tmp_rx_pkts, tmp_rx_hsplit_pkt, tmp_rx_bytes, tmp_rx_hsplit_bytes,
153153
tmp_rx_skb_alloc_fail, tmp_rx_buf_alloc_fail,
154154
tmp_rx_desc_err_dropped_pkt, tmp_rx_hsplit_unsplit_pkt,
155-
tmp_tx_pkts, tmp_tx_bytes;
155+
tmp_tx_pkts, tmp_tx_bytes,
156+
tmp_xdp_tx_errors, tmp_xdp_redirect_errors;
156157
u64 rx_buf_alloc_fail, rx_desc_err_dropped_pkt, rx_hsplit_unsplit_pkt,
157158
rx_pkts, rx_hsplit_pkt, rx_skb_alloc_fail, rx_bytes, tx_pkts, tx_bytes,
158-
tx_dropped;
159+
tx_dropped, xdp_tx_errors, xdp_redirect_errors;
159160
int rx_base_stats_idx, max_rx_stats_idx, max_tx_stats_idx;
160161
int stats_idx, stats_region_len, nic_stats_len;
161162
struct stats *report_stats;
@@ -199,6 +200,7 @@ gve_get_ethtool_stats(struct net_device *netdev,
199200
for (rx_pkts = 0, rx_bytes = 0, rx_hsplit_pkt = 0,
200201
rx_skb_alloc_fail = 0, rx_buf_alloc_fail = 0,
201202
rx_desc_err_dropped_pkt = 0, rx_hsplit_unsplit_pkt = 0,
203+
xdp_tx_errors = 0, xdp_redirect_errors = 0,
202204
ring = 0;
203205
ring < priv->rx_cfg.num_queues; ring++) {
204206
if (priv->rx) {
@@ -216,6 +218,9 @@ gve_get_ethtool_stats(struct net_device *netdev,
216218
rx->rx_desc_err_dropped_pkt;
217219
tmp_rx_hsplit_unsplit_pkt =
218220
rx->rx_hsplit_unsplit_pkt;
221+
tmp_xdp_tx_errors = rx->xdp_tx_errors;
222+
tmp_xdp_redirect_errors =
223+
rx->xdp_redirect_errors;
219224
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
220225
start));
221226
rx_pkts += tmp_rx_pkts;
@@ -225,6 +230,8 @@ gve_get_ethtool_stats(struct net_device *netdev,
225230
rx_buf_alloc_fail += tmp_rx_buf_alloc_fail;
226231
rx_desc_err_dropped_pkt += tmp_rx_desc_err_dropped_pkt;
227232
rx_hsplit_unsplit_pkt += tmp_rx_hsplit_unsplit_pkt;
233+
xdp_tx_errors += tmp_xdp_tx_errors;
234+
xdp_redirect_errors += tmp_xdp_redirect_errors;
228235
}
229236
}
230237
for (tx_pkts = 0, tx_bytes = 0, tx_dropped = 0, ring = 0;
@@ -250,8 +257,8 @@ gve_get_ethtool_stats(struct net_device *netdev,
250257
data[i++] = rx_bytes;
251258
data[i++] = tx_bytes;
252259
/* total rx dropped packets */
253-
data[i++] = rx_skb_alloc_fail + rx_buf_alloc_fail +
254-
rx_desc_err_dropped_pkt;
260+
data[i++] = rx_skb_alloc_fail + rx_desc_err_dropped_pkt +
261+
xdp_tx_errors + xdp_redirect_errors;
255262
data[i++] = tx_dropped;
256263
data[i++] = priv->tx_timeo_cnt;
257264
data[i++] = rx_skb_alloc_fail;
@@ -330,6 +337,9 @@ gve_get_ethtool_stats(struct net_device *netdev,
330337
tmp_rx_buf_alloc_fail = rx->rx_buf_alloc_fail;
331338
tmp_rx_desc_err_dropped_pkt =
332339
rx->rx_desc_err_dropped_pkt;
340+
tmp_xdp_tx_errors = rx->xdp_tx_errors;
341+
tmp_xdp_redirect_errors =
342+
rx->xdp_redirect_errors;
333343
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
334344
start));
335345
data[i++] = tmp_rx_bytes;
@@ -340,8 +350,9 @@ gve_get_ethtool_stats(struct net_device *netdev,
340350
data[i++] = rx->rx_frag_alloc_cnt;
341351
/* rx dropped packets */
342352
data[i++] = tmp_rx_skb_alloc_fail +
343-
tmp_rx_buf_alloc_fail +
344-
tmp_rx_desc_err_dropped_pkt;
353+
tmp_rx_desc_err_dropped_pkt +
354+
tmp_xdp_tx_errors +
355+
tmp_xdp_redirect_errors;
345356
data[i++] = rx->rx_copybreak_pkt;
346357
data[i++] = rx->rx_copied_pkt;
347358
/* stats from NIC */

0 commit comments

Comments
 (0)