]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: don't touch dev->stats in BPF redirect paths
authorJakub Kicinski <kuba@kernel.org>
Fri, 30 Jan 2026 03:38:27 +0000 (19:38 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 31 Jan 2026 20:35:27 +0000 (12:35 -0800)
Gal reports that BPF redirect increments dev->stats.tx_errors
on failure. This is not correct, most modern drivers completely
ignore dev->stats so these drops will be invisible to the user.
Core code should use the dedicated core stats which are folded
into device stats in dev_get_stats().

Note that we're switching from tx_errors to tx_dropped.
Core only has tx_dropped, hence presumably users already expect
that counter to increment for "stack" Tx issues.

Reported-by: Gal Pressman <gal@nvidia.com>
Link: https://lore.kernel.org/c5df3b60-246a-4030-9c9a-0a35cd1ca924@nvidia.com
Fixes: b4ab31414970 ("bpf: Add redirect_neigh helper as redirect drop-in")
Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260130033827.698841-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/filter.c

index bcd73d9bd764918052f6b33c01196419332cf58a..029e560e32ce3e96ada2b9f04382ef244fcf8b81 100644 (file)
@@ -2289,12 +2289,12 @@ static int __bpf_redirect_neigh_v6(struct sk_buff *skb, struct net_device *dev,
 
        err = bpf_out_neigh_v6(net, skb, dev, nh);
        if (unlikely(net_xmit_eval(err)))
-               DEV_STATS_INC(dev, tx_errors);
+               dev_core_stats_tx_dropped_inc(dev);
        else
                ret = NET_XMIT_SUCCESS;
        goto out_xmit;
 out_drop:
-       DEV_STATS_INC(dev, tx_errors);
+       dev_core_stats_tx_dropped_inc(dev);
        kfree_skb(skb);
 out_xmit:
        return ret;
@@ -2396,12 +2396,12 @@ static int __bpf_redirect_neigh_v4(struct sk_buff *skb, struct net_device *dev,
 
        err = bpf_out_neigh_v4(net, skb, dev, nh);
        if (unlikely(net_xmit_eval(err)))
-               DEV_STATS_INC(dev, tx_errors);
+               dev_core_stats_tx_dropped_inc(dev);
        else
                ret = NET_XMIT_SUCCESS;
        goto out_xmit;
 out_drop:
-       DEV_STATS_INC(dev, tx_errors);
+       dev_core_stats_tx_dropped_inc(dev);
        kfree_skb(skb);
 out_xmit:
        return ret;