In a June 2006 post to the email@example.com mailing list, Herbert Xu explained GSO (Generic Segmentation Offload). Before GSO, Linux had separate support for Large-Send Offload (LSO) for TCP (called "TSO" or TCP Segmentation Offload) and for UDP (called "UFO" or UDP Fragmentation Offload), but only for devices that have hardware "offloading" support for these features.
The idea behind GSO is that many of the performance benefits of LSO (TSO/UFO/...) can be obtained in a hardware-independent way, by passing large "superpackets" around for as long as possible, and deferring segmentation to the last possible moment - for devices without hardware segmentation/fragmentation support, this would be when data is actually handled to the device driver; for devices with hardware support, it could even be done in hardware.
The GSO code was added to the Linux kernel tree in 2.6.18.
In February 2018, a patch to the Linux kernel was submitted by Éric Dumazet (Google) to always enable GSO for TCP. The rationale is that most TCP optimizations now assume GSO is used. The immediate problem solved by this patch is that the built-in pacing for BBR became a performance bottleneck when "small" (non-GSO) segments were used.
- GSO Definition, Networking Workgroup, Linux Foundation
- GSO: Generic Segmentation Offload, Herbert Xu, LWN.net, June 2006
-- Main.SimonLeinen - 2018-06-25