Commit 7609ecb2 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Jakub Kicinski

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: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Link: https://lore.kernel.org/r/9bad2be2-fd84-7c6e-912f-cee433787018@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9c89cc9b
...@@ -30,7 +30,6 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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 *br = netdev_priv(dev);
struct net_bridge_fdb_entry *dst; struct net_bridge_fdb_entry *dst;
struct net_bridge_mdb_entry *mdst; struct net_bridge_mdb_entry *mdst;
struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats);
const struct nf_br_ops *nf_ops; const struct nf_br_ops *nf_ops;
u8 state = BR_STATE_FORWARDING; u8 state = BR_STATE_FORWARDING;
const unsigned char *dest; const unsigned char *dest;
...@@ -45,10 +44,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -45,10 +44,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
u64_stats_update_begin(&brstats->syncp); dev_sw_netstats_tx_add(dev, 1, skb->len);
brstats->tx_packets++;
brstats->tx_bytes += skb->len;
u64_stats_update_end(&brstats->syncp);
br_switchdev_frame_unmark(skb); br_switchdev_frame_unmark(skb);
BR_INPUT_SKB_CB(skb)->brdev = dev; BR_INPUT_SKB_CB(skb)->brdev = dev;
...@@ -119,26 +115,26 @@ static int br_dev_init(struct net_device *dev) ...@@ -119,26 +115,26 @@ static int br_dev_init(struct net_device *dev)
struct net_bridge *br = netdev_priv(dev); struct net_bridge *br = netdev_priv(dev);
int err; int err;
br->stats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
if (!br->stats) if (!dev->tstats)
return -ENOMEM; return -ENOMEM;
err = br_fdb_hash_init(br); err = br_fdb_hash_init(br);
if (err) { if (err) {
free_percpu(br->stats); free_percpu(dev->tstats);
return err; return err;
} }
err = br_mdb_hash_init(br); err = br_mdb_hash_init(br);
if (err) { if (err) {
free_percpu(br->stats); free_percpu(dev->tstats);
br_fdb_hash_fini(br); br_fdb_hash_fini(br);
return err; return err;
} }
err = br_vlan_init(br); err = br_vlan_init(br);
if (err) { if (err) {
free_percpu(br->stats); free_percpu(dev->tstats);
br_mdb_hash_fini(br); br_mdb_hash_fini(br);
br_fdb_hash_fini(br); br_fdb_hash_fini(br);
return err; return err;
...@@ -146,7 +142,7 @@ static int br_dev_init(struct net_device *dev) ...@@ -146,7 +142,7 @@ static int br_dev_init(struct net_device *dev)
err = br_multicast_init_stats(br); err = br_multicast_init_stats(br);
if (err) { if (err) {
free_percpu(br->stats); free_percpu(dev->tstats);
br_vlan_flush(br); br_vlan_flush(br);
br_mdb_hash_fini(br); br_mdb_hash_fini(br);
br_fdb_hash_fini(br); br_fdb_hash_fini(br);
...@@ -165,7 +161,7 @@ static void br_dev_uninit(struct net_device *dev) ...@@ -165,7 +161,7 @@ static void br_dev_uninit(struct net_device *dev)
br_vlan_flush(br); br_vlan_flush(br);
br_mdb_hash_fini(br); br_mdb_hash_fini(br);
br_fdb_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) static int br_dev_open(struct net_device *dev)
...@@ -202,15 +198,6 @@ static int br_dev_stop(struct net_device *dev) ...@@ -202,15 +198,6 @@ static int br_dev_stop(struct net_device *dev)
return 0; 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) static int br_change_mtu(struct net_device *dev, int new_mtu)
{ {
struct net_bridge *br = netdev_priv(dev); struct net_bridge *br = netdev_priv(dev);
...@@ -404,7 +391,7 @@ static const struct net_device_ops br_netdev_ops = { ...@@ -404,7 +391,7 @@ static const struct net_device_ops br_netdev_ops = {
.ndo_init = br_dev_init, .ndo_init = br_dev_init,
.ndo_uninit = br_dev_uninit, .ndo_uninit = br_dev_uninit,
.ndo_start_xmit = br_dev_xmit, .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_mac_address = br_set_mac_address,
.ndo_set_rx_mode = br_dev_set_multicast_list, .ndo_set_rx_mode = br_dev_set_multicast_list,
.ndo_change_rx_flags = br_dev_change_rx_flags, .ndo_change_rx_flags = br_dev_change_rx_flags,
......
...@@ -35,12 +35,8 @@ static int br_pass_frame_up(struct sk_buff *skb) ...@@ -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_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev;
struct net_bridge *br = netdev_priv(brdev); struct net_bridge *br = netdev_priv(brdev);
struct net_bridge_vlan_group *vg; struct net_bridge_vlan_group *vg;
struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats);
u64_stats_update_begin(&brstats->syncp); dev_sw_netstats_rx_add(brdev, skb->len);
brstats->rx_packets++;
brstats->rx_bytes += skb->len;
u64_stats_update_end(&brstats->syncp);
vg = br_vlan_group_rcu(br); vg = br_vlan_group_rcu(br);
/* Bridge is just like any other port. Make sure the /* Bridge is just like any other port. Make sure the
......
...@@ -377,7 +377,6 @@ struct net_bridge { ...@@ -377,7 +377,6 @@ struct net_bridge {
spinlock_t hash_lock; spinlock_t hash_lock;
struct hlist_head frame_type_list; struct hlist_head frame_type_list;
struct net_device *dev; struct net_device *dev;
struct pcpu_sw_netstats __percpu *stats;
unsigned long options; unsigned long options;
/* These fields are accessed on each packet */ /* These fields are accessed on each packet */
#ifdef CONFIG_BRIDGE_VLAN_FILTERING #ifdef CONFIG_BRIDGE_VLAN_FILTERING
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment