On 9/19/26 17:37, Willem de Bruijn wrote:
@@ -4088,10 +4168,29 @@ static struct sk_buff *validate_xmit_skb(struct sk_buff 
*skb, struct net_device
        if (unlikely(!skb))
                goto out_null;
- if (netif_needs_gso(skb, features)) {
+       /*
+        * An oversized skb loses its GSO feature bits and is segmented
+        * down to MSS sized skbs below.  A TCP skb can instead be split
+        * into GSO skbs which do fit the device, so keep the bits and
+        * bound the resegmentation.  The features computed without the
+        * limit checks say whether the device offloads the GSO type at
+        * all.
+        */
+       if (skb_is_gso(skb) && skb_is_gso_tcp(skb) && !skb->encapsulation &&
+           !gso_within_device_limits(skb, dev)) {
+               netdev_features_t offload = __netif_skb_features(skb, false);
+
+               resegment_max_segs =
+                       skb_gso_resegment_max_segs(skb, dev, offload);
+               if (resegment_max_segs)
+                       features = offload;
+       }
+

This is a lot to put in the hot path for a rare use case.

+1

Consider how to make this less expensive.
I think that performing all the resegs check only in the

        netif_needs_gso(skb, features)

case would address this concern.

/P

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to