net: bridge: switch to net core statistics counters handling
authorHeiner Kallweit <hkallweit1@gmail.com>
Fri, 20 Nov 2020 11:22:23 +0000 (12:22 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 21 Nov 2020 22:40:50 +0000 (14:40 -0800)
Use netdev->tstats instead of a member of net_bridge for storing
a pointer to the per-cpu counters. This allows us to use core
functionality for statistics handling.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Link: https://lore.kernel.org/r/9bad2be2-fd84-7c6e-912f-cee433787018@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_device.c
net/bridge/br_input.c
net/bridge/br_private.h

index 77bcc84..adb674a 100644 (file)
@@ -30,7 +30,6 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        struct net_bridge *br = netdev_priv(dev);
        struct net_bridge_fdb_entry *dst;
        struct net_bridge_mdb_entry *mdst;
-       struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats);
        const struct nf_br_ops *nf_ops;
        u8 state = BR_STATE_FORWARDING;
        const unsigned char *dest;
@@ -45,10 +44,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
                return NETDEV_TX_OK;
        }
 
-       u64_stats_update_begin(&brstats->syncp);
-       brstats->tx_packets++;
-       brstats->tx_bytes += skb->len;
-       u64_stats_update_end(&brstats->syncp);
+       dev_sw_netstats_tx_add(dev, 1, skb->len);
 
        br_switchdev_frame_unmark(skb);
        BR_INPUT_SKB_CB(skb)->brdev = dev;
@@ -119,26 +115,26 @@ static int br_dev_init(struct net_device *dev)
        struct net_bridge *br = netdev_priv(dev);
        int err;
 
-       br->stats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
-       if (!br->stats)
+       dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
+       if (!dev->tstats)
                return -ENOMEM;
 
        err = br_fdb_hash_init(br);
        if (err) {
-               free_percpu(br->stats);
+               free_percpu(dev->tstats);
                return err;
        }
 
        err = br_mdb_hash_init(br);
        if (err) {
-               free_percpu(br->stats);
+               free_percpu(dev->tstats);
                br_fdb_hash_fini(br);
                return err;
        }
 
        err = br_vlan_init(br);
        if (err) {
-               free_percpu(br->stats);
+               free_percpu(dev->tstats);
                br_mdb_hash_fini(br);
                br_fdb_hash_fini(br);
                return err;
@@ -146,7 +142,7 @@ static int br_dev_init(struct net_device *dev)
 
        err = br_multicast_init_stats(br);
        if (err) {
-               free_percpu(br->stats);
+               free_percpu(dev->tstats);
                br_vlan_flush(br);
                br_mdb_hash_fini(br);
                br_fdb_hash_fini(br);
@@ -165,7 +161,7 @@ static void br_dev_uninit(struct net_device *dev)
        br_vlan_flush(br);
        br_mdb_hash_fini(br);
        br_fdb_hash_fini(br);
-       free_percpu(br->stats);
+       free_percpu(dev->tstats);
 }
 
 static int br_dev_open(struct net_device *dev)
@@ -202,15 +198,6 @@ static int br_dev_stop(struct net_device *dev)
        return 0;
 }
 
-static void br_get_stats64(struct net_device *dev,
-                          struct rtnl_link_stats64 *stats)
-{
-       struct net_bridge *br = netdev_priv(dev);
-
-       netdev_stats_to_stats64(stats, &dev->stats);
-       dev_fetch_sw_netstats(stats, br->stats);
-}
-
 static int br_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct net_bridge *br = netdev_priv(dev);
@@ -404,7 +391,7 @@ static const struct net_device_ops br_netdev_ops = {
        .ndo_init                = br_dev_init,
        .ndo_uninit              = br_dev_uninit,
        .ndo_start_xmit          = br_dev_xmit,
-       .ndo_get_stats64         = br_get_stats64,
+       .ndo_get_stats64         = dev_get_tstats64,
        .ndo_set_mac_address     = br_set_mac_address,
        .ndo_set_rx_mode         = br_dev_set_multicast_list,
        .ndo_change_rx_flags     = br_dev_change_rx_flags,
index 2180898..8ca1f1b 100644 (file)
@@ -35,12 +35,8 @@ static int br_pass_frame_up(struct sk_buff *skb)
        struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev;
        struct net_bridge *br = netdev_priv(brdev);
        struct net_bridge_vlan_group *vg;
-       struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats);
 
-       u64_stats_update_begin(&brstats->syncp);
-       brstats->rx_packets++;
-       brstats->rx_bytes += skb->len;
-       u64_stats_update_end(&brstats->syncp);
+       dev_sw_netstats_rx_add(brdev, skb->len);
 
        vg = br_vlan_group_rcu(br);
        /* Bridge is just like any other port.  Make sure the
index f44f46a..d538cce 100644 (file)
@@ -377,7 +377,6 @@ struct net_bridge {
        spinlock_t                      hash_lock;
        struct hlist_head               frame_type_list;
        struct net_device               *dev;
-       struct pcpu_sw_netstats         __percpu *stats;
        unsigned long                   options;
        /* These fields are accessed on each packet */
 #ifdef CONFIG_BRIDGE_VLAN_FILTERING