vlan: adopt u64_stats_t
authorEric Dumazet <edumazet@google.com>
Wed, 8 Jun 2022 15:46:32 +0000 (08:46 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 10 Jun 2022 04:53:09 +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_errors & tx_dropped.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/macvlan.c
include/linux/if_macvlan.h
include/linux/if_vlan.h
net/8021q/vlan_core.c
net/8021q/vlan_dev.c

index 5b46a65..1080d6e 100644 (file)
@@ -575,8 +575,8 @@ static netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,
 
                pcpu_stats = this_cpu_ptr(vlan->pcpu_stats);
                u64_stats_update_begin(&pcpu_stats->syncp);
-               pcpu_stats->tx_packets++;
-               pcpu_stats->tx_bytes += len;
+               u64_stats_inc(&pcpu_stats->tx_packets);
+               u64_stats_add(&pcpu_stats->tx_bytes, len);
                u64_stats_update_end(&pcpu_stats->syncp);
        } else {
                this_cpu_inc(vlan->pcpu_stats->tx_dropped);
@@ -949,11 +949,11 @@ static void macvlan_dev_get_stats64(struct net_device *dev,
                        p = per_cpu_ptr(vlan->pcpu_stats, i);
                        do {
                                start = u64_stats_fetch_begin_irq(&p->syncp);
-                               rx_packets      = p->rx_packets;
-                               rx_bytes        = p->rx_bytes;
-                               rx_multicast    = p->rx_multicast;
-                               tx_packets      = p->tx_packets;
-                               tx_bytes        = p->tx_bytes;
+                               rx_packets      = u64_stats_read(&p->rx_packets);
+                               rx_bytes        = u64_stats_read(&p->rx_bytes);
+                               rx_multicast    = u64_stats_read(&p->rx_multicast);
+                               tx_packets      = u64_stats_read(&p->tx_packets);
+                               tx_bytes        = u64_stats_read(&p->tx_bytes);
                        } while (u64_stats_fetch_retry_irq(&p->syncp, start));
 
                        stats->rx_packets       += rx_packets;
@@ -964,8 +964,8 @@ static void macvlan_dev_get_stats64(struct net_device *dev,
                        /* rx_errors & tx_dropped are u32, updated
                         * without syncp protection.
                         */
-                       rx_errors       += p->rx_errors;
-                       tx_dropped      += p->tx_dropped;
+                       rx_errors       += READ_ONCE(p->rx_errors);
+                       tx_dropped      += READ_ONCE(p->tx_dropped);
                }
                stats->rx_errors        = rx_errors;
                stats->rx_dropped       = rx_errors;
index b422947..5230251 100644 (file)
@@ -46,10 +46,10 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
 
                pcpu_stats = get_cpu_ptr(vlan->pcpu_stats);
                u64_stats_update_begin(&pcpu_stats->syncp);
-               pcpu_stats->rx_packets++;
-               pcpu_stats->rx_bytes += len;
+               u64_stats_inc(&pcpu_stats->rx_packets);
+               u64_stats_add(&pcpu_stats->rx_bytes, len);
                if (multicast)
-                       pcpu_stats->rx_multicast++;
+                       u64_stats_inc(&pcpu_stats->rx_multicast);
                u64_stats_update_end(&pcpu_stats->syncp);
                put_cpu_ptr(vlan->pcpu_stats);
        } else {
index 2be4dd7..e00c4ee 100644 (file)
@@ -118,11 +118,11 @@ static inline void vlan_drop_rx_stag_filter_info(struct net_device *dev)
  *     @tx_dropped: number of tx drops
  */
 struct vlan_pcpu_stats {
-       u64                     rx_packets;
-       u64                     rx_bytes;
-       u64                     rx_multicast;
-       u64                     tx_packets;
-       u64                     tx_bytes;
+       u64_stats_t             rx_packets;
+       u64_stats_t             rx_bytes;
+       u64_stats_t             rx_multicast;
+       u64_stats_t             tx_packets;
+       u64_stats_t             tx_bytes;
        struct u64_stats_sync   syncp;
        u32                     rx_errors;
        u32                     tx_dropped;
index acf8c79..5aa8144 100644 (file)
@@ -63,10 +63,10 @@ bool vlan_do_receive(struct sk_buff **skbp)
        rx_stats = this_cpu_ptr(vlan_dev_priv(vlan_dev)->vlan_pcpu_stats);
 
        u64_stats_update_begin(&rx_stats->syncp);
-       rx_stats->rx_packets++;
-       rx_stats->rx_bytes += skb->len;
+       u64_stats_inc(&rx_stats->rx_packets);
+       u64_stats_add(&rx_stats->rx_bytes, skb->len);
        if (skb->pkt_type == PACKET_MULTICAST)
-               rx_stats->rx_multicast++;
+               u64_stats_inc(&rx_stats->rx_multicast);
        u64_stats_update_end(&rx_stats->syncp);
 
        return true;
index e3dff2d..035812b 100644 (file)
@@ -128,8 +128,8 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
 
                stats = this_cpu_ptr(vlan->vlan_pcpu_stats);
                u64_stats_update_begin(&stats->syncp);
-               stats->tx_packets++;
-               stats->tx_bytes += len;
+               u64_stats_inc(&stats->tx_packets);
+               u64_stats_add(&stats->tx_bytes, len);
                u64_stats_update_end(&stats->syncp);
        } else {
                this_cpu_inc(vlan->vlan_pcpu_stats->tx_dropped);
@@ -713,11 +713,11 @@ static void vlan_dev_get_stats64(struct net_device *dev,
                p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
                do {
                        start = u64_stats_fetch_begin_irq(&p->syncp);
-                       rxpackets       = p->rx_packets;
-                       rxbytes         = p->rx_bytes;
-                       rxmulticast     = p->rx_multicast;
-                       txpackets       = p->tx_packets;
-                       txbytes         = p->tx_bytes;
+                       rxpackets       = u64_stats_read(&p->rx_packets);
+                       rxbytes         = u64_stats_read(&p->rx_bytes);
+                       rxmulticast     = u64_stats_read(&p->rx_multicast);
+                       txpackets       = u64_stats_read(&p->tx_packets);
+                       txbytes         = u64_stats_read(&p->tx_bytes);
                } while (u64_stats_fetch_retry_irq(&p->syncp, start));
 
                stats->rx_packets       += rxpackets;
@@ -726,8 +726,8 @@ static void vlan_dev_get_stats64(struct net_device *dev,
                stats->tx_packets       += txpackets;
                stats->tx_bytes         += txbytes;
                /* rx_errors & tx_dropped are u32 */
-               rx_errors       += p->rx_errors;
-               tx_dropped      += p->tx_dropped;
+               rx_errors       += READ_ONCE(p->rx_errors);
+               tx_dropped      += READ_ONCE(p->tx_dropped);
        }
        stats->rx_errors  = rx_errors;
        stats->tx_dropped = tx_dropped;