All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/5] net: add and use dev_get_tstats64
@ 2020-11-01 12:33 Heiner Kallweit
  2020-11-01 12:34 ` [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation Heiner Kallweit
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-01 12:33 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

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.

Heiner Kallweit (5):
  net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation
  net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
  ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback
  net: dsa: use net core stats64 handling
  tun: switch to net core provided statistics counters

 drivers/net/tun.c         | 127 ++++++++++----------------------------
 include/linux/netdevice.h |   1 +
 include/net/ip_tunnels.h  |   4 +-
 net/core/dev.c            |  15 +++++
 net/dsa/dsa.c             |   7 +--
 net/dsa/dsa_priv.h        |   2 -
 net/dsa/slave.c           |  29 +++------
 net/ipv4/ip_tunnel_core.c |   9 ---
 net/ipv6/ip6_tunnel.c     |  32 +---------
 9 files changed, 58 insertions(+), 168 deletions(-)

-- 
2.29.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation
  2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
@ 2020-11-01 12:34 ` Heiner Kallweit
  2020-11-02 21:09   ` Florian Fainelli
  2020-11-01 12:35 ` [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64 Heiner Kallweit
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-01 12:34 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

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.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 include/linux/netdevice.h |  1 +
 net/core/dev.c            | 15 +++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 6e06fef32..72643c193 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -4527,6 +4527,7 @@ void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
 			     const struct net_device_stats *netdev_stats);
 void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
 			   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_tstamp_prequeue;
