]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
virtio_net: add supports for extended offloads
authorPaolo Abeni <pabeni@redhat.com>
Tue, 8 Jul 2025 15:54:57 +0000 (17:54 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 8 Jul 2025 16:05:33 +0000 (18:05 +0200)
The virtio_net driver needs it to implement GSO over UDP tunnel
offload.

The only missing piece is mapping them to/from the extended
features.

Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/virtio_net.c

index 5d674eb9a0f2c60c0bf537b72ab6c736545c6a39..a32c556a725c242abddbdce4023948ff8330789e 100644 (file)
@@ -35,6 +35,23 @@ module_param(csum, bool, 0444);
 module_param(gso, bool, 0444);
 module_param(napi_tx, bool, 0644);
 
+#define VIRTIO_OFFLOAD_MAP_MIN 46
+#define VIRTIO_OFFLOAD_MAP_MAX 47
+#define VIRTIO_FEATURES_MAP_MIN        65
+#define VIRTIO_O2F_DELTA       (VIRTIO_FEATURES_MAP_MIN - \
+                                VIRTIO_OFFLOAD_MAP_MIN)
+
+static bool virtio_is_mapped_offload(unsigned int obit)
+{
+       return obit >= VIRTIO_OFFLOAD_MAP_MIN &&
+              obit <= VIRTIO_OFFLOAD_MAP_MAX;
+}
+
+static unsigned int virtio_offload_to_feature(unsigned int obit)
+{
+       return virtio_is_mapped_offload(obit) ? obit + VIRTIO_O2F_DELTA : obit;
+}
+
 /* FIXME: MTU in config. */
 #define GOOD_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN)
 #define GOOD_COPY_LEN  128
@@ -7066,9 +7083,13 @@ static int virtnet_probe(struct virtio_device *vdev)
                netif_carrier_on(dev);
        }
 
-       for (i = 0; i < ARRAY_SIZE(guest_offloads); i++)
-               if (virtio_has_feature(vi->vdev, guest_offloads[i]))
+       for (i = 0; i < ARRAY_SIZE(guest_offloads); i++) {
+               unsigned int fbit;
+
+               fbit = virtio_offload_to_feature(guest_offloads[i]);
+               if (virtio_has_feature(vi->vdev, fbit))
                        set_bit(guest_offloads[i], &vi->guest_offloads);
+       }
        vi->guest_offloads_capable = vi->guest_offloads;
 
        rtnl_unlock();