Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp476886imm; Fri, 14 Sep 2018 01:15:13 -0700 (PDT) X-Google-Smtp-Source: ANB0Vdbb4VHpS4KTta92grsVhcRg2DkXFgLkQ5qqfdyrqQ3ceJI57FkkXMifn4rYHDUkXlmm1l9D X-Received: by 2002:a17:902:4503:: with SMTP id m3-v6mr10866158pld.168.1536912913776; Fri, 14 Sep 2018 01:15:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536912913; cv=none; d=google.com; s=arc-20160816; b=FJpSWYIlwh+IwlV+d2wIVWJxA3HA7Lj3SEapQvTe2PWR3X1cCXGSebgjQEqBQkT6pl gtbK1rLfAWZp+dJn9qwQaeygI5eutje9f8T941O36zUt+onkKWsIDoAkWmKMHPN5ncWp StFoE2T+i8UGkZ0O7iUmUeBTTQXB/FQhR6UeiQM48cp8M3K5UVduu9BcjNucxFLBdXmv nmXR0K2ub3zwV2aLnVChfN71gmNf6FmR0LoRNqxCxQghH7ioQ0jFQwrZNBn65+hlmSUE 1sMbzsX+Vc5Bh6GRx9vR1EddhdI4gNCnqWkrbrt1qcrDD/IU/9IvixhIr1s29o5bh+Vw 0rGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:to:from; bh=vXlqD61lJVrLRQKPfhDUjB4Csmic/etE7/Pkv1pp2Jk=; b=jgZs6ClUMxvIbOp1ddCwoJXtZYb4/8sL9A4/kiKkAj33qTNEQz1To6c/hutCWf9np8 HW0+96m96ZXf07qGCBGgAGlhn8pWmXEXnXjwPv/9T1ZAGcf06L1vRpJhTZcdC/j5laT7 Iaf/muN7FN6VBsZM+gHDjGxhZOujz6GXHdlS1wGoI5ppzNWDR0siBk6yb0pI912Yv8lw uRyfKJgYqFpcOMj2Ar7LLZJGnMpbTCg5r27GeevRaJhQglqnanmKWFxjNEzCF7RSlfqE JroXHSotk8t/R28FESCh0Lo8tYrvFk3/0q6qcfktw29GD0pt8ANIsxEyyYVeCJM0WvQs izQw== ARC-Authentication-Results: i=1; mx.google.com; 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 s68-v6si6690323pgc.16.2018.09.14.01.14.58; Fri, 14 Sep 2018 01:15:13 -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; 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 S1728179AbeINN1z (ORCPT + 99 others); Fri, 14 Sep 2018 09:27:55 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:12133 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726918AbeINN1y (ORCPT ); Fri, 14 Sep 2018 09:27:54 -0400 Received: from DGGEMS410-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id D8BC02859DF68; Fri, 14 Sep 2018 16:14:29 +0800 (CST) Received: from localhost.localdomain.localdomain (10.175.113.25) by DGGEMS410-HUB.china.huawei.com (10.3.19.210) with Microsoft SMTP Server id 14.3.399.0; Fri, 14 Sep 2018 16:14:25 +0800 From: Mao Wenan To: , , , , , , , Subject: [PATCH stable 4.4 V2 6/6] tcp: add tcp_ooo_try_coalesce() helper Date: Fri, 14 Sep 2018 16:24:10 +0800 Message-ID: <1536913450-12380-7-git-send-email-maowenan@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1536913450-12380-1-git-send-email-maowenan@huawei.com> References: <1536913450-12380-1-git-send-email-maowenan@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.113.25] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Dumazet [ Upstream commit 58152ecbbcc6a0ce7fddd5bf5f6ee535834ece0c ] In case skb in out_or_order_queue is the result of multiple skbs coalescing, we would like to get a proper gso_segs counter tracking, so that future tcp_drop() can report an accurate number. I chose to not implement this tracking for skbs in receive queue, since they are not dropped, unless socket is disconnected. Signed-off-by: Eric Dumazet Acked-by: Soheil Hassas Yeganeh Acked-by: Yuchung Cheng Signed-off-by: David S. Miller Signed-off-by: Mao Wenan --- net/ipv4/tcp_input.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index cbe0ca0..1aff93d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -4296,6 +4296,23 @@ static bool tcp_try_coalesce(struct sock *sk, return true; } +static bool tcp_ooo_try_coalesce(struct sock *sk, + struct sk_buff *to, + struct sk_buff *from, + bool *fragstolen) +{ + bool res = tcp_try_coalesce(sk, to, from, fragstolen); + + /* In case tcp_drop() is called later, update to->gso_segs */ + if (res) { + u32 gso_segs = max_t(u16, 1, skb_shinfo(to)->gso_segs) + + max_t(u16, 1, skb_shinfo(from)->gso_segs); + + skb_shinfo(to)->gso_segs = min_t(u32, gso_segs, 0xFFFF); + } + return res; +} + static void tcp_drop(struct sock *sk, struct sk_buff *skb) { sk_drops_add(sk, skb); @@ -4422,7 +4439,8 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) /* In the typical case, we are adding an skb to the end of the list. * Use of ooo_last_skb avoids the O(Log(N)) rbtree lookup. */ - if (tcp_try_coalesce(sk, tp->ooo_last_skb, skb, &fragstolen)) { + if (tcp_ooo_try_coalesce(sk, tp->ooo_last_skb, + skb, &fragstolen)) { coalesce_done: tcp_grow_window(sk, skb); kfree_skb_partial(skb, fragstolen); @@ -4467,7 +4485,8 @@ coalesce_done: tcp_drop(sk, skb1); goto merge_right; } - } else if (tcp_try_coalesce(sk, skb1, skb, &fragstolen)) { + } else if (tcp_ooo_try_coalesce(sk, skb1, + skb, &fragstolen)) { goto coalesce_done; } p = &parent->rb_right; -- 1.8.3.1