veth: use standard dev_lstats_add() and dev_lstats_read()
authorEric Dumazet <edumazet@google.com>
Fri, 8 Nov 2019 00:27:17 +0000 (16:27 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Nov 2019 04:03:08 +0000 (20:03 -0800)
This cleanup will ease u64_stats_t adoption in a single location.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/veth.c

index 9f3c839f9e5f2cda2f103f943f94badc09691a2b..a552df37a347c72fed84909c45188e5dd1201df7 100644 (file)
@@ -260,14 +260,8 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
 
        skb_tx_timestamp(skb);
        if (likely(veth_forward_skb(rcv, skb, rq, rcv_xdp) == NET_RX_SUCCESS)) {
-               if (!rcv_xdp) {
-                       struct pcpu_lstats *stats = this_cpu_ptr(dev->lstats);
-
-                       u64_stats_update_begin(&stats->syncp);
-                       stats->bytes += length;
-                       stats->packets++;
-                       u64_stats_update_end(&stats->syncp);
-               }
+               if (!rcv_xdp)
+                       dev_lstats_add(dev, length);
        } else {
 drop:
                atomic64_inc(&priv->dropped);
@@ -281,26 +275,11 @@ drop:
        return NETDEV_TX_OK;
 }
 
-static u64 veth_stats_tx(struct pcpu_lstats *result, struct net_device *dev)
+static u64 veth_stats_tx(struct net_device *dev, u64 *packets, u64 *bytes)
 {
        struct veth_priv *priv = netdev_priv(dev);
-       int cpu;
-
-       result->packets = 0;
-       result->bytes = 0;
-       for_each_possible_cpu(cpu) {
-               struct pcpu_lstats *stats = per_cpu_ptr(dev->lstats, cpu);
-               u64 packets, bytes;
-               unsigned int start;
 
-               do {
-                       start = u64_stats_fetch_begin_irq(&stats->syncp);
-                       packets = stats->packets;
-                       bytes = stats->bytes;
-               } while (u64_stats_fetch_retry_irq(&stats->syncp, start));
-               result->packets += packets;
-               result->bytes += bytes;
-       }
+       dev_lstats_read(dev, packets, bytes);
        return atomic64_read(&priv->dropped);
 }
 
@@ -335,11 +314,11 @@ static void veth_get_stats64(struct net_device *dev,
        struct veth_priv *priv = netdev_priv(dev);
        struct net_device *peer;
        struct veth_rq_stats rx;
-       struct pcpu_lstats tx;
+       u64 packets, bytes;
 
-       tot->tx_dropped = veth_stats_tx(&tx, dev);
-       tot->tx_bytes = tx.bytes;
-       tot->tx_packets = tx.packets;
+       tot->tx_dropped = veth_stats_tx(dev, &packets, &bytes);
+       tot->tx_bytes = bytes;
+       tot->tx_packets = packets;
 
        veth_stats_rx(&rx, dev);
        tot->rx_dropped = rx.xdp_drops;
@@ -349,9 +328,9 @@ static void veth_get_stats64(struct net_device *dev,
        rcu_read_lock();
        peer = rcu_dereference(priv->peer);
        if (peer) {
-               tot->rx_dropped += veth_stats_tx(&tx, peer);
-               tot->rx_bytes += tx.bytes;
-               tot->rx_packets += tx.packets;
+               tot->rx_dropped += veth_stats_tx(peer, &packets, &bytes);
+               tot->rx_bytes += bytes;
+               tot->rx_packets += packets;
 
                veth_stats_rx(&rx, peer);
                tot->tx_bytes += rx.xdp_bytes;