geneve: Handle stats using NETDEV_PCPU_STAT_DSTATS.
authorGuillaume Nault <gnault@redhat.com>
Wed, 4 Dec 2024 12:11:30 +0000 (13:11 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 7 Dec 2024 01:56:52 +0000 (17:56 -0800)
Geneve uses the TSTATS infrastructure (dev_sw_netstats_*()) for RX
packet counters. All other counters are handled using atomic increments
with DEV_STATS_INC().

Let's convert packet stats handling to DSTATS, which has a per-cpu
counter for packet drops too, to avoid the cost of atomic increments
in these cases. Statistics that don't fit DSTATS are still updated
atomically with DEV_STATS_INC().

Signed-off-by: Guillaume Nault <gnault@redhat.com>
Link: https://patch.msgid.link/7af5c09f3c26f0f231fbe383822ca5d1ce0278fa.1733313925.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/geneve.c

index bc658bc6088546d5d1f116988b93d4dda915a799..642155cb83157e8ebf2b237a4efccff6dd8f02eb 100644 (file)
@@ -235,7 +235,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
                                         vni_to_tunnel_id(gnvh->vni),
                                         gnvh->opt_len * 4);
                if (!tun_dst) {
-                       DEV_STATS_INC(geneve->dev, rx_dropped);
+                       dev_dstats_rx_dropped(geneve->dev);
                        goto drop;
                }
                /* Update tunnel dst according to Geneve options. */
@@ -322,7 +322,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
        len = skb->len;
        err = gro_cells_receive(&geneve->gro_cells, skb);
        if (likely(err == NET_RX_SUCCESS))
-               dev_sw_netstats_rx_add(geneve->dev, len);
+               dev_dstats_rx_add(geneve->dev, len);
 
        return;
 drop:
@@ -387,14 +387,14 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 
        if (unlikely((!geneve->cfg.inner_proto_inherit &&
                      inner_proto != htons(ETH_P_TEB)))) {
-               DEV_STATS_INC(geneve->dev, rx_dropped);
+               dev_dstats_rx_dropped(geneve->dev);
                goto drop;
        }
 
        opts_len = geneveh->opt_len * 4;
        if (iptunnel_pull_header(skb, GENEVE_BASE_HLEN + opts_len, inner_proto,
                                 !net_eq(geneve->net, dev_net(geneve->dev)))) {
-               DEV_STATS_INC(geneve->dev, rx_dropped);
+               dev_dstats_rx_dropped(geneve->dev);
                goto drop;
        }
 
@@ -1023,7 +1023,7 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)
                if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) {
                        netdev_dbg(dev, "no tunnel metadata\n");
                        dev_kfree_skb(skb);
-                       DEV_STATS_INC(dev, tx_dropped);
+                       dev_dstats_tx_dropped(dev);
                        return NETDEV_TX_OK;
                }
        } else {
@@ -1202,7 +1202,7 @@ static void geneve_setup(struct net_device *dev)
        dev->hw_features |= NETIF_F_RXCSUM;
        dev->hw_features |= NETIF_F_GSO_SOFTWARE;
 
-       dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
+       dev->pcpu_stat_type = NETDEV_PCPU_STAT_DSTATS;
        /* MTU range: 68 - (something less than 65535) */
        dev->min_mtu = ETH_MIN_MTU;
        /* The max_mtu calculation does not take account of GENEVE