From 0b4ff5581fbd8a709e5593851545d48e8d747e24 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 3 Jan 2025 08:30:53 +0000 Subject: [PATCH] Revert "veth: Use tstats per-CPU traffic counters" This reverts commit 7ca7b6649bf0702fe1c8591e5ea64e51febbdd3c which is commit 6f2684bf2b4460c84d0d34612a939f78b96b03fc upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I77d059ea30dda952a3e58f85289a69afbca037f4 Signed-off-by: Greg Kroah-Hartman --- drivers/net/veth.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/net/veth.c b/drivers/net/veth.c index e1e7df00e85c..0a8154611d7f 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -342,7 +342,7 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev) skb_tx_timestamp(skb); if (likely(veth_forward_skb(rcv, skb, rq, use_napi) == NET_RX_SUCCESS)) { if (!use_napi) - dev_sw_netstats_tx_add(dev, 1, length); + dev_lstats_add(dev, length); } else { drop: atomic64_inc(&priv->dropped); @@ -357,6 +357,14 @@ drop: return ret; } +static u64 veth_stats_tx(struct net_device *dev, u64 *packets, u64 *bytes) +{ + struct veth_priv *priv = netdev_priv(dev); + + dev_lstats_read(dev, packets, bytes); + return atomic64_read(&priv->dropped); +} + static void veth_stats_rx(struct veth_stats *result, struct net_device *dev) { struct veth_priv *priv = netdev_priv(dev); @@ -394,24 +402,24 @@ static void veth_get_stats64(struct net_device *dev, struct veth_priv *priv = netdev_priv(dev); struct net_device *peer; struct veth_stats rx; + u64 packets, bytes; - tot->tx_dropped = atomic64_read(&priv->dropped); - dev_fetch_sw_netstats(tot, dev->tstats); + tot->tx_dropped = veth_stats_tx(dev, &packets, &bytes); + tot->tx_bytes = bytes; + tot->tx_packets = packets; veth_stats_rx(&rx, dev); tot->tx_dropped += rx.xdp_tx_err; tot->rx_dropped = rx.rx_drops + rx.peer_tq_xdp_xmit_err; - tot->rx_bytes += rx.xdp_bytes; - tot->rx_packets += rx.xdp_packets; + tot->rx_bytes = rx.xdp_bytes; + tot->rx_packets = rx.xdp_packets; rcu_read_lock(); peer = rcu_dereference(priv->peer); if (peer) { - struct rtnl_link_stats64 tot_peer = {}; - - dev_fetch_sw_netstats(&tot_peer, peer->tstats); - tot->rx_bytes += tot_peer.tx_bytes; - tot->rx_packets += tot_peer.tx_packets; + veth_stats_tx(peer, &packets, &bytes); + tot->rx_bytes += bytes; + tot->rx_packets += packets; veth_stats_rx(&rx, peer); tot->tx_dropped += rx.peer_tq_xdp_xmit_err; @@ -1604,7 +1612,7 @@ static void veth_setup(struct net_device *dev) NETIF_F_HW_VLAN_STAG_RX); dev->needs_free_netdev = true; dev->priv_destructor = veth_dev_free; - dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; + dev->pcpu_stat_type = NETDEV_PCPU_STAT_LSTATS; dev->max_mtu = ETH_MAX_MTU; dev->hw_features = VETH_FEATURES;