diff --git a/net/core/dev.c b/net/core/dev.c
index 82dc6b48e..81abc4f98 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10366,6 +10366,21 @@ void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
 }
 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 *queue = dev_ingress_queue(dev);
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
  2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
  2020-11-01 12:34 ` [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation Heiner Kallweit
@ 2020-11-01 12:35 ` Heiner Kallweit
  2020-11-02 21:09   ` Florian Fainelli
  2020-11-02 21:37   ` Jakub Kicinski
  2020-11-01 12:36 ` [PATCH net-next 3/5] ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback Heiner Kallweit
                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-01 12:35 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

ip_tunnel_get_stats64() now is a duplicate of dev_get_tstats64().
Make it an alias so that we don't have to change all users of
ip_tunnel_get_stats64().

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 include/net/ip_tunnels.h  | 4 ++--
 net/ipv4/ip_tunnel_core.c | 9 ---------
 2 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index 02ccd3254..500943ba8 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -274,8 +274,8 @@ 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);
 
-void ip_tunnel_get_stats64(struct net_device *dev,
-			   struct rtnl_link_stats64 *tot);
+#define ip_tunnel_get_stats64 dev_get_tstats64
+
 struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
 				   int link, __be16 flags,
 				   __be32 remote, __be32 local,
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c
index 25f1caf5a..923a9fa2e 100644
--- a/net/ipv4/ip_tunnel_core.c
+++ b/net/ipv4/ip_tunnel_core.c
@@ -429,15 +429,6 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
 }
 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] = {
 	[LWTUNNEL_IP_UNSPEC]	= { .strict_start_type = LWTUNNEL_IP_OPTS },
 	[LWTUNNEL_IP_ID]	= { .type = NLA_U64 },
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH net-next 3/5] ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback
  2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
  2020-11-01 12:34 ` [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation Heiner Kallweit
  2020-11-01 12:35 ` [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64 Heiner Kallweit
@ 2020-11-01 12:36 ` Heiner Kallweit
  2020-11-01 12:37 ` [PATCH net-next 4/5] net: dsa: use net core stats64 handling Heiner Kallweit
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-01 12:36 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

Switch ip6_tunnel to the standard statistics pattern:
- use dev->stats for the less frequently accessed counters
- use dev->tstats for the frequently accessed counters

An additional benefit is that we now have 64bit statistics also on
32bit systems.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 net/ipv6/ip6_tunnel.c | 32 +-------------------------------
 1 file changed, 1 insertion(+), 31 deletions(-)

diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index a0217e5bf..4ba18d9f9 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -94,36 +94,6 @@ static inline int ip6_tnl_mpls_supported(void)
 	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) \
 	for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
 
@@ -1835,7 +1805,7 @@ static const struct net_device_ops ip6_tnl_netdev_ops = {
 	.ndo_start_xmit = ip6_tnl_start_xmit,
 	.ndo_do_ioctl	= ip6_tnl_ioctl,
 	.ndo_change_mtu = ip6_tnl_change_mtu,
-	.ndo_get_stats	= ip6_get_stats,
+	.ndo_get_stats64 = ip_tunnel_get_stats64,
 	.ndo_get_iflink = ip6_tnl_get_iflink,
 };
 
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH net-next 4/5] net: dsa: use net core stats64 handling
  2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
                   ` (2 preceding siblings ...)
  2020-11-01 12:36 ` [PATCH net-next 3/5] ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback Heiner Kallweit
@ 2020-11-01 12:37 ` Heiner Kallweit
  2020-11-02 21:13   ` Florian Fainelli
  2020-11-02 21:22   ` Vladimir Oltean
  2020-11-01 12:38 ` [PATCH net-next 5/5] tun: switch to net core provided statistics counters Heiner Kallweit
  2020-11-02 22:36 ` [PATCH net-next 0/5] net: add and use dev_get_tstats64 Saeed Mahameed
  5 siblings, 2 replies; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-01 12:37 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

Use netdev->tstats instead of a member of dsa_slave_priv 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>
---
 net/dsa/dsa.c      |  7 +------
 net/dsa/dsa_priv.h |  2 --
 net/dsa/slave.c    | 29 +++++++----------------------
 3 files changed, 8 insertions(+), 30 deletions(-)

diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 2131bf2b3..a1b1dc8a4 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -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 sk_buff *nskb = NULL;
-	struct pcpu_sw_netstats *s;
 	struct dsa_slave_priv *p;
 
 	if (unlikely(!cpu_dp)) {
@@ -234,11 +233,7 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
 		skb = nskb;
 	}
 
-	s = this_cpu_ptr(p->stats64);
-	u64_stats_update_begin(&s->syncp);
-	s->rx_packets++;
-	s->rx_bytes += skb->len;
-	u64_stats_update_end(&s->syncp);
+	dev_sw_netstats_rx_add(skb->dev, skb->len);
 
 	if (dsa_skb_defer_rx_timestamp(p, skb))
 		return 0;
diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h
index 12998bf04..7c96aae90 100644
--- a/net/dsa/dsa_priv.h
+++ b/net/dsa/dsa_priv.h
@@ -78,8 +78,6 @@ struct dsa_slave_priv {
 	struct sk_buff *	(*xmit)(struct sk_buff *skb,
 					struct net_device *dev);
 
-	struct pcpu_sw_netstats	__percpu *stats64;
-
 	struct gro_cells	gcells;
 
 	/* DSA port data, such as switch, port index, etc. */
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 3bc5ca40c..c6a797d75 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -551,14 +551,9 @@ EXPORT_SYMBOL_GPL(dsa_enqueue_skb);
 static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
-	struct pcpu_sw_netstats *s;
 	struct sk_buff *nskb;
 
-	s = this_cpu_ptr(p->stats64);
-	u64_stats_update_begin(&s->syncp);
-	s->tx_packets++;
-	s->tx_bytes += skb->len;
-	u64_stats_update_end(&s->syncp);
+	dev_sw_netstats_tx_add(dev, 1, skb->len);
 
 	DSA_SKB_CB(skb)->clone = NULL;
 
@@ -679,7 +674,6 @@ static void dsa_slave_get_ethtool_stats(struct net_device *dev,
 					uint64_t *data)
 {
 	struct dsa_port *dp = dsa_slave_to_port(dev);
-	struct dsa_slave_priv *p = netdev_priv(dev);
 	struct dsa_switch *ds = dp->ds;
 	struct pcpu_sw_netstats *s;
 	unsigned int start;
@@ -688,7 +682,7 @@ static void dsa_slave_get_ethtool_stats(struct net_device *dev,
 	for_each_possible_cpu(i) {
 		u64 tx_packets, tx_bytes, rx_packets, rx_bytes;
 
-		s = per_cpu_ptr(p->stats64, i);
+		s = per_cpu_ptr(dev->tstats, i);
 		do {
 			start = u64_stats_fetch_begin_irq(&s->syncp);
 			tx_packets = s->tx_packets;
@@ -1217,15 +1211,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);
 }
 
-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,
 			       struct ethtool_rxnfc *nfc, u32 *rule_locs)
 {
@@ -1601,7 +1586,7 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
 #endif
 	.ndo_get_phys_port_name	= dsa_slave_get_phys_port_name,
 	.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_vlan_rx_add_vid	= dsa_slave_vlan_rx_add_vid,
 	.ndo_vlan_rx_kill_vid	= dsa_slave_vlan_rx_kill_vid,
@@ -1801,8 +1786,8 @@ int dsa_slave_create(struct dsa_port *port)
 	slave_dev->vlan_features = master->vlan_features;
 
 	p = netdev_priv(slave_dev);
-	p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
-	if (!p->stats64) {
+	slave_dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
+	if (!slave_dev->tstats) {
 		free_netdev(slave_dev);
 		return -ENOMEM;
 	}
@@ -1864,7 +1849,7 @@ int dsa_slave_create(struct dsa_port *port)
 out_gcells:
 	gro_cells_destroy(&p->gcells);
 out_free:
-	free_percpu(p->stats64);
+	free_percpu(slave_dev->tstats);
 	free_netdev(slave_dev);
 	port->slave = NULL;
 	return ret;
@@ -1886,7 +1871,7 @@ void dsa_slave_destroy(struct net_device *slave_dev)
 	dsa_slave_notify(slave_dev, DSA_PORT_UNREGISTER);
 	phylink_destroy(dp->pl);
 	gro_cells_destroy(&p->gcells);
-	free_percpu(p->stats64);
+	free_percpu(slave_dev->tstats);
 	free_netdev(slave_dev);
 }
 
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH net-next 5/5] tun: switch to net core provided statistics counters
  2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
                   ` (3 preceding siblings ...)
  2020-11-01 12:37 ` [PATCH net-next 4/5] net: dsa: use net core stats64 handling Heiner Kallweit
@ 2020-11-01 12:38 ` Heiner Kallweit
  2020-11-02 22:36 ` [PATCH net-next 0/5] net: add and use dev_get_tstats64 Saeed Mahameed
  5 siblings, 0 replies; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-01 12:38 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

Switch tun to the standard statistics pattern:
- use netdev->stats for the less frequently accessed counters
- use netdev->tstats for the frequently accessed per-cpu counters

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/tun.c | 127 +++++++++++-----------------------------------
 1 file changed, 31 insertions(+), 96 deletions(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index be69d2720..504bdf501 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -107,17 +107,6 @@ struct tap_filter {
 
 #define TUN_FLOW_EXPIRE (3 * HZ)
 
-struct tun_pcpu_stats {
-	u64_stats_t rx_packets;
-	u64_stats_t rx_bytes;
-	u64_stats_t tx_packets;
-	u64_stats_t tx_bytes;
-	struct u64_stats_sync syncp;
-	u32 rx_dropped;
-	u32 tx_dropped;
-	u32 rx_frame_errors;
-};
-
 /* A tun_file connects an open character device to a tuntap netdevice. It
  * also contains all socket related structures (except sock_fprog and tap_filter)
  * to serve as one transmit queue for tuntap device. The sock_fprog and
@@ -207,7 +196,6 @@ struct tun_struct {
 	void *security;
 	u32 flow_count;
 	u32 rx_batched;
-	struct tun_pcpu_stats __percpu *pcpu_stats;
 	struct bpf_prog __rcu *xdp_prog;
 	struct tun_prog __rcu *steering_prog;
 	struct tun_prog __rcu *filter_prog;
@@ -1066,7 +1054,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 	return NETDEV_TX_OK;
 
 drop:
-	this_cpu_inc(tun->pcpu_stats->tx_dropped);
+	dev->stats.tx_dropped++;
 	skb_tx_error(skb);
 	kfree_skb(skb);
 	rcu_read_unlock();
@@ -1100,42 +1088,6 @@ static void tun_set_headroom(struct net_device *dev, int new_hr)
 	tun->align = new_hr;
 }
 
-static void
-tun_net_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
-{
-	u32 rx_dropped = 0, tx_dropped = 0, rx_frame_errors = 0;
-	struct tun_struct *tun = netdev_priv(dev);
-	struct tun_pcpu_stats *p;
-	int i;
-
-	for_each_possible_cpu(i) {
-		u64 rxpackets, rxbytes, txpackets, txbytes;
-		unsigned int start;
-
-		p = per_cpu_ptr(tun->pcpu_stats, i);
-		do {
-			start = u64_stats_fetch_begin(&p->syncp);
-			rxpackets	= u64_stats_read(&p->rx_packets);
-			rxbytes		= u64_stats_read(&p->rx_bytes);
-			txpackets	= u64_stats_read(&p->tx_packets);
-			txbytes		= u64_stats_read(&p->tx_bytes);
-		} while (u64_stats_fetch_retry(&p->syncp, start));
-
-		stats->rx_packets	+= rxpackets;
-		stats->rx_bytes		+= rxbytes;
-		stats->tx_packets	+= txpackets;
-		stats->tx_bytes		+= txbytes;
-
-		/* u32 counters */
-		rx_dropped	+= p->rx_dropped;
-		rx_frame_errors	+= p->rx_frame_errors;
-		tx_dropped	+= p->tx_dropped;
-	}
-	stats->rx_dropped  = rx_dropped;
-	stats->rx_frame_errors = rx_frame_errors;
-	stats->tx_dropped = tx_dropped;
-}
-
 static int tun_xdp_set(struct net_device *dev, struct bpf_prog *prog,
 		       struct netlink_ext_ack *extack)
 {
@@ -1199,7 +1151,7 @@ static const struct net_device_ops tun_netdev_ops = {
 	.ndo_fix_features	= tun_net_fix_features,
 	.ndo_select_queue	= tun_select_queue,
 	.ndo_set_rx_headroom	= tun_set_headroom,
-	.ndo_get_stats64	= tun_net_get_stats64,
+	.ndo_get_stats64	= dev_get_tstats64,
 	.ndo_change_carrier	= tun_net_change_carrier,
 };
 
@@ -1247,7 +1199,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
 		void *frame = tun_xdp_to_ptr(xdp);
 
 		if (__ptr_ring_produce(&tfile->tx_ring, frame)) {
-			this_cpu_inc(tun->pcpu_stats->tx_dropped);
+			dev->stats.tx_dropped++;
 			xdp_return_frame_rx_napi(xdp);
 			drops++;
 		}
@@ -1283,7 +1235,7 @@ static const struct net_device_ops tap_netdev_ops = {
 	.ndo_select_queue	= tun_select_queue,
 	.ndo_features_check	= passthru_features_check,
 	.ndo_set_rx_headroom	= tun_set_headroom,
-	.ndo_get_stats64	= tun_net_get_stats64,
+	.ndo_get_stats64	= dev_get_tstats64,
 	.ndo_bpf		= tun_xdp,
 	.ndo_xdp_xmit		= tun_xdp_xmit,
 	.ndo_change_carrier	= tun_net_change_carrier,
@@ -1577,7 +1529,7 @@ static int tun_xdp_act(struct tun_struct *tun, struct bpf_prog *xdp_prog,
 		trace_xdp_exception(tun->dev, xdp_prog, act);
 		fallthrough;
 	case XDP_DROP:
-		this_cpu_inc(tun->pcpu_stats->rx_dropped);
+		tun->dev->stats.rx_dropped++;
 		break;
 	}
 
@@ -1683,7 +1635,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 	size_t total_len = iov_iter_count(from);
 	size_t len = total_len, align = tun->align, linear;
 	struct virtio_net_hdr gso = { 0 };
-	struct tun_pcpu_stats *stats;
 	int good_linear;
 	int copylen;
 	bool zerocopy = false;
@@ -1752,7 +1703,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 		 */
 		skb = tun_build_skb(tun, tfile, from, &gso, len, &skb_xdp);
 		if (IS_ERR(skb)) {
-			this_cpu_inc(tun->pcpu_stats->rx_dropped);
+			tun->dev->stats.rx_dropped++;
 			return PTR_ERR(skb);
 		}
 		if (!skb)
@@ -1781,7 +1732,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 
 		if (IS_ERR(skb)) {
 			if (PTR_ERR(skb) != -EAGAIN)
-				this_cpu_inc(tun->pcpu_stats->rx_dropped);
+				tun->dev->stats.rx_dropped++;
 			if (frags)
 				mutex_unlock(&tfile->napi_mutex);
 			return PTR_ERR(skb);
@@ -1795,7 +1746,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 		if (err) {
 			err = -EFAULT;
 drop:
-			this_cpu_inc(tun->pcpu_stats->rx_dropped);
+			tun->dev->stats.rx_dropped++;
 			kfree_skb(skb);
 			if (frags) {
 				tfile->napi.skb = NULL;
@@ -1807,7 +1758,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 	}
 
 	if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun))) {
-		this_cpu_inc(tun->pcpu_stats->rx_frame_errors);
+		tun->dev->stats.rx_frame_errors++;
 		kfree_skb(skb);
 		if (frags) {
 			tfile->napi.skb = NULL;
@@ -1830,7 +1781,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 				pi.proto = htons(ETH_P_IPV6);
 				break;
 			default:
-				this_cpu_inc(tun->pcpu_stats->rx_dropped);
+				tun->dev->stats.rx_dropped++;
 				kfree_skb(skb);
 				return -EINVAL;
 			}
@@ -1910,7 +1861,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 					  skb_headlen(skb));
 
 		if (unlikely(headlen > skb_headlen(skb))) {
-			this_cpu_inc(tun->pcpu_stats->rx_dropped);
+			tun->dev->stats.rx_dropped++;
 			napi_free_frags(&tfile->napi);
 			rcu_read_unlock();
 			mutex_unlock(&tfile->napi_mutex);
@@ -1942,12 +1893,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 	}
 	rcu_read_unlock();
 
-	stats = get_cpu_ptr(tun->pcpu_stats);
-	u64_stats_update_begin(&stats->syncp);
-	u64_stats_inc(&stats->rx_packets);
-	u64_stats_add(&stats->rx_bytes, len);
-	u64_stats_update_end(&stats->syncp);
-	put_cpu_ptr(stats);
+	preempt_disable();
+	dev_sw_netstats_rx_add(tun->dev, len);
+	preempt_enable();
 
 	if (rxhash)
 		tun_flow_update(tun, rxhash, tfile);
@@ -1979,7 +1927,6 @@ static ssize_t tun_put_user_xdp(struct tun_struct *tun,
 {
 	int vnet_hdr_sz = 0;
 	size_t size = xdp_frame->len;
-	struct tun_pcpu_stats *stats;
 	size_t ret;
 
 	if (tun->flags & IFF_VNET_HDR) {
@@ -1996,12 +1943,9 @@ static ssize_t tun_put_user_xdp(struct tun_struct *tun,
 
 	ret = copy_to_iter(xdp_frame->data, size, iter) + vnet_hdr_sz;
 
-	stats = get_cpu_ptr(tun->pcpu_stats);
-	u64_stats_update_begin(&stats->syncp);
-	u64_stats_inc(&stats->tx_packets);
-	u64_stats_add(&stats->tx_bytes, ret);
-	u64_stats_update_end(&stats->syncp);
-	put_cpu_ptr(tun->pcpu_stats);
+	preempt_disable();
+	dev_sw_netstats_tx_add(tun->dev, 1, ret);
+	preempt_enable();
 
 	return ret;
 }
@@ -2013,7 +1957,6 @@ static ssize_t tun_put_user(struct tun_struct *tun,
 			    struct iov_iter *iter)
 {
 	struct tun_pi pi = { 0, skb->protocol };
-	struct tun_pcpu_stats *stats;
 	ssize_t total;
 	int vlan_offset = 0;
 	int vlan_hlen = 0;
@@ -2091,12 +2034,9 @@ static ssize_t tun_put_user(struct tun_struct *tun,
 
 done:
 	/* caller is in process context, */
-	stats = get_cpu_ptr(tun->pcpu_stats);
-	u64_stats_update_begin(&stats->syncp);
-	u64_stats_inc(&stats->tx_packets);
-	u64_stats_add(&stats->tx_bytes, skb->len + vlan_hlen);
-	u64_stats_update_end(&stats->syncp);
-	put_cpu_ptr(tun->pcpu_stats);
+	preempt_disable();
+	dev_sw_netstats_tx_add(tun->dev, 1, skb->len + vlan_hlen);
+	preempt_enable();
 
 	return total;
 }
@@ -2235,11 +2175,11 @@ static void tun_free_netdev(struct net_device *dev)
 
 	BUG_ON(!(list_empty(&tun->disabled)));
 
-	free_percpu(tun->pcpu_stats);
-	/* We clear pcpu_stats so that tun_set_iff() can tell if
+	free_percpu(dev->tstats);
+	/* We clear tstats so that tun_set_iff() can tell if
 	 * tun_free_netdev() has been called from register_netdevice().
 	 */
-	tun->pcpu_stats = NULL;
+	dev->tstats = NULL;
 
 	tun_flow_uninit(tun);
 	security_tun_dev_free_security(tun->security);
@@ -2370,7 +2310,6 @@ static int tun_xdp_one(struct tun_struct *tun,
 	unsigned int datasize = xdp->data_end - xdp->data;
 	struct tun_xdp_hdr *hdr = xdp->data_hard_start;
 	struct virtio_net_hdr *gso = &hdr->gso;
-	struct tun_pcpu_stats *stats;
 	struct bpf_prog *xdp_prog;
 	struct sk_buff *skb = NULL;
 	u32 rxhash = 0, act;
@@ -2428,7 +2367,7 @@ static int tun_xdp_one(struct tun_struct *tun,
 	skb_put(skb, xdp->data_end - xdp->data);
 
 	if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun))) {
-		this_cpu_inc(tun->pcpu_stats->rx_frame_errors);
+		tun->dev->stats.rx_frame_errors++;
 		kfree_skb(skb);
 		err = -EINVAL;
 		goto out;
@@ -2451,14 +2390,10 @@ static int tun_xdp_one(struct tun_struct *tun,
 
 	netif_receive_skb(skb);
 
-	/* No need for get_cpu_ptr() here since this function is
+	/* No need to disable preemption here since this function is
 	 * always called with bh disabled
 	 */
-	stats = this_cpu_ptr(tun->pcpu_stats);
-	u64_stats_update_begin(&stats->syncp);
-	u64_stats_inc(&stats->rx_packets);
-	u64_stats_add(&stats->rx_bytes, datasize);
-	u64_stats_update_end(&stats->syncp);
+	dev_sw_netstats_rx_add(tun->dev, datasize);
 
 	if (rxhash)
 		tun_flow_update(tun, rxhash, tfile);
@@ -2751,8 +2686,8 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 		tun->rx_batched = 0;
 		RCU_INIT_POINTER(tun->steering_prog, NULL);
 
-		tun->pcpu_stats = netdev_alloc_pcpu_stats(struct tun_pcpu_stats);
-		if (!tun->pcpu_stats) {
+		dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
+		if (!dev->tstats) {
 			err = -ENOMEM;
 			goto err_free_dev;
 		}
@@ -2807,16 +2742,16 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 	tun_detach_all(dev);
 	/* We are here because register_netdevice() has failed.
 	 * If register_netdevice() already called tun_free_netdev()
-	 * while dealing with the error, tun->pcpu_stats has been cleared.
+	 * while dealing with the error, dev->stats has been cleared.
 	 */
-	if (!tun->pcpu_stats)
+	if (!dev->tstats)
 		goto err_free_dev;
 
 err_free_flow:
 	tun_flow_uninit(tun);
 	security_tun_dev_free_security(tun->security);
 err_free_stat:
-	free_percpu(tun->pcpu_stats);
+	free_percpu(dev->tstats);
 err_free_dev:
 	free_netdev(dev);
 	return err;
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation
  2020-11-01 12:34 ` [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation Heiner Kallweit
@ 2020-11-02 21:09   ` Florian Fainelli
  0 siblings, 0 replies; 15+ messages in thread
From: Florian Fainelli @ 2020-11-02 21:09 UTC (permalink / raw)
  To: Heiner Kallweit, Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Vladimir Oltean,
	Russell King
  Cc: netdev



On 11/1/2020 4:34 AM, Heiner Kallweit wrote:
> 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.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
  2020-11-01 12:35 ` [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64 Heiner Kallweit
@ 2020-11-02 21:09   ` Florian Fainelli
  2020-11-02 21:37   ` Jakub Kicinski
  1 sibling, 0 replies; 15+ messages in thread
From: Florian Fainelli @ 2020-11-02 21:09 UTC (permalink / raw)
  To: Heiner Kallweit, Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Vladimir Oltean,
	Russell King
  Cc: netdev



On 11/1/2020 4:35 AM, Heiner Kallweit wrote:
> ip_tunnel_get_stats64() now is a duplicate of dev_get_tstats64().
> Make it an alias so that we don't have to change all users of
> ip_tunnel_get_stats64().
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>

> ---
>  include/net/ip_tunnels.h  | 4 ++--
>  net/ipv4/ip_tunnel_core.c | 9 ---------
>  2 files changed, 2 insertions(+), 11 deletions(-)
> 
> diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
> index 02ccd3254..500943ba8 100644
> --- a/include/net/ip_tunnels.h
> +++ b/include/net/ip_tunnels.h
> @@ -274,8 +274,8 @@ 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);
>  
> -void ip_tunnel_get_stats64(struct net_device *dev,
> -			   struct rtnl_link_stats64 *tot);
> +#define ip_tunnel_get_stats64 dev_get_tstats64

A static inline might have worked too, up to you, really.
-- 
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 4/5] net: dsa: use net core stats64 handling
  2020-11-01 12:37 ` [PATCH net-next 4/5] net: dsa: use net core stats64 handling Heiner Kallweit
@ 2020-11-02 21:13   ` Florian Fainelli
  2020-11-02 21:22   ` Vladimir Oltean
  1 sibling, 0 replies; 15+ messages in thread
From: Florian Fainelli @ 2020-11-02 21:13 UTC (permalink / raw)
  To: Heiner Kallweit, Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Vladimir Oltean,
	Russell King
  Cc: netdev



On 11/1/2020 4:37 AM, Heiner Kallweit wrote:
> Use netdev->tstats instead of a member of dsa_slave_priv 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>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 4/5] net: dsa: use net core stats64 handling
  2020-11-01 12:37 ` [PATCH net-next 4/5] net: dsa: use net core stats64 handling Heiner Kallweit
  2020-11-02 21:13   ` Florian Fainelli
@ 2020-11-02 21:22   ` Vladimir Oltean
  1 sibling, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2020-11-02 21:22 UTC (permalink / raw)
  To: Heiner Kallweit
  Cc: Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Russell King, netdev

On Sun, Nov 01, 2020 at 01:37:03PM +0100, Heiner Kallweit wrote:
> Use netdev->tstats instead of a member of dsa_slave_priv 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>
> ---

Tested-by: Vladimir Oltean <olteanv@gmail.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
  2020-11-01 12:35 ` [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64 Heiner Kallweit
  2020-11-02 21:09   ` Florian Fainelli
@ 2020-11-02 21:37   ` Jakub Kicinski
  2020-11-02 21:56     ` Saeed Mahameed
  1 sibling, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2020-11-02 21:37 UTC (permalink / raw)
  To: Heiner Kallweit
  Cc: David Miller, Alexey Kuznetsov, Hideaki YOSHIFUJI, Andrew Lunn,
	Vivien Didelot, Florian Fainelli, Vladimir Oltean, Russell King,
	netdev

On Sun, 1 Nov 2020 13:35:14 +0100 Heiner Kallweit wrote:
> ip_tunnel_get_stats64() now is a duplicate of dev_get_tstats64().
> Make it an alias so that we don't have to change all users of
> ip_tunnel_get_stats64().

Why would we not change all the users?  It's just an ndo pointer.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
  2020-11-02 21:37   ` Jakub Kicinski
@ 2020-11-02 21:56     ` Saeed Mahameed
  0 siblings, 0 replies; 15+ messages in thread
From: Saeed Mahameed @ 2020-11-02 21:56 UTC (permalink / raw)
  To: Jakub Kicinski, Heiner Kallweit
  Cc: David Miller, Alexey Kuznetsov, Hideaki YOSHIFUJI, Andrew Lunn,
	Vivien Didelot, Florian Fainelli, Vladimir Oltean, Russell King,
	netdev

On Mon, 2020-11-02 at 13:37 -0800, Jakub Kicinski wrote:
> On Sun, 1 Nov 2020 13:35:14 +0100 Heiner Kallweit wrote:
> > ip_tunnel_get_stats64() now is a duplicate of dev_get_tstats64().
> > Make it an alias so that we don't have to change all users of
> > ip_tunnel_get_stats64().
> 
> Why would we not change all the users?  It's just an ndo pointer.

+1.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 0/5] net: add and use dev_get_tstats64
  2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
                   ` (4 preceding siblings ...)
  2020-11-01 12:38 ` [PATCH net-next 5/5] tun: switch to net core provided statistics counters Heiner Kallweit
@ 2020-11-02 22:36 ` Saeed Mahameed
  2020-11-03 14:46   ` Heiner Kallweit
  5 siblings, 1 reply; 15+ messages in thread
From: Saeed Mahameed @ 2020-11-02 22:36 UTC (permalink / raw)
  To: Heiner Kallweit, Jakub Kicinski, David Miller, Alexey Kuznetsov,
	Hideaki YOSHIFUJI, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	Vladimir Oltean, Russell King
  Cc: netdev

On Sun, 2020-11-01 at 13:33 +0100, Heiner Kallweit wrote:
> 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.
> 
> Heiner Kallweit (5):
>   net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation
>   net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
>   ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback
>   net: dsa: use net core stats64 handling
>   tun: switch to net core provided statistics counters
> 

not many left,

$ git grep dev_fetch_sw_netstats drivers/

drivers/infiniband/hw/hfi1/ipoib_main.c:        dev_fetch_sw_netstats(s
torage, priv->netstats);
drivers/net/macsec.c:   dev_fetch_sw_netstats(s, dev->tstats);
drivers/net/usb/qmi_wwan.c:     dev_fetch_sw_netstats(stats, priv-
>stats64);
drivers/net/usb/usbnet.c:       dev_fetch_sw_netstats(stats, dev-
>stats64);
drivers/net/wireless/quantenna/qtnfmac/core.c:  dev_fetch_sw_netstats(s
tats, vif->stats64);

Why not convert them as well ?
macsec has a different implementation, but all others can be converted.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 0/5] net: add and use dev_get_tstats64
  2020-11-02 22:36 ` [PATCH net-next 0/5] net: add and use dev_get_tstats64 Saeed Mahameed
@ 2020-11-03 14:46   ` Heiner Kallweit
  2020-11-03 17:05     ` Jakub Kicinski
  0 siblings, 1 reply; 15+ messages in thread
From: Heiner Kallweit @ 2020-11-03 14:46 UTC (permalink / raw)
  To: Saeed Mahameed, Jakub Kicinski, David Miller
  Cc: netdev, Andrew Lunn, Vivien Didelot, Russell King,
	Florian Fainelli, Vladimir Oltean, Hideaki YOSHIFUJI,
	Alexey Kuznetsov

On 02.11.2020 23:36, Saeed Mahameed wrote:
> On Sun, 2020-11-01 at 13:33 +0100, Heiner Kallweit wrote:
>> 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.
>>
>> Heiner Kallweit (5):
>>   net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation
>>   net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
>>   ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback
>>   net: dsa: use net core stats64 handling
>>   tun: switch to net core provided statistics counters
>>
> 
> not many left,
> 
> $ git grep dev_fetch_sw_netstats drivers/
> 
> drivers/infiniband/hw/hfi1/ipoib_main.c:        dev_fetch_sw_netstats(s
> torage, priv->netstats);
> drivers/net/macsec.c:   dev_fetch_sw_netstats(s, dev->tstats);
> drivers/net/usb/qmi_wwan.c:     dev_fetch_sw_netstats(stats, priv-
>> stats64);
> drivers/net/usb/usbnet.c:       dev_fetch_sw_netstats(stats, dev-
>> stats64);
> drivers/net/wireless/quantenna/qtnfmac/core.c:  dev_fetch_sw_netstats(s
> tats, vif->stats64);
> 
> Why not convert them as well ?
> macsec has a different implementation, but all others can be converted.
> 
OK, I can do this. Then the series becomes somewhat bigger.
@Jakub: Would it be ok to apply the current series and I provide the
additionally requested migrations as follow-up series?



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH net-next 0/5] net: add and use dev_get_tstats64
  2020-11-03 14:46   ` Heiner Kallweit
@ 2020-11-03 17:05     ` Jakub Kicinski
  0 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2020-11-03 17:05 UTC (permalink / raw)
  To: Heiner Kallweit
  Cc: Saeed Mahameed, David Miller, netdev, Andrew Lunn,
	Vivien Didelot, Russell King, Florian Fainelli, Vladimir Oltean,
	Hideaki YOSHIFUJI, Alexey Kuznetsov

On Tue, 3 Nov 2020 15:46:27 +0100 Heiner Kallweit wrote:
> On 02.11.2020 23:36, Saeed Mahameed wrote:
> > On Sun, 2020-11-01 at 13:33 +0100, Heiner Kallweit wrote:  
> >> 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.
> >>
> >> Heiner Kallweit (5):
> >>   net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation
> >>   net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64
> >>   ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback
> >>   net: dsa: use net core stats64 handling
> >>   tun: switch to net core provided statistics counters
> >>  
> > 
> > not many left,
> > 
> > $ git grep dev_fetch_sw_netstats drivers/
> > 
> > drivers/infiniband/hw/hfi1/ipoib_main.c:        dev_fetch_sw_netstats(s
> > torage, priv->netstats);
> > drivers/net/macsec.c:   dev_fetch_sw_netstats(s, dev->tstats);
> > drivers/net/usb/qmi_wwan.c:     dev_fetch_sw_netstats(stats, priv-  
> >> stats64);  
> > drivers/net/usb/usbnet.c:       dev_fetch_sw_netstats(stats, dev-  
> >> stats64);  
> > drivers/net/wireless/quantenna/qtnfmac/core.c:  dev_fetch_sw_netstats(s
> > tats, vif->stats64);
> > 
> > Why not convert them as well ?
> > macsec has a different implementation, but all others can be converted.
> >   
> OK, I can do this. Then the series becomes somewhat bigger.
> @Jakub: Would it be ok to apply the current series and I provide the
> additionally requested migrations as follow-up series?

Fine by me.

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2020-11-03 17:05 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-01 12:33 [PATCH net-next 0/5] net: add and use dev_get_tstats64 Heiner Kallweit
2020-11-01 12:34 ` [PATCH net-next 1/5] net: core: add dev_get_tstats64 as a ndo_get_stats64 implementation Heiner Kallweit
2020-11-02 21:09   ` Florian Fainelli
2020-11-01 12:35 ` [PATCH net-next 2/5] net: make ip_tunnel_get_stats64 an alias for dev_get_tstats64 Heiner Kallweit
2020-11-02 21:09   ` Florian Fainelli
2020-11-02 21:37   ` Jakub Kicinski
2020-11-02 21:56     ` Saeed Mahameed
2020-11-01 12:36 ` [PATCH net-next 3/5] ip6_tunnel: use ip_tunnel_get_stats64 as ndo_get_stats64 callback Heiner Kallweit
2020-11-01 12:37 ` [PATCH net-next 4/5] net: dsa: use net core stats64 handling Heiner Kallweit
2020-11-02 21:13   ` Florian Fainelli
2020-11-02 21:22   ` Vladimir Oltean
2020-11-01 12:38 ` [PATCH net-next 5/5] tun: switch to net core provided statistics counters Heiner Kallweit
2020-11-02 22:36 ` [PATCH net-next 0/5] net: add and use dev_get_tstats64 Saeed Mahameed
2020-11-03 14:46   ` Heiner Kallweit
2020-11-03 17:05     ` Jakub Kicinski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.