net: provide dev_lstats_add() helper
authorEric Dumazet <edumazet@google.com>
Fri, 8 Nov 2019 00:27:15 +0000 (16:27 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Nov 2019 04:03:08 +0000 (20:03 -0800)
Many network drivers need it and hand-coded the same function.

In order to ease u64_stats_t adoption, it is time to factorize.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/loopback.c
include/linux/netdevice.h

index 92336ac4c5e68f63b814d6a70e7361b8954a91cf..47ad2478b9f350f8bf3b103bd2a9a956379c75fa 100644 (file)
@@ -68,7 +68,6 @@ EXPORT_SYMBOL(blackhole_netdev);
 static netdev_tx_t loopback_xmit(struct sk_buff *skb,
                                 struct net_device *dev)
 {
-       struct pcpu_lstats *lb_stats;
        int len;
 
        skb_tx_timestamp(skb);
@@ -85,16 +84,9 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb,
 
        skb->protocol = eth_type_trans(skb, dev);
 
-       /* it's OK to use per_cpu_ptr() because BHs are off */
-       lb_stats = this_cpu_ptr(dev->lstats);
-
        len = skb->len;
-       if (likely(netif_rx(skb) == NET_RX_SUCCESS)) {
-               u64_stats_update_begin(&lb_stats->syncp);
-               lb_stats->bytes += len;
-               lb_stats->packets++;
-               u64_stats_update_end(&lb_stats->syncp);
-       }
+       if (likely(netif_rx(skb) == NET_RX_SUCCESS))
+               dev_lstats_add(dev, len);
 
        return NETDEV_TX_OK;
 }
index 75561992c31f7c32f5a50e3879bafb5a54bc5fa3..461a36220cf46d62114efac0c4fb2b7b9a2ee386 100644 (file)
@@ -2403,6 +2403,16 @@ struct pcpu_lstats {
 
 void dev_lstats_read(struct net_device *dev, u64 *packets, u64 *bytes);
 
+static inline void dev_lstats_add(struct net_device *dev, unsigned int len)
+{
+       struct pcpu_lstats *lstats = this_cpu_ptr(dev->lstats);
+
+       u64_stats_update_begin(&lstats->syncp);
+       lstats->bytes += len;
+       lstats->packets++;
+       u64_stats_update_end(&lstats->syncp);
+}
+
 #define __netdev_alloc_pcpu_stats(type, gfp)                           \
 ({                                                                     \
        typeof(type) __percpu *pcpu_stats = alloc_percpu_gfp(type, gfp);\