]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: Add netif_get_gro_max_size helper for GRO
authorDaniel Borkmann <daniel@iogearbox.net>
Mon, 23 Sep 2024 21:22:41 +0000 (23:22 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Oct 2024 10:00:07 +0000 (12:00 +0200)
[ Upstream commit e8d4d34df715133c319fabcf63fdec684be75ff8 ]

Add a small netif_get_gro_max_size() helper which returns the maximum IPv4
or IPv6 GRO size of the netdevice.

We later add a netif_get_gso_max_size() equivalent as well for GSO, so that
these helpers can be used consistently instead of open-coded checks.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20240923212242.15669-1-daniel@iogearbox.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Stable-dep-of: e609c959a939 ("net: Fix gso_features_check to check for both dev->gso_{ipv4_,}max_size")
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/linux/netdevice.h
net/core/gro.c

index d20c6c99eb887cd45a7cadfcb3491f6bde400deb..84a445ca4749a4acae5ce4ea12617eb31d8f577b 100644 (file)
@@ -5000,6 +5000,15 @@ void netif_set_tso_max_segs(struct net_device *dev, unsigned int segs);
 void netif_inherit_tso_max(struct net_device *to,
                           const struct net_device *from);
 
+static inline unsigned int
+netif_get_gro_max_size(const struct net_device *dev, const struct sk_buff *skb)
+{
+       /* pairs with WRITE_ONCE() in netif_set_gro(_ipv4)_max_size() */
+       return skb->protocol == htons(ETH_P_IPV6) ?
+              READ_ONCE(dev->gro_max_size) :
+              READ_ONCE(dev->gro_ipv4_max_size);
+}
+
 static inline bool netif_is_macsec(const struct net_device *dev)
 {
        return dev->priv_flags & IFF_MACSEC;
index b3b43de1a650274c680fe2001a2b0c24cabce2e6..87708483a5f4604eedc11a745dc445dc657e8fcd 100644 (file)
@@ -98,7 +98,6 @@ int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
        unsigned int headlen = skb_headlen(skb);
        unsigned int len = skb_gro_len(skb);
        unsigned int delta_truesize;
-       unsigned int gro_max_size;
        unsigned int new_truesize;
        struct sk_buff *lp;
        int segs;
@@ -112,12 +111,8 @@ int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
        if (p->pp_recycle != skb->pp_recycle)
                return -ETOOMANYREFS;
 
-       /* pairs with WRITE_ONCE() in netif_set_gro(_ipv4)_max_size() */
-       gro_max_size = p->protocol == htons(ETH_P_IPV6) ?
-                       READ_ONCE(p->dev->gro_max_size) :
-                       READ_ONCE(p->dev->gro_ipv4_max_size);
-
-       if (unlikely(p->len + len >= gro_max_size || NAPI_GRO_CB(skb)->flush))
+       if (unlikely(p->len + len >= netif_get_gro_max_size(p->dev, p) ||
+                    NAPI_GRO_CB(skb)->flush))
                return -E2BIG;
 
        if (unlikely(p->len + len >= GRO_LEGACY_MAX_SIZE)) {