Commit 52643b78 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-add-and-use-dev_get_tstats64'

Heiner Kallweit says:

====================
net: add and use dev_get_tstats64

It's a frequent pattern to use netdev->stats for the less frequently
accessed counters and per-cpu counters for the frequently accessed
counters (rx/tx bytes/packets). Add a default ndo_get_stats64()
implementation for this use case. Subsequently switch more drivers
to use this pattern.

v2:
- add patches for replacing ip_tunnel_get_stats64
  Requested additional migrations will come in a separate series.

v3:
- add atomic_long_t member rx_frame_errors in patch 3 for making
  counter updates atomic
====================

Link: https://lore.kernel.org/r/99273e2f-c218-cd19-916e-9161d8ad8c56@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents ca4d632a 682036b2
...@@ -510,7 +510,7 @@ static const struct net_device_ops bareudp_netdev_ops = { ...@@ -510,7 +510,7 @@ static const struct net_device_ops bareudp_netdev_ops = {
.ndo_open = bareudp_open, .ndo_open = bareudp_open,
.ndo_stop = bareudp_stop, .ndo_stop = bareudp_stop,
.ndo_start_xmit = bareudp_xmit, .ndo_start_xmit = bareudp_xmit,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_fill_metadata_dst = bareudp_fill_metadata_dst, .ndo_fill_metadata_dst = bareudp_fill_metadata_dst,
}; };
......
...@@ -1138,7 +1138,7 @@ static const struct net_device_ops geneve_netdev_ops = { ...@@ -1138,7 +1138,7 @@ static const struct net_device_ops geneve_netdev_ops = {
.ndo_open = geneve_open, .ndo_open = geneve_open,
.ndo_stop = geneve_stop, .ndo_stop = geneve_stop,
.ndo_start_xmit = geneve_xmit, .ndo_start_xmit = geneve_xmit,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = geneve_change_mtu, .ndo_change_mtu = geneve_change_mtu,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
......
...@@ -607,7 +607,7 @@ static const struct net_device_ops gtp_netdev_ops = { ...@@ -607,7 +607,7 @@ static const struct net_device_ops gtp_netdev_ops = {
.ndo_init = gtp_dev_init, .ndo_init = gtp_dev_init,
.ndo_uninit = gtp_dev_uninit, .ndo_uninit = gtp_dev_uninit,
.ndo_start_xmit = gtp_dev_xmit, .ndo_start_xmit = gtp_dev_xmit,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
}; };
static void gtp_link_setup(struct net_device *dev) static void gtp_link_setup(struct net_device *dev)
......
This diff is collapsed.
...@@ -3211,7 +3211,7 @@ static const struct net_device_ops vxlan_netdev_ether_ops = { ...@@ -3211,7 +3211,7 @@ static const struct net_device_ops vxlan_netdev_ether_ops = {
.ndo_open = vxlan_open, .ndo_open = vxlan_open,
.ndo_stop = vxlan_stop, .ndo_stop = vxlan_stop,
.ndo_start_xmit = vxlan_xmit, .ndo_start_xmit = vxlan_xmit,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_rx_mode = vxlan_set_multicast_list, .ndo_set_rx_mode = vxlan_set_multicast_list,
.ndo_change_mtu = vxlan_change_mtu, .ndo_change_mtu = vxlan_change_mtu,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
...@@ -3230,7 +3230,7 @@ static const struct net_device_ops vxlan_netdev_raw_ops = { ...@@ -3230,7 +3230,7 @@ static const struct net_device_ops vxlan_netdev_raw_ops = {
.ndo_open = vxlan_open, .ndo_open = vxlan_open,
.ndo_stop = vxlan_stop, .ndo_stop = vxlan_stop,
.ndo_start_xmit = vxlan_xmit, .ndo_start_xmit = vxlan_xmit,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = vxlan_change_mtu, .ndo_change_mtu = vxlan_change_mtu,
.ndo_fill_metadata_dst = vxlan_fill_metadata_dst, .ndo_fill_metadata_dst = vxlan_fill_metadata_dst,
}; };
......
...@@ -215,7 +215,7 @@ static const struct net_device_ops netdev_ops = { ...@@ -215,7 +215,7 @@ static const struct net_device_ops netdev_ops = {
.ndo_open = wg_open, .ndo_open = wg_open,
.ndo_stop = wg_stop, .ndo_stop = wg_stop,
.ndo_start_xmit = wg_xmit, .ndo_start_xmit = wg_xmit,
.ndo_get_stats64 = ip_tunnel_get_stats64 .ndo_get_stats64 = dev_get_tstats64
}; };
static void wg_destruct(struct net_device *dev) static void wg_destruct(struct net_device *dev)
......
...@@ -4527,6 +4527,7 @@ void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64, ...@@ -4527,6 +4527,7 @@ void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
const struct net_device_stats *netdev_stats); const struct net_device_stats *netdev_stats);
void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s, void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
const struct pcpu_sw_netstats __percpu *netstats); const struct pcpu_sw_netstats __percpu *netstats);
void dev_get_tstats64(struct net_device *dev, struct rtnl_link_stats64 *s);
extern int netdev_max_backlog; extern int netdev_max_backlog;
extern int netdev_tstamp_prequeue; extern int netdev_tstamp_prequeue;
......
...@@ -274,8 +274,6 @@ int ip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); ...@@ -274,8 +274,6 @@ int ip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict); int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict);
int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu); int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu);
void ip_tunnel_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *tot);
struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
int link, __be16 flags, int link, __be16 flags,
__be32 remote, __be32 local, __be32 remote, __be32 local,
......
...@@ -10366,6 +10366,21 @@ void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s, ...@@ -10366,6 +10366,21 @@ void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
} }
EXPORT_SYMBOL_GPL(dev_fetch_sw_netstats); EXPORT_SYMBOL_GPL(dev_fetch_sw_netstats);
/**
* dev_get_tstats64 - ndo_get_stats64 implementation
* @dev: device to get statistics from
* @s: place to store stats
*
* Populate @s from dev->stats and dev->tstats. Can be used as
* ndo_get_stats64() callback.
*/
void dev_get_tstats64(struct net_device *dev, struct rtnl_link_stats64 *s)
{
netdev_stats_to_stats64(s, &dev->stats);
dev_fetch_sw_netstats(s, dev->tstats);
}
EXPORT_SYMBOL_GPL(dev_get_tstats64);
struct netdev_queue *dev_ingress_queue_create(struct net_device *dev) struct netdev_queue *dev_ingress_queue_create(struct net_device *dev)
{ {
struct netdev_queue *queue = dev_ingress_queue(dev); struct netdev_queue *queue = dev_ingress_queue(dev);
......
...@@ -201,7 +201,6 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -201,7 +201,6 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
{ {
struct dsa_port *cpu_dp = dev->dsa_ptr; struct dsa_port *cpu_dp = dev->dsa_ptr;
struct sk_buff *nskb = NULL; struct sk_buff *nskb = NULL;
struct pcpu_sw_netstats *s;
struct dsa_slave_priv *p; struct dsa_slave_priv *p;
if (unlikely(!cpu_dp)) { if (unlikely(!cpu_dp)) {
...@@ -234,11 +233,7 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -234,11 +233,7 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
skb = nskb; skb = nskb;
} }
s = this_cpu_ptr(p->stats64); dev_sw_netstats_rx_add(skb->dev, skb->len);
u64_stats_update_begin(&s->syncp);
s->rx_packets++;
s->rx_bytes += skb->len;
u64_stats_update_end(&s->syncp);
if (dsa_skb_defer_rx_timestamp(p, skb)) if (dsa_skb_defer_rx_timestamp(p, skb))
return 0; return 0;
......
...@@ -78,8 +78,6 @@ struct dsa_slave_priv { ...@@ -78,8 +78,6 @@ struct dsa_slave_priv {
struct sk_buff * (*xmit)(struct sk_buff *skb, struct sk_buff * (*xmit)(struct sk_buff *skb,
struct net_device *dev); struct net_device *dev);
struct pcpu_sw_netstats __percpu *stats64;
struct gro_cells gcells; struct gro_cells gcells;
/* DSA port data, such as switch, port index, etc. */ /* DSA port data, such as switch, port index, etc. */
......
...@@ -575,14 +575,9 @@ static int dsa_realloc_skb(struct sk_buff *skb, struct net_device *dev) ...@@ -575,14 +575,9 @@ static int dsa_realloc_skb(struct sk_buff *skb, struct net_device *dev)
static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct dsa_slave_priv *p = netdev_priv(dev); struct dsa_slave_priv *p = netdev_priv(dev);
struct pcpu_sw_netstats *s;
struct sk_buff *nskb; struct sk_buff *nskb;
s = this_cpu_ptr(p->stats64); dev_sw_netstats_tx_add(dev, 1, skb->len);
u64_stats_update_begin(&s->syncp);
s->tx_packets++;
s->tx_bytes += skb->len;
u64_stats_update_end(&s->syncp);
DSA_SKB_CB(skb)->clone = NULL; DSA_SKB_CB(skb)->clone = NULL;
...@@ -714,7 +709,6 @@ static void dsa_slave_get_ethtool_stats(struct net_device *dev, ...@@ -714,7 +709,6 @@ static void dsa_slave_get_ethtool_stats(struct net_device *dev,
uint64_t *data) uint64_t *data)
{ {
struct dsa_port *dp = dsa_slave_to_port(dev); struct dsa_port *dp = dsa_slave_to_port(dev);
struct dsa_slave_priv *p = netdev_priv(dev);
struct dsa_switch *ds = dp->ds; struct dsa_switch *ds = dp->ds;
struct pcpu_sw_netstats *s; struct pcpu_sw_netstats *s;
unsigned int start; unsigned int start;
...@@ -723,7 +717,7 @@ static void dsa_slave_get_ethtool_stats(struct net_device *dev, ...@@ -723,7 +717,7 @@ static void dsa_slave_get_ethtool_stats(struct net_device *dev,
for_each_possible_cpu(i) { for_each_possible_cpu(i) {
u64 tx_packets, tx_bytes, rx_packets, rx_bytes; u64 tx_packets, tx_bytes, rx_packets, rx_bytes;
s = per_cpu_ptr(p->stats64, i); s = per_cpu_ptr(dev->tstats, i);
do { do {
start = u64_stats_fetch_begin_irq(&s->syncp); start = u64_stats_fetch_begin_irq(&s->syncp);
tx_packets = s->tx_packets; tx_packets = s->tx_packets;
...@@ -1252,15 +1246,6 @@ static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type, ...@@ -1252,15 +1246,6 @@ static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type,
return ds->ops->port_setup_tc(ds, dp->index, type, type_data); return ds->ops->port_setup_tc(ds, dp->index, type, type_data);
} }
static void dsa_slave_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *stats)
{
struct dsa_slave_priv *p = netdev_priv(dev);
netdev_stats_to_stats64(stats, &dev->stats);
dev_fetch_sw_netstats(stats, p->stats64);
}
static int dsa_slave_get_rxnfc(struct net_device *dev, static int dsa_slave_get_rxnfc(struct net_device *dev,
struct ethtool_rxnfc *nfc, u32 *rule_locs) struct ethtool_rxnfc *nfc, u32 *rule_locs)
{ {
...@@ -1636,7 +1621,7 @@ static const struct net_device_ops dsa_slave_netdev_ops = { ...@@ -1636,7 +1621,7 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
#endif #endif
.ndo_get_phys_port_name = dsa_slave_get_phys_port_name, .ndo_get_phys_port_name = dsa_slave_get_phys_port_name,
.ndo_setup_tc = dsa_slave_setup_tc, .ndo_setup_tc = dsa_slave_setup_tc,
.ndo_get_stats64 = dsa_slave_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_port_parent_id = dsa_slave_get_port_parent_id, .ndo_get_port_parent_id = dsa_slave_get_port_parent_id,
.ndo_vlan_rx_add_vid = dsa_slave_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = dsa_slave_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid,
...@@ -1846,8 +1831,8 @@ int dsa_slave_create(struct dsa_port *port) ...@@ -1846,8 +1831,8 @@ int dsa_slave_create(struct dsa_port *port)
slave_dev->vlan_features = master->vlan_features; slave_dev->vlan_features = master->vlan_features;
p = netdev_priv(slave_dev); p = netdev_priv(slave_dev);
p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); slave_dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
if (!p->stats64) { if (!slave_dev->tstats) {
free_netdev(slave_dev); free_netdev(slave_dev);
return -ENOMEM; return -ENOMEM;
} }
...@@ -1909,7 +1894,7 @@ int dsa_slave_create(struct dsa_port *port) ...@@ -1909,7 +1894,7 @@ int dsa_slave_create(struct dsa_port *port)
out_gcells: out_gcells:
gro_cells_destroy(&p->gcells); gro_cells_destroy(&p->gcells);
out_free: out_free:
free_percpu(p->stats64); free_percpu(slave_dev->tstats);
free_netdev(slave_dev); free_netdev(slave_dev);
port->slave = NULL; port->slave = NULL;
return ret; return ret;
...@@ -1931,7 +1916,7 @@ void dsa_slave_destroy(struct net_device *slave_dev) ...@@ -1931,7 +1916,7 @@ void dsa_slave_destroy(struct net_device *slave_dev)
dsa_slave_notify(slave_dev, DSA_PORT_UNREGISTER); dsa_slave_notify(slave_dev, DSA_PORT_UNREGISTER);
phylink_destroy(dp->pl); phylink_destroy(dp->pl);
gro_cells_destroy(&p->gcells); gro_cells_destroy(&p->gcells);
free_percpu(p->stats64); free_percpu(slave_dev->tstats);
free_netdev(slave_dev); free_netdev(slave_dev);
} }
......
...@@ -920,7 +920,7 @@ static const struct net_device_ops ipgre_netdev_ops = { ...@@ -920,7 +920,7 @@ static const struct net_device_ops ipgre_netdev_ops = {
.ndo_start_xmit = ipgre_xmit, .ndo_start_xmit = ipgre_xmit,
.ndo_do_ioctl = ip_tunnel_ioctl, .ndo_do_ioctl = ip_tunnel_ioctl,
.ndo_change_mtu = ip_tunnel_change_mtu, .ndo_change_mtu = ip_tunnel_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip_tunnel_get_iflink, .ndo_get_iflink = ip_tunnel_get_iflink,
.ndo_tunnel_ctl = ipgre_tunnel_ctl, .ndo_tunnel_ctl = ipgre_tunnel_ctl,
}; };
...@@ -1275,7 +1275,7 @@ static const struct net_device_ops gre_tap_netdev_ops = { ...@@ -1275,7 +1275,7 @@ static const struct net_device_ops gre_tap_netdev_ops = {
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = ip_tunnel_change_mtu, .ndo_change_mtu = ip_tunnel_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip_tunnel_get_iflink, .ndo_get_iflink = ip_tunnel_get_iflink,
.ndo_fill_metadata_dst = gre_fill_metadata_dst, .ndo_fill_metadata_dst = gre_fill_metadata_dst,
}; };
...@@ -1308,7 +1308,7 @@ static const struct net_device_ops erspan_netdev_ops = { ...@@ -1308,7 +1308,7 @@ static const struct net_device_ops erspan_netdev_ops = {
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = ip_tunnel_change_mtu, .ndo_change_mtu = ip_tunnel_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip_tunnel_get_iflink, .ndo_get_iflink = ip_tunnel_get_iflink,
.ndo_fill_metadata_dst = gre_fill_metadata_dst, .ndo_fill_metadata_dst = gre_fill_metadata_dst,
}; };
......
...@@ -429,15 +429,6 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst, ...@@ -429,15 +429,6 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
} }
EXPORT_SYMBOL(skb_tunnel_check_pmtu); EXPORT_SYMBOL(skb_tunnel_check_pmtu);
/* Often modified stats are per cpu, other are shared (netdev->stats) */
void ip_tunnel_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *tot)
{
netdev_stats_to_stats64(tot, &dev->stats);
dev_fetch_sw_netstats(tot, dev->tstats);
}
EXPORT_SYMBOL_GPL(ip_tunnel_get_stats64);
static const struct nla_policy ip_tun_policy[LWTUNNEL_IP_MAX + 1] = { static const struct nla_policy ip_tun_policy[LWTUNNEL_IP_MAX + 1] = {
[LWTUNNEL_IP_UNSPEC] = { .strict_start_type = LWTUNNEL_IP_OPTS }, [LWTUNNEL_IP_UNSPEC] = { .strict_start_type = LWTUNNEL_IP_OPTS },
[LWTUNNEL_IP_ID] = { .type = NLA_U64 }, [LWTUNNEL_IP_ID] = { .type = NLA_U64 },
......
...@@ -404,7 +404,7 @@ static const struct net_device_ops vti_netdev_ops = { ...@@ -404,7 +404,7 @@ static const struct net_device_ops vti_netdev_ops = {
.ndo_start_xmit = vti_tunnel_xmit, .ndo_start_xmit = vti_tunnel_xmit,
.ndo_do_ioctl = ip_tunnel_ioctl, .ndo_do_ioctl = ip_tunnel_ioctl,
.ndo_change_mtu = ip_tunnel_change_mtu, .ndo_change_mtu = ip_tunnel_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip_tunnel_get_iflink, .ndo_get_iflink = ip_tunnel_get_iflink,
.ndo_tunnel_ctl = vti_tunnel_ctl, .ndo_tunnel_ctl = vti_tunnel_ctl,
}; };
......
...@@ -347,7 +347,7 @@ static const struct net_device_ops ipip_netdev_ops = { ...@@ -347,7 +347,7 @@ static const struct net_device_ops ipip_netdev_ops = {
.ndo_start_xmit = ipip_tunnel_xmit, .ndo_start_xmit = ipip_tunnel_xmit,
.ndo_do_ioctl = ip_tunnel_ioctl, .ndo_do_ioctl = ip_tunnel_ioctl,
.ndo_change_mtu = ip_tunnel_change_mtu, .ndo_change_mtu = ip_tunnel_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip_tunnel_get_iflink, .ndo_get_iflink = ip_tunnel_get_iflink,
.ndo_tunnel_ctl = ipip_tunnel_ctl, .ndo_tunnel_ctl = ipip_tunnel_ctl,
}; };
......
...@@ -1391,7 +1391,7 @@ static const struct net_device_ops ip6gre_netdev_ops = { ...@@ -1391,7 +1391,7 @@ static const struct net_device_ops ip6gre_netdev_ops = {
.ndo_start_xmit = ip6gre_tunnel_xmit, .ndo_start_xmit = ip6gre_tunnel_xmit,
.ndo_do_ioctl = ip6gre_tunnel_ioctl, .ndo_do_ioctl = ip6gre_tunnel_ioctl,
.ndo_change_mtu = ip6_tnl_change_mtu, .ndo_change_mtu = ip6_tnl_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip6_tnl_get_iflink, .ndo_get_iflink = ip6_tnl_get_iflink,
}; };
...@@ -1828,7 +1828,7 @@ static const struct net_device_ops ip6gre_tap_netdev_ops = { ...@@ -1828,7 +1828,7 @@ static const struct net_device_ops ip6gre_tap_netdev_ops = {
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = ip6_tnl_change_mtu, .ndo_change_mtu = ip6_tnl_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip6_tnl_get_iflink, .ndo_get_iflink = ip6_tnl_get_iflink,
}; };
...@@ -1896,7 +1896,7 @@ static const struct net_device_ops ip6erspan_netdev_ops = { ...@@ -1896,7 +1896,7 @@ static const struct net_device_ops ip6erspan_netdev_ops = {
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = ip6_tnl_change_mtu, .ndo_change_mtu = ip6_tnl_change_mtu,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip6_tnl_get_iflink, .ndo_get_iflink = ip6_tnl_get_iflink,
}; };
......
...@@ -94,36 +94,6 @@ static inline int ip6_tnl_mpls_supported(void) ...@@ -94,36 +94,6 @@ static inline int ip6_tnl_mpls_supported(void)
return IS_ENABLED(CONFIG_MPLS); return IS_ENABLED(CONFIG_MPLS);
} }
static struct net_device_stats *ip6_get_stats(struct net_device *dev)
{
struct pcpu_sw_netstats tmp, sum = { 0 };
int i;
for_each_possible_cpu(i) {
unsigned int start;
const struct pcpu_sw_netstats *tstats =
per_cpu_ptr(dev->tstats, i);
do {
start = u64_stats_fetch_begin_irq(&tstats->syncp);
tmp.rx_packets = tstats->rx_packets;
tmp.rx_bytes = tstats->rx_bytes;
tmp.tx_packets = tstats->tx_packets;
tmp.tx_bytes = tstats->tx_bytes;
} while (u64_stats_fetch_retry_irq(&tstats->syncp, start));
sum.rx_packets += tmp.rx_packets;
sum.rx_bytes += tmp.rx_bytes;
sum.tx_packets += tmp.tx_packets;
sum.tx_bytes += tmp.tx_bytes;
}
dev->stats.rx_packets = sum.rx_packets;
dev->stats.rx_bytes = sum.rx_bytes;
dev->stats.tx_packets = sum.tx_packets;
dev->stats.tx_bytes = sum.tx_bytes;
return &dev->stats;
}
#define for_each_ip6_tunnel_rcu(start) \ #define for_each_ip6_tunnel_rcu(start) \
for (t = rcu_dereference(start); t; t = rcu_dereference(t->next)) for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
...@@ -1834,7 +1804,7 @@ static const struct net_device_ops ip6_tnl_netdev_ops = { ...@@ -1834,7 +1804,7 @@ static const struct net_device_ops ip6_tnl_netdev_ops = {
.ndo_start_xmit = ip6_tnl_start_xmit, .ndo_start_xmit = ip6_tnl_start_xmit,
.ndo_do_ioctl = ip6_tnl_ioctl, .ndo_do_ioctl = ip6_tnl_ioctl,
.ndo_change_mtu = ip6_tnl_change_mtu, .ndo_change_mtu = ip6_tnl_change_mtu,
.ndo_get_stats = ip6_get_stats, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip6_tnl_get_iflink, .ndo_get_iflink = ip6_tnl_get_iflink,
}; };
......
...@@ -890,7 +890,7 @@ static const struct net_device_ops vti6_netdev_ops = { ...@@ -890,7 +890,7 @@ static const struct net_device_ops vti6_netdev_ops = {
.ndo_uninit = vti6_dev_uninit, .ndo_uninit = vti6_dev_uninit,
.ndo_start_xmit = vti6_tnl_xmit, .ndo_start_xmit = vti6_tnl_xmit,
.ndo_do_ioctl = vti6_ioctl, .ndo_do_ioctl = vti6_ioctl,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip6_tnl_get_iflink, .ndo_get_iflink = ip6_tnl_get_iflink,
}; };
......
...@@ -1396,7 +1396,7 @@ static const struct net_device_ops ipip6_netdev_ops = { ...@@ -1396,7 +1396,7 @@ static const struct net_device_ops ipip6_netdev_ops = {
.ndo_uninit = ipip6_tunnel_uninit, .ndo_uninit = ipip6_tunnel_uninit,
.ndo_start_xmit = sit_tunnel_xmit, .ndo_start_xmit = sit_tunnel_xmit,
.ndo_do_ioctl = ipip6_tunnel_ioctl, .ndo_do_ioctl = ipip6_tunnel_ioctl,
.ndo_get_stats64 = ip_tunnel_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_get_iflink = ip_tunnel_get_iflink, .ndo_get_iflink = ip_tunnel_get_iflink,
.ndo_tunnel_ctl = ipip6_tunnel_ctl, .ndo_tunnel_ctl = ipip6_tunnel_ctl,
}; };
......
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