Skip to content

Commit 2f57d49

Browse files
edumazetdavem330
authored andcommitted
gve: fix gve_get_stats()
gve_get_stats() can report wrong numbers if/when u64_stats_fetch_retry() returns true. What is needed here is to sample values in temporary variables, and only use them after each loop is ended. Fixes: f5cedc8 ("gve: Add transmit and receive support") Signed-off-by: Eric Dumazet <[email protected]> Cc: Catherine Sullivan <[email protected]> Cc: Sagi Shahar <[email protected]> Cc: Jon Olson <[email protected]> Cc: Willem de Bruijn <[email protected]> Cc: Luigi Rizzo <[email protected]> Cc: Jeroen de Borst <[email protected]> Cc: Tao Liu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d343679 commit 2f57d49

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,28 +41,33 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
4141
{
4242
struct gve_priv *priv = netdev_priv(dev);
4343
unsigned int start;
44+
u64 packets, bytes;
4445
int ring;
4546

4647
if (priv->rx) {
4748
for (ring = 0; ring < priv->rx_cfg.num_queues; ring++) {
4849
do {
4950
start =
5051
u64_stats_fetch_begin(&priv->rx[ring].statss);
51-
s->rx_packets += priv->rx[ring].rpackets;
52-
s->rx_bytes += priv->rx[ring].rbytes;
52+
packets = priv->rx[ring].rpackets;
53+
bytes = priv->rx[ring].rbytes;
5354
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
5455
start));
56+
s->rx_packets += packets;
57+
s->rx_bytes += bytes;
5558
}
5659
}
5760
if (priv->tx) {
5861
for (ring = 0; ring < priv->tx_cfg.num_queues; ring++) {
5962
do {
6063
start =
6164
u64_stats_fetch_begin(&priv->tx[ring].statss);
62-
s->tx_packets += priv->tx[ring].pkt_done;
63-
s->tx_bytes += priv->tx[ring].bytes_done;
65+
packets = priv->tx[ring].pkt_done;
66+
bytes = priv->tx[ring].bytes_done;
6467
} while (u64_stats_fetch_retry(&priv->tx[ring].statss,
6568
start));
69+
s->tx_packets += packets;
70+
s->tx_bytes += bytes;
6671
}
6772
}
6873
}

0 commit comments

Comments
 (0)