Messages in this thread | | | From | Eric Dumazet <> | Date | Wed, 22 Feb 2023 16:41:51 +0100 | Subject | Re: [PATCH v2 2/2] gro: optimise redundant parsing of packets |
| |
On Wed, Feb 22, 2023 at 4:13 PM Richard Gobert <richardbgobert@gmail.com> wrote: > > Currently the IPv6 extension headers are parsed twice: first in > ipv6_gro_receive, and then again in ipv6_gro_complete. > > By using the new ->transport_proto field, and also storing the size of the > network header, we can avoid parsing extension headers a second time in > ipv6_gro_complete (which saves multiple memory dereferences and conditional > checks inside ipv6_exthdrs_len for a varying amount of extension headers in IPv6 > packets). > > The implementation had to handle both inner and outer layers in case of > encapsulation (as they can't use the same field). > > Performance tests for TCP stream over IPv6 with a varying amount of extension > headers demonstrate throughput improvement of ~0.7%. > > In addition, I fixed a potential existing problem: > - The call to skb_set_inner_network_header at the beginning of > ipv6_gro_complete calculates inner_network_header based on skb->data by > calling skb_set_inner_network_header, and setting it to point to the beginning > of the ip header. > - If a packet is going to be handled by BIG TCP, the following code block is > going to shift the packet header, and skb->data is going to be changed as > well. > > When the two flows are combined, inner_network_header will point to the wrong > place.
net-next is closed.
If you think a fix is needed, please send a stand-alone and minimal patch so that we can discuss its merit.
Note :
BIG TCP only supports native IPv6, not encapsulated traffic, so we should not bother with inner_network_header yet.
| |