All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Lobakin <alobakin@pm.me>
To: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Cc: Alexander Lobakin <alobakin@pm.me>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Paolo Abeni <pabeni@redhat.com>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net] net: udp: fix Fast/frag0 UDP GRO
Date: Mon, 09 Nov 2020 16:42:44 +0000	[thread overview]
Message-ID: <XSgG3DIkTqqsRK6pTSfiht6Uyy0DaJYdPbHjPv1ac@cp4-web-027.plabs.ch> (raw)
In-Reply-To: <CA+FuTSfokZNJv2g2mCK284UTj7nN_-qXei42J4QWt7YniSrKog@mail.gmail.com>

From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: Mon, 9 Nov 2020 09:36:12 -0500

> On Sat, Nov 7, 2020 at 8:11 PM Alexander Lobakin <alobakin@pm.me> wrote:
>>
>> While testing UDP GSO fraglists forwarding through driver that uses
>> Fast GRO (via napi_gro_frags()), I was observing lots of out-of-order
>> iperf packets:
>>
>> [ ID] Interval           Transfer     Bitrate         Jitter
>> [SUM]  0.0-40.0 sec  12106 datagrams received out-of-order
>>
>> Simple switch to napi_gro_receive() any other method without frag0
>> shortcut completely resolved them.
>>
>> I've found that UDP GRO uses udp_hdr(skb) in its .gro_receive()
>> callback. While it's probably OK for non-frag0 paths (when all
>> headers or even the entire frame are already in skb->data), this
>> inline points to junk when using Fast GRO (napi_gro_frags() or
>> napi_gro_receive() with only Ethernet header in skb->data and all
>> the rest in shinfo->frags) and breaks GRO packet compilation and
>> the packet flow itself.
>> To support both modes, skb_gro_header_fast() + skb_gro_header_slow()
>> are typically used. UDP even has an inline helper that makes use of
>> them, udp_gro_udphdr(). Use that instead of troublemaking udp_hdr()
>> to get rid of the out-of-order delivers.
>>
>> Present since the introduction of plain UDP GRO in 5.0-rc1.
>>
>> Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.")
>> Signed-off-by: Alexander Lobakin <alobakin@pm.me>
>> ---
>>  net/ipv4/udp_offload.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
>> index e67a66fbf27b..13740e9fe6ec 100644
>> --- a/net/ipv4/udp_offload.c
>> +++ b/net/ipv4/udp_offload.c
>> @@ -366,7 +366,7 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
>>  static struct sk_buff *udp_gro_receive_segment(struct list_head *head,
>>                                                struct sk_buff *skb)
>>  {
>> -       struct udphdr *uh = udp_hdr(skb);
>> +       struct udphdr *uh = udp_gro_udphdr(skb);
>>         struct sk_buff *pp = NULL;
>>         struct udphdr *uh2;
>>         struct sk_buff *p;
>
> Good catch. skb_gro_header_slow may fail and return NULL. Need to
> check that before dereferencing uh below in

Ah, sure. It's very unlikely condition, but "better safe than sorry"
(c). Thanks, will do v2 soon.

>>         /* requires non zero csum, for symmetry with GSO */
>>         if (!uh->check) {
>>                 NAPI_GRO_CB(skb)->flush = 1;
>>                 return NULL;
>>         }

Al


      reply	other threads:[~2020-11-09 16:42 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-08  1:10 [PATCH net] net: udp: fix Fast/frag0 UDP GRO Alexander Lobakin
2020-11-09 14:36 ` Willem de Bruijn
2020-11-09 16:42   ` Alexander Lobakin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=XSgG3DIkTqqsRK6pTSfiht6Uyy0DaJYdPbHjPv1ac@cp4-web-027.plabs.ch \
    --to=alobakin@pm.me \
    --cc=davem@davemloft.net \
    --cc=kuba@kernel.org \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=willemdebruijn.kernel@gmail.com \
    --cc=yoshfuji@linux-ipv6.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.