ipvlan: adopt u64_stats_t
authorEric Dumazet <edumazet@google.com>
Wed, 8 Jun 2022 15:46:33 +0000 (08:46 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 10 Jun 2022 04:53:10 +0000 (21:53 -0700)
As explained in commit 316580b69d0a ("u64_stats: provide u64_stats_t type")
we should use u64_stats_t and related accessors to avoid load/store tearing.

Add READ_ONCE() when reading rx_errs & tx_drps.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ipvlan/ipvlan.h
drivers/net/ipvlan/ipvlan_core.c
drivers/net/ipvlan/ipvlan_main.c

index 3837c89..de94921 100644 (file)
@@ -47,11 +47,11 @@ typedef enum {
 } ipvl_hdr_type;
 
 struct ipvl_pcpu_stats {
-       u64                     rx_pkts;
-       u64                     rx_bytes;
-       u64                     rx_mcast;
-       u64                     tx_pkts;
-       u64                     tx_bytes;
+       u64_stats_t             rx_pkts;
+       u64_stats_t             rx_bytes;
+       u64_stats_t             rx_mcast;
+       u64_stats_t             tx_pkts;
+       u64_stats_t             tx_bytes;
        struct u64_stats_sync   syncp;
        u32                     rx_errs;
        u32                     tx_drps;
index 6ffb274..dfeb5b3 100644 (file)
@@ -19,10 +19,10 @@ void ipvlan_count_rx(const struct ipvl_dev *ipvlan,
 
                pcptr = this_cpu_ptr(ipvlan->pcpu_stats);
                u64_stats_update_begin(&pcptr->syncp);
-               pcptr->rx_pkts++;
-               pcptr->rx_bytes += len;
+               u64_stats_inc(&pcptr->rx_pkts);
+               u64_stats_add(&pcptr->rx_bytes, len);
                if (mcast)
-                       pcptr->rx_mcast++;
+                       u64_stats_inc(&pcptr->rx_mcast);
                u64_stats_update_end(&pcptr->syncp);
        } else {
                this_cpu_inc(ipvlan->pcpu_stats->rx_errs);
index aa28a29..49ba8a5 100644 (file)
@@ -224,8 +224,8 @@ static netdev_tx_t ipvlan_start_xmit(struct sk_buff *skb,
                pcptr = this_cpu_ptr(ipvlan->pcpu_stats);
 
                u64_stats_update_begin(&pcptr->syncp);
-               pcptr->tx_pkts++;
-               pcptr->tx_bytes += skblen;
+               u64_stats_inc(&pcptr->tx_pkts);
+               u64_stats_add(&pcptr->tx_bytes, skblen);
                u64_stats_update_end(&pcptr->syncp);
        } else {
                this_cpu_inc(ipvlan->pcpu_stats->tx_drps);
@@ -300,11 +300,11 @@ static void ipvlan_get_stats64(struct net_device *dev,
                        pcptr = per_cpu_ptr(ipvlan->pcpu_stats, idx);
                        do {
                                strt= u64_stats_fetch_begin_irq(&pcptr->syncp);
-                               rx_pkts = pcptr->rx_pkts;
-                               rx_bytes = pcptr->rx_bytes;
-                               rx_mcast = pcptr->rx_mcast;
-                               tx_pkts = pcptr->tx_pkts;
-                               tx_bytes = pcptr->tx_bytes;
+                               rx_pkts = u64_stats_read(&pcptr->rx_pkts);
+                               rx_bytes = u64_stats_read(&pcptr->rx_bytes);
+                               rx_mcast = u64_stats_read(&pcptr->rx_mcast);
+                               tx_pkts = u64_stats_read(&pcptr->tx_pkts);
+                               tx_bytes = u64_stats_read(&pcptr->tx_bytes);
                        } while (u64_stats_fetch_retry_irq(&pcptr->syncp,
                                                           strt));
 
@@ -315,8 +315,8 @@ static void ipvlan_get_stats64(struct net_device *dev,
                        s->tx_bytes += tx_bytes;
 
                        /* u32 values are updated without syncp protection. */
-                       rx_errs += pcptr->rx_errs;
-                       tx_drps += pcptr->tx_drps;
+                       rx_errs += READ_ONCE(pcptr->rx_errs);
+                       tx_drps += READ_ONCE(pcptr->tx_drps);
                }
                s->rx_errors = rx_errs;
                s->rx_dropped = rx_errs;