[PATCH net-next v2 1/4] net: core: factor out the GSO device limit check
Wang Zhan <[email protected]>
| Newsgroups | org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
gso_features_check() decides whether an egress device can offload a GSO skb as a single TSO frame by comparing the segment count and the frame length against the device limits. Move that test into a helper so that the bounded resegmentation path added by a later patch can ask the same question without repeating the two expressions. Make the size limit lookup take the protocol as an argument, because that path has to ask for the limit of a protocol other than the one in skb->protocol. No functional changes. Assisted-by: LLM Signed-off-by: Wang Zhan <[email protected]> --- include/linux/netdevice.h | 4 ++-- net/core/dev.c | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1f0710eef185b..427d0d5b94e49 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -5570,10 +5570,10 @@ netif_get_gro_max_size(const struct net_device *dev, const struct sk_buff *skb) } static inline unsigned int -netif_get_gso_max_size(const struct net_device *dev, const struct sk_buff *skb) +netif_get_gso_max_size(const struct net_device *dev, __be16 protocol) { /* pairs with WRITE_ONCE() in netif_set_gso(_ipv4)_max_size() */ - return skb->protocol == htons(ETH_P_IPV6) ? + return protocol == htons(ETH_P_IPV6) ? READ_ONCE(dev->gso_max_size) : READ_ONCE(dev->gso_ipv4_max_size); } diff --git a/net/core/dev.c b/net/core/dev.c index c67900354fa64..16685888b2812 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3834,16 +3834,18 @@ static bool skb_gso_has_extension_hdr(const struct sk_buff *skb) skb_inner_network_header_len(skb) != sizeof(struct ipv6hdr))); } +static bool gso_within_device_limits(const struct sk_buff *skb, + const struct net_device *dev) +{ + return skb_shinfo(skb)->gso_segs <= READ_ONCE(dev->gso_max_segs) && + skb->len < netif_get_gso_max_size(dev, skb->protocol); +} + static netdev_features_t gso_features_check(const struct sk_buff *skb, struct net_device *dev, netdev_features_t features) { - u16 gso_segs = skb_shinfo(skb)->gso_segs; - - if (gso_segs > READ_ONCE(dev->gso_max_segs)) - return features & ~NETIF_F_GSO_MASK; - - if (unlikely(skb->len >= netif_get_gso_max_size(dev, skb))) + if (!gso_within_device_limits(skb, dev)) return features & ~NETIF_F_GSO_MASK; if (!skb_shinfo(skb)->gso_type) { -- 2.47.3