]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: core,vrf: Change pcpu_dstat fields to u64_stats_t
authorJeremy Kerr <jk@codeconstruct.com.au>
Fri, 7 Jun 2024 10:25:24 +0000 (18:25 +0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 12 Jun 2024 02:24:56 +0000 (19:24 -0700)
The pcpu_sw_netstats and pcpu_lstats structs both contain a set of
u64_stats_t fields for individual stats, but pcpu_dstats uses u64s
instead.

Make this consistent by using u64_stats_t across all stats types.

The per-cpu dstats are only used by the vrf driver at present, so update
that driver as part of this change.

Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://lore.kernel.org/r/20240607-dstats-v3-1-cc781fe116f7@codeconstruct.com.au
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/vrf.c
include/linux/netdevice.h

index 3a252ac5dd28a94bffaeec18ca8a25e85934f4ab..5018831b2a7975aac48dd38e30d144d272063899 100644 (file)
@@ -126,8 +126,8 @@ static void vrf_rx_stats(struct net_device *dev, int len)
        struct pcpu_dstats *dstats = this_cpu_ptr(dev->dstats);
 
        u64_stats_update_begin(&dstats->syncp);
-       dstats->rx_packets++;
-       dstats->rx_bytes += len;
+       u64_stats_inc(&dstats->rx_packets);
+       u64_stats_add(&dstats->rx_bytes, len);
        u64_stats_update_end(&dstats->syncp);
 }
 
@@ -150,11 +150,11 @@ static void vrf_get_stats64(struct net_device *dev,
                dstats = per_cpu_ptr(dev->dstats, i);
                do {
                        start = u64_stats_fetch_begin(&dstats->syncp);
-                       tbytes = dstats->tx_bytes;
-                       tpkts = dstats->tx_packets;
-                       tdrops = dstats->tx_drops;
-                       rbytes = dstats->rx_bytes;
-                       rpkts = dstats->rx_packets;
+                       tbytes = u64_stats_read(&dstats->tx_bytes);
+                       tpkts = u64_stats_read(&dstats->tx_packets);
+                       tdrops = u64_stats_read(&dstats->tx_drops);
+                       rbytes = u64_stats_read(&dstats->rx_bytes);
+                       rpkts = u64_stats_read(&dstats->rx_packets);
                } while (u64_stats_fetch_retry(&dstats->syncp, start));
                stats->tx_bytes += tbytes;
                stats->tx_packets += tpkts;
@@ -408,10 +408,15 @@ static int vrf_local_xmit(struct sk_buff *skb, struct net_device *dev,
 
        skb->protocol = eth_type_trans(skb, dev);
 
-       if (likely(__netif_rx(skb) == NET_RX_SUCCESS))
+       if (likely(__netif_rx(skb) == NET_RX_SUCCESS)) {
                vrf_rx_stats(dev, len);
-       else
-               this_cpu_inc(dev->dstats->rx_drops);
+       } else {
+               struct pcpu_dstats *dstats = this_cpu_ptr(dev->dstats);
+
+               u64_stats_update_begin(&dstats->syncp);
+               u64_stats_inc(&dstats->rx_drops);
+               u64_stats_update_end(&dstats->syncp);
+       }
 
        return NETDEV_TX_OK;
 }
@@ -599,19 +604,20 @@ static netdev_tx_t is_ip_tx_frame(struct sk_buff *skb, struct net_device *dev)
 
 static netdev_tx_t vrf_xmit(struct sk_buff *skb, struct net_device *dev)
 {
+       struct pcpu_dstats *dstats = this_cpu_ptr(dev->dstats);
+
        int len = skb->len;
        netdev_tx_t ret = is_ip_tx_frame(skb, dev);
 
+       u64_stats_update_begin(&dstats->syncp);
        if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
-               struct pcpu_dstats *dstats = this_cpu_ptr(dev->dstats);
 
-               u64_stats_update_begin(&dstats->syncp);
-               dstats->tx_packets++;
-               dstats->tx_bytes += len;
-               u64_stats_update_end(&dstats->syncp);
+               u64_stats_inc(&dstats->tx_packets);
+               u64_stats_add(&dstats->tx_bytes, len);
        } else {
-               this_cpu_inc(dev->dstats->tx_drops);
+               u64_stats_inc(&dstats->tx_drops);
        }
+       u64_stats_update_end(&dstats->syncp);
 
        return ret;
 }
index d20c6c99eb887cd45a7cadfcb3491f6bde400deb..f148a01dd1d17902238062fa07a62ed243ef3912 100644 (file)
@@ -2731,12 +2731,12 @@ struct pcpu_sw_netstats {
 } __aligned(4 * sizeof(u64));
 
 struct pcpu_dstats {
-       u64                     rx_packets;
-       u64                     rx_bytes;
-       u64                     rx_drops;
-       u64                     tx_packets;
-       u64                     tx_bytes;
-       u64                     tx_drops;
+       u64_stats_t             rx_packets;
+       u64_stats_t             rx_bytes;
+       u64_stats_t             rx_drops;
+       u64_stats_t             tx_packets;
+       u64_stats_t             tx_bytes;
+       u64_stats_t             tx_drops;
        struct u64_stats_sync   syncp;
 } __aligned(8 * sizeof(u64));