From patchwork Wed May 16 23:40:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuchung Cheng X-Patchwork-Id: 915016 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="j2ozgPBO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mWCp1sY2z9s1B for ; Thu, 17 May 2018 09:41:10 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752044AbeEPXkw (ORCPT ); Wed, 16 May 2018 19:40:52 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:37554 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751984AbeEPXkt (ORCPT ); Wed, 16 May 2018 19:40:49 -0400 Received: by mail-wm0-f65.google.com with SMTP id l1-v6so5771493wmb.2 for ; Wed, 16 May 2018 16:40:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JRCU66xhNE0CNPJv49O2TGAPNchnP44WInBqDAUzIJA=; b=j2ozgPBOTEDdMksB0vJnTogtnJ6/o2naYq953aTEy3SrHCxHQlEnAsRq3XgSZFwaWN bJXzP0fsd1RRlLkY6eF2NIMv12aLTfJMKHRyMa9L5ory94UUZnYhovhvY3usOZMQPfG3 P2T1WsSb1C3YoQ1KUtTipfns4oVMEJ77qPTyTvLpvvh4alvIKYLhZgy5VtD9XQWneweq lSKVl97zRrxdvB1g/zDopvLq1MoxvChgQsqoJ3uDNlqga6LxEHN2xVUyP5+sJKqrYZ6t 8cYRhkm4WP9Y/eVS1Q3OUVkBf303DDuuIXDUNX875EaQqrkQmSDSsrrAncLdh867U5/k 77Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JRCU66xhNE0CNPJv49O2TGAPNchnP44WInBqDAUzIJA=; b=IdEOnvex3QmIlTXt5LCgGia0ikDV3Vi1LMY7sO4Omsr7pmvSQ/mmsXRIYPYHisRR7y B/y6VNDBcCDklvEKl2Y4MgKhgDXEFbWym669E9aQjPGe16a+4q2ToUuzEHFAo6MZfR3O oyB6aSix2/lNeGciui5MraYg/2lB4w1TxaT/1Gr7lVBHOLL3i935d4BFhC6jEX4O6f0N 7/oig0b+RLXA1jdqNzK9PjjGF6hvhbKSZSvyqUGE7I0yu3tRWHQURPH5hwzvHMk9BCM5 6hF1zvt5nWFRF2xoQ7HoO5HaYmjXf4NFtVzLxJOGelIUht00+AOsc5GPBjGi1YDFBQGX tS4A== X-Gm-Message-State: ALKqPwfTHXpDEUG4tpiuVwgOXP8LoFtplzY7tpdR9IRFdC/ncHrH76xF Q6VLv6ij/BHQ2/CmN9CCH2EpHA== X-Google-Smtp-Source: AB8JxZpXq5A3jtSDwzSxFJvKSnx2974elpW+wqjPlztDfbkVOHi5IBIWaUlGk+EEGWfVaU7ZeVUKUw== X-Received: by 2002:a1c:acc2:: with SMTP id v185-v6mr167634wme.67.1526514047391; Wed, 16 May 2018 16:40:47 -0700 (PDT) Received: from ycheng2.svl.corp.google.com ([2620:15c:2c4:201:d660:6c0b:8a4f:4c77]) by smtp.gmail.com with ESMTPSA id b11-v6sm4796488wrf.50.2018.05.16.16.40.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 May 2018 16:40:46 -0700 (PDT) From: Yuchung Cheng To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, ncardwell@google.com, soheil@google.com, priyarjha@google.com, Yuchung Cheng Subject: [PATCH net-next 5/8] tcp: new helper tcp_timeout_mark_lost Date: Wed, 16 May 2018 16:40:14 -0700 Message-Id: <20180516234017.172775-6-ycheng@google.com> X-Mailer: git-send-email 2.17.0.441.gb46fe60e1d-goog In-Reply-To: <20180516234017.172775-1-ycheng@google.com> References: <20180516234017.172775-1-ycheng@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Refactor using a new helper, tcp_timeout_mark_loss(), that marks packets lost upon RTO. Signed-off-by: Yuchung Cheng Signed-off-by: Neal Cardwell Reviewed-by: Eric Dumazet Reviewed-by: Soheil Hassas Yeganeh Reviewed-by: Priyaranjan Jha --- net/ipv4/tcp_input.c | 50 +++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 6fb0a28977a0..af32accda2a9 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -1917,18 +1917,43 @@ static inline void tcp_init_undo(struct tcp_sock *tp) tp->undo_retrans = tp->retrans_out ? : -1; } -/* Enter Loss state. If we detect SACK reneging, forget all SACK information +/* If we detect SACK reneging, forget all SACK information * and reset tags completely, otherwise preserve SACKs. If receiver * dropped its ofo queue, we will know this due to reneging detection. */ +static void tcp_timeout_mark_lost(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct sk_buff *skb; + bool is_reneg; /* is receiver reneging on SACKs? */ + + skb = tcp_rtx_queue_head(sk); + is_reneg = skb && (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED); + if (is_reneg) { + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSACKRENEGING); + tp->sacked_out = 0; + /* Mark SACK reneging until we recover from this loss event. */ + tp->is_sack_reneg = 1; + } else if (tcp_is_reno(tp)) { + tcp_reset_reno_sack(tp); + } + + skb_rbtree_walk_from(skb) { + if (is_reneg) + TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED; + tcp_mark_skb_lost(sk, skb); + } + tcp_verify_left_out(tp); + tcp_clear_all_retrans_hints(tp); +} + +/* Enter Loss state. */ void tcp_enter_loss(struct sock *sk) { const struct inet_connection_sock *icsk = inet_csk(sk); struct tcp_sock *tp = tcp_sk(sk); struct net *net = sock_net(sk); - struct sk_buff *skb; bool new_recovery = icsk->icsk_ca_state < TCP_CA_Recovery; - bool is_reneg; /* is receiver reneging on SACKs? */ /* Reduce ssthresh if it has not yet been made inside this window. */ if (icsk->icsk_ca_state <= TCP_CA_Disorder || @@ -1944,24 +1969,7 @@ void tcp_enter_loss(struct sock *sk) tp->snd_cwnd_cnt = 0; tp->snd_cwnd_stamp = tcp_jiffies32; - if (tcp_is_reno(tp)) - tcp_reset_reno_sack(tp); - - skb = tcp_rtx_queue_head(sk); - is_reneg = skb && (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED); - if (is_reneg) { - NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSACKRENEGING); - tp->sacked_out = 0; - /* Mark SACK reneging until we recover from this loss event. */ - tp->is_sack_reneg = 1; - } - skb_rbtree_walk_from(skb) { - if (is_reneg) - TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED; - tcp_mark_skb_lost(sk, skb); - } - tcp_verify_left_out(tp); - tcp_clear_all_retrans_hints(tp); + tcp_timeout_mark_lost(sk); /* Timeout in disordered state after receiving substantial DUPACKs * suggests that the degree of reordering is over-estimated.