Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3553141pxb; Mon, 9 Nov 2020 14:28:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJzJtRKcih0TggpyT3vbsVQjMCDOJe3vmZe36k5bRVBzM0m4KhRnWUjLU+naHkS6Brkfc1a0 X-Received: by 2002:a17:907:4302:: with SMTP id nh2mr16833917ejb.451.1604960911947; Mon, 09 Nov 2020 14:28:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604960911; cv=none; d=google.com; s=arc-20160816; b=WYqh3A3vOVSxL3ySQst4KBZi1iJfLrs/0uDB9pOAbWUZVyiURSlfK/e8hBKpxvP91h XUrjO2m1VgzdkuQ3l7nTiexQSdp+WNC+u1ja4c2KvhmwxGAftblynkqJODaA6NgE8X/j QcQjUMCibILjCSKpD1On+mHKILksUY+bgYXSZReRIhe8FsVu8TLZvA7GOrPnX1sUUMMi 1GJCNAE7JbloVPf1qUTJmkVVOYTMu/O0f6yd6JLa1DRn0NEO7zouZsW87UqD4Fx6vb/s ncHknjEjpTPijxbYL9mPYpN1L5R1GWxpc4JNi+qisW8PjCupICwrSA+cZMaFxmwVB55k colg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=7J1frim2Gmu7cnIZwRAm8GwdYdgbW4mQlO83f03DoX8=; b=UrV+MNWBv7zUZPm5Pc5dxSW/0IG3Jwi2qXO8HckNg63F0IafHnj9kcwF0fdOey5h9f 6nrU87uTfH9WJnFLxaQ/A0dhK9TW0jErRRdHIxRHVFe/ET72ks+aE0R2SdVJ87tRqaJS cwJtW8FD7iGWmzYfze3XyX5GA8uYx5eCea1f/ms74iKyR4lSL+PBVGk8dHLlSY/S3lxt ke7pAyOUFNOk1WuPZcMsSu8Q4leSwoIEMXa5RV840HDjYDmNSOvFduz6ckFwcNJvMd0L dc/2mGag/piu8sx2dQdNC8cOdLdV+JP2kvhufWQ+m7kicNE7vQ/niDBx94gdkHbm/zco FMMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=G2FkNP61; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qk1si7906357ejb.260.2020.11.09.14.28.08; Mon, 09 Nov 2020 14:28:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=G2FkNP61; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729585AbgKIWZK (ORCPT + 99 others); Mon, 9 Nov 2020 17:25:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729247AbgKIWZJ (ORCPT ); Mon, 9 Nov 2020 17:25:09 -0500 Received: from mail-ua1-x943.google.com (mail-ua1-x943.google.com [IPv6:2607:f8b0:4864:20::943]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7317AC0613CF for ; Mon, 9 Nov 2020 14:25:09 -0800 (PST) Received: by mail-ua1-x943.google.com with SMTP id k12so3311706uad.11 for ; Mon, 09 Nov 2020 14:25:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=7J1frim2Gmu7cnIZwRAm8GwdYdgbW4mQlO83f03DoX8=; b=G2FkNP618JGFUMp5BYl/j3zIMXpd90SRIlm1x34j85v/YAIKgp+G35i3I1ylf/zOeu SKeP6Ss3R+ceMRfgIdSz64Qhi86bNiaI+4OoNEKy/fg81IY/Z0YxtoldKvMjXo0WLVH2 m/nshf5OOgwHM0b1t+OO9kE1czwo1Vc14Ub4unnSL/N6rO2cOr8FTPZiTFCctDyWtjqe ffMSJy+7Z+v4NyScTdg25gfX3vNk5Uk1GcxO771JY390VqKE6QJbkgFJ6IsQfQT0bFjg shgbBgbPN6XMTc/JQJFhW4OLTPLGR5gRogZXTGMkcmkJOAlomWvgSNT5HV63ltNFkkto rr1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=7J1frim2Gmu7cnIZwRAm8GwdYdgbW4mQlO83f03DoX8=; b=ShjnnNIe/v2SzZSAMC8NIL80WN44xiKEASFoDQkG/YHdDcyGyXNCqUi8HhicNQk4bb p/3r6yzremHFDWvIWkmMvqcWe7pJvaYkzY5veARZyREdg5Us6SN8dP08wW/7MMVVe9P+ 2/uI5BCCDKtOSkO+qpVXIWEzs9UksNfMYrHhDSe/VN+G+Q9LTvicrPvtBa53WMuV6unU zEVWvfkKzY+Gg9ojST8Ez+sJhJbRc7sO+e8oqQADr1ljG6DJswq2teK45vY/5pQ3RCDP tEly8Cdg/NcJUAnW3AzQZ92sxinSXDvcXR7JnNaKoOLst5q/JHcFXxGP1tFp0wz5lgx6 3etQ== X-Gm-Message-State: AOAM5317pr7sVc4vB/ExxtWQWF3nHNvtYDZtW8V8RlDl8PtT8ZIDgOSu ENzUuOdcjuqUVrXRtyL8Lj5D8uXxUqU= X-Received: by 2002:ab0:2101:: with SMTP id d1mr7692768ual.125.1604960708105; Mon, 09 Nov 2020 14:25:08 -0800 (PST) Received: from mail-vs1-f49.google.com (mail-vs1-f49.google.com. [209.85.217.49]) by smtp.gmail.com with ESMTPSA id n190sm1379852vsn.34.2020.11.09.14.25.07 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 09 Nov 2020 14:25:07 -0800 (PST) Received: by mail-vs1-f49.google.com with SMTP id f7so5898457vsh.10 for ; Mon, 09 Nov 2020 14:25:07 -0800 (PST) X-Received: by 2002:a67:ed4b:: with SMTP id m11mr345672vsp.14.1604960706575; Mon, 09 Nov 2020 14:25:06 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Willem de Bruijn Date: Mon, 9 Nov 2020 17:24:30 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3 net] net: udp: fix Fast/frag0 UDP GRO To: Alexander Lobakin Cc: "David S. Miller" , Jakub Kicinski , Alexey Kuznetsov , Hideaki YOSHIFUJI , Paolo Abeni , Steffen Klassert , Network Development , linux-kernel Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Nov 9, 2020 at 4:15 PM Alexander Lobakin 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. > > Since v2 [1]: > - dropped redundant check introduced in v2 as it's performed right > before (thanks to Eric); > - udp_hdr() switched to data + off for skbs from list (also Eric); > - fixed possible malfunction of {,__}udp{4,6}_lib_lookup_skb() with > Fast/frag0 due to ip{,v6}_hdr() usage (Willem). > > Since v1 [2]: > - added a NULL pointer check for "uh" as suggested by Willem. > > [1] https://lore.kernel.org/netdev/0eaG8xtbtKY1dEKCTKUBubGiC9QawGgB3tVZtNqVdY@cp4-web-030.plabs.ch > [2] https://lore.kernel.org/netdev/YazU6GEzBdpyZMDMwJirxDX7B4sualpDG68ADZYvJI@cp4-web-034.plabs.ch > > Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.") > Signed-off-by: Alexander Lobakin > --- > net/ipv4/udp.c | 4 ++-- > net/ipv4/udp_offload.c | 9 ++++++--- > net/ipv6/udp.c | 4 ++-- > 3 files changed, 10 insertions(+), 7 deletions(-) > > diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c > index 09f0a23d1a01..948ddc9a0212 100644 > --- a/net/ipv4/udp.c > +++ b/net/ipv4/udp.c > @@ -534,7 +534,7 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb, > __be16 sport, __be16 dport, > struct udp_table *udptable) > { > - const struct iphdr *iph = ip_hdr(skb); > + const struct iphdr *iph = skb_gro_network_header(skb); This function is called from the normal UDP stack, not the GRO stack. It's not safe to use this helper here. > > return __udp4_lib_lookup(dev_net(skb->dev), iph->saddr, sport, > iph->daddr, dport, inet_iif(skb), > @@ -544,7 +544,7 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb, > struct sock *udp4_lib_lookup_skb(struct sk_buff *skb, > __be16 sport, __be16 dport) > { > - const struct iphdr *iph = ip_hdr(skb); > + const struct iphdr *iph = skb_gro_network_header(skb); This one is, but I think it would be preferable to avoid leaking this frag0 optimization stuff outside of the core GRO code if we can help it. Also haven't checked whether that helper is safe to call from .gro_complete handlers such as udp_gro_complete. It's not needed there, in any case. Instead, perhaps we can call __udp4_lib_lookup which takes the exact fields as arguments, and do the network header lookup in udp_gro_complete itself. Less important (because it's not working before), does the use of skb_gro_network_header break any nested tunnel support that the p->data + off change would add?