Comment by jiehong

17 days ago

I think as an application, when receiving packets you never really see a coalesced UDP datagrams when GRO is active.

It’s more like the kernel puts multiple datagrams into a single structure and passes that around between layers, maintaining the boundaries between them in that structure (sk_buff data fragments?)

Not an expert, but I tried looking at how this works and stumbled upon [0].

[0]: https://lwn.net/Articles/768995/

You definitely see the coalesced datagram as an application. That is kind of the whole point: Passing a big buffer to the syscall and segment it in user-space to minimize the syscall overhead per packet.