Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3391102ybp; Sun, 6 Oct 2019 10:54:24 -0700 (PDT) X-Google-Smtp-Source: APXvYqwCl8V0lCxVcE8wWRclmJZ1WS79cIrCvSLBHWKfztKwZq1SstoWCPvM9xJsBIDErssgaSiP X-Received: by 2002:a17:906:c310:: with SMTP id s16mr21066023ejz.178.1570384464743; Sun, 06 Oct 2019 10:54:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570384464; cv=none; d=google.com; s=arc-20160816; b=qy16TTQOG1oTgjOdbEbRvabiq2ImOld2yGMk7ORV5xz8jS6IIJzQJnkk/JDjS1fw2E hPlSBqqQ1i3ConsKzCcj6xSOXeZW03RVulajE5jZYyBCKkf/RzVQ7qQ0xE2T8ESeF73b g2mmFyPa4QqD0gd3bNtr0CUyNxcURi2BQU+gtmxsJoIQ7AQVzYb5SSMvrClRjsKaF3TP XtMNc4JmWDWjK9y6o/zftwQJzRZyEDmPbaYQZzsfEzCKkmEK+fbtP4f3b7xWu7SI8yTe pU6nBf/gbbGAec8NGHPpZDoRxpG5MYvFCQ+1uGw04gxm0d11vyeUBR6hlab3pzSANKLO 2uuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=b87vl5w1I07tpvUeak9IxFiDeQRWxb5kxSBJQw4WuLk=; b=WHSvOxTkfk/oOP5gYxU+jY2qUdxFwH4+Af07H78aN1I1ZjLwrdwgdx+03y6R16laSr KluLtTgdoxE6k/MeNJK5QmL26dMKK0q5kecbQbu3YChn6fI2YtJhcThjHDZesYgR7Xvp 9MW6jEAqqrJfDZzf4zD/bTRVa3NGV+7yRlLhBSH7rzYXT4Z51t9f9VekH/gsvKKct2Yt 2EZ7YNqTJ0eKwb5FPCeZN5OmDEDYh254mGXMaoNFtsVFPjDBluPPN/Df8tpwXm+R7AIt wCvC5D3Tm1WG+iTCSLTIt8Y0Rxp+oNxA4qmTjWBQEUfcSrk3uRLfAvbOOFddUlEWStjx EHhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gZDAQruD; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bt6si7105528edb.69.2019.10.06.10.54.01; Sun, 06 Oct 2019 10:54:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gZDAQruD; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729876AbfJFRu7 (ORCPT + 99 others); Sun, 6 Oct 2019 13:50:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:48964 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726984AbfJFRuz (ORCPT ); Sun, 6 Oct 2019 13:50:55 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 95173217F9; Sun, 6 Oct 2019 17:45:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383925; bh=KKjC7cI+5h5CVGidPc9+DB5Om89zRlr5+ongFW5KqAk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gZDAQruDMEJLobMPzSSdeMLpAz/tFrrMnOZKb2O9EYmvky4tYeqOBrZwrP8O7iGTW JiNeKst5RWCCBdhfxGKiHS3XC29eofxQp/n9v8XyPWb+HukagBerrSQm2nTF0yUB92 skWOAkjtPp4GfpBFo3XtbTxnCXO+/wRYn1nuCIpo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Josh Hunt , Willem de Bruijn , Alexander Duyck , "David S. Miller" Subject: [PATCH 5.3 147/166] udp: only do GSO if # of segs > 1 Date: Sun, 6 Oct 2019 19:21:53 +0200 Message-Id: <20191006171225.311971320@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171212.850660298@linuxfoundation.org> References: <20191006171212.850660298@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Josh Hunt [ Upstream commit 4094871db1d65810acab3d57f6089aa39ef7f648 ] Prior to this change an application sending <= 1MSS worth of data and enabling UDP GSO would fail if the system had SW GSO enabled, but the same send would succeed if HW GSO offload is enabled. In addition to this inconsistency the error in the SW GSO case does not get back to the application if sending out of a real device so the user is unaware of this failure. With this change we only perform GSO if the # of segments is > 1 even if the application has enabled segmentation. I've also updated the relevant udpgso selftests. Fixes: bec1f6f69736 ("udp: generate gso with UDP_SEGMENT") Signed-off-by: Josh Hunt Reviewed-by: Willem de Bruijn Reviewed-by: Alexander Duyck Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/ipv4/udp.c | 11 +++++++---- net/ipv6/udp.c | 11 +++++++---- tools/testing/selftests/net/udpgso.c | 16 ++++------------ 3 files changed, 18 insertions(+), 20 deletions(-) --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -821,6 +821,7 @@ static int udp_send_skb(struct sk_buff * int is_udplite = IS_UDPLITE(sk); int offset = skb_transport_offset(skb); int len = skb->len - offset; + int datalen = len - sizeof(*uh); __wsum csum = 0; /* @@ -854,10 +855,12 @@ static int udp_send_skb(struct sk_buff * return -EIO; } - skb_shinfo(skb)->gso_size = cork->gso_size; - skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; - skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(*uh), - cork->gso_size); + if (datalen > cork->gso_size) { + skb_shinfo(skb)->gso_size = cork->gso_size; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; + skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(datalen, + cork->gso_size); + } goto csum_partial; } --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1109,6 +1109,7 @@ static int udp_v6_send_skb(struct sk_buf __wsum csum = 0; int offset = skb_transport_offset(skb); int len = skb->len - offset; + int datalen = len - sizeof(*uh); /* * Create a UDP header @@ -1141,10 +1142,12 @@ static int udp_v6_send_skb(struct sk_buf return -EIO; } - skb_shinfo(skb)->gso_size = cork->gso_size; - skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; - skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(*uh), - cork->gso_size); + if (datalen > cork->gso_size) { + skb_shinfo(skb)->gso_size = cork->gso_size; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; + skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(datalen, + cork->gso_size); + } goto csum_partial; } --- a/tools/testing/selftests/net/udpgso.c +++ b/tools/testing/selftests/net/udpgso.c @@ -89,12 +89,9 @@ struct testcase testcases_v4[] = { .tfail = true, }, { - /* send a single MSS: will fail with GSO, because the segment - * logic in udp4_ufo_fragment demands a gso skb to be > MTU - */ + /* send a single MSS: will fall back to no GSO */ .tlen = CONST_MSS_V4, .gso_len = CONST_MSS_V4, - .tfail = true, .r_num_mss = 1, }, { @@ -139,10 +136,9 @@ struct testcase testcases_v4[] = { .tfail = true, }, { - /* send a single 1B MSS: will fail, see single MSS above */ + /* send a single 1B MSS: will fall back to no GSO */ .tlen = 1, .gso_len = 1, - .tfail = true, .r_num_mss = 1, }, { @@ -196,12 +192,9 @@ struct testcase testcases_v6[] = { .tfail = true, }, { - /* send a single MSS: will fail with GSO, because the segment - * logic in udp4_ufo_fragment demands a gso skb to be > MTU - */ + /* send a single MSS: will fall back to no GSO */ .tlen = CONST_MSS_V6, .gso_len = CONST_MSS_V6, - .tfail = true, .r_num_mss = 1, }, { @@ -246,10 +239,9 @@ struct testcase testcases_v6[] = { .tfail = true, }, { - /* send a single 1B MSS: will fail, see single MSS above */ + /* send a single 1B MSS: will fall back to no GSO */ .tlen = 1, .gso_len = 1, - .tfail = true, .r_num_mss = 1, }, {