Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: bridge: switch to net core statistics counters handling

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>

authored by

Heiner Kallweit and committed by
Jakub Kicinski
7609ecb2 9c89cc9b

+10 -28
+9 -22
net/bridge/br_device.c
··· 30 30 struct net_bridge *br = netdev_priv(dev); 31 31 struct net_bridge_fdb_entry *dst; 32 32 struct net_bridge_mdb_entry *mdst; 33 - struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats); 34 33 const struct nf_br_ops *nf_ops; 35 34 u8 state = BR_STATE_FORWARDING; 36 35 const unsigned char *dest; ··· 44 45 return NETDEV_TX_OK; 45 46 } 46 47 47 - u64_stats_update_begin(&brstats->syncp); 48 - brstats->tx_packets++; 49 - brstats->tx_bytes += skb->len; 50 - u64_stats_update_end(&brstats->syncp); 48 + dev_sw_netstats_tx_add(dev, 1, skb->len); 51 49 52 50 br_switchdev_frame_unmark(skb); 53 51 BR_INPUT_SKB_CB(skb)->brdev = dev; ··· 115 119 struct net_bridge *br = netdev_priv(dev); 116 120 int err; 117 121 118 - br->stats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); 119 - if (!br->stats) 122 + dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); 123 + if (!dev->tstats) 120 124 return -ENOMEM; 121 125 122 126 err = br_fdb_hash_init(br); 123 127 if (err) { 124 - free_percpu(br->stats); 128 + free_percpu(dev->tstats); 125 129 return err; 126 130 } 127 131 128 132 err = br_mdb_hash_init(br); 129 133 if (err) { 130 - free_percpu(br->stats); 134 + free_percpu(dev->tstats); 131 135 br_fdb_hash_fini(br); 132 136 return err; 133 137 } 134 138 135 139 err = br_vlan_init(br); 136 140 if (err) { 137 - free_percpu(br->stats); 141 + free_percpu(dev->tstats); 138 142 br_mdb_hash_fini(br); 139 143 br_fdb_hash_fini(br); 140 144 return err; ··· 142 146 143 147 err = br_multicast_init_stats(br); 144 148 if (err) { 145 - free_percpu(br->stats); 149 + free_percpu(dev->tstats); 146 150 br_vlan_flush(br); 147 151 br_mdb_hash_fini(br); 148 152 br_fdb_hash_fini(br); ··· 161 165 br_vlan_flush(br); 162 166 br_mdb_hash_fini(br); 163 167 br_fdb_hash_fini(br); 164 - free_percpu(br->stats); 168 + free_percpu(dev->tstats); 165 169 } 166 170 167 171 static int br_dev_open(struct net_device *dev) ··· 196 200 netif_stop_queue(dev); 197 201 198 202 return 0; 199 - } 200 - 201 - static void br_get_stats64(struct net_device *dev, 202 - struct rtnl_link_stats64 *stats) 203 - { 204 - struct net_bridge *br = netdev_priv(dev); 205 - 206 - netdev_stats_to_stats64(stats, &dev->stats); 207 - dev_fetch_sw_netstats(stats, br->stats); 208 203 } 209 204 210 205 static int br_change_mtu(struct net_device *dev, int new_mtu) ··· 391 404 .ndo_init = br_dev_init, 392 405 .ndo_uninit = br_dev_uninit, 393 406 .ndo_start_xmit = br_dev_xmit, 394 - .ndo_get_stats64 = br_get_stats64, 407 + .ndo_get_stats64 = dev_get_tstats64, 395 408 .ndo_set_mac_address = br_set_mac_address, 396 409 .ndo_set_rx_mode = br_dev_set_multicast_list, 397 410 .ndo_change_rx_flags = br_dev_change_rx_flags,
+1 -5
net/bridge/br_input.c
··· 35 35 struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev; 36 36 struct net_bridge *br = netdev_priv(brdev); 37 37 struct net_bridge_vlan_group *vg; 38 - struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats); 39 38 40 - u64_stats_update_begin(&brstats->syncp); 41 - brstats->rx_packets++; 42 - brstats->rx_bytes += skb->len; 43 - u64_stats_update_end(&brstats->syncp); 39 + dev_sw_netstats_rx_add(brdev, skb->len); 44 40 45 41 vg = br_vlan_group_rcu(br); 46 42 /* Bridge is just like any other port. Make sure the
-1
net/bridge/br_private.h
··· 377 377 spinlock_t hash_lock; 378 378 struct hlist_head frame_type_list; 379 379 struct net_device *dev; 380 - struct pcpu_sw_netstats __percpu *stats; 381 380 unsigned long options; 382 381 /* These fields are accessed on each packet */ 383 382 #ifdef CONFIG_BRIDGE_VLAN_FILTERING