From patchwork Wed Mar 6 20:52:09 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuchung Cheng X-Patchwork-Id: 225650 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 7700A2C0375 for ; Thu, 7 Mar 2013 07:52:27 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753803Ab3CFUwX (ORCPT ); Wed, 6 Mar 2013 15:52:23 -0500 Received: from mail-ye0-f201.google.com ([209.85.213.201]:61782 "EHLO mail-ye0-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752551Ab3CFUwV (ORCPT ); Wed, 6 Mar 2013 15:52:21 -0500 Received: by mail-ye0-f201.google.com with SMTP id m12so914126yen.2 for ; Wed, 06 Mar 2013 12:52:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=i+mJSuSNTQpPZaZGLtCnzvn+YtGTJokX9s5VaHKINOY=; b=etNfDOEKFB3MAqzTRyugs51KOQgBbznpKVG4p8PFL3uXoVC4xpVsNhWkap3LZy2feE 04KGRNmNeEgK8g2vfuTuOLI86hlQq9wZfkomb63k88HO+jSFQOsClgjf/sFu8KRct765 LyKRZYtBaQlii+u8HR3XnDo8U41vw4S0vdIKpH0wzdLbHOctcly6OX7bRInaRuVTYrSr ZBLJu7/jbfeo4YHRutQvNqfxuq1Y7J4Sylo9IHy+Ta2A7s06YPp8e/Qtte11qCUt+haZ FU/oKSSQcatNIktZBVeNHgptfLQW4lKlHfWraGZYi1bEUgXFp3pj2ZbZMTyccUNIwv1X Z0Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=i+mJSuSNTQpPZaZGLtCnzvn+YtGTJokX9s5VaHKINOY=; b=JRirVMyio3PZQLVLehgJ4fNEocAKL6V5DYjpXr4rJ7g2Prd3XkLq51sPh7XShQEgwH FddXmwFgQ9KRo1ObfDtG8nsYOiW7c6UB/i7MrRyg+sNOyC87Nh9jzX23GDS2AHnczcwv kgQebCQS1NLegswmBMsR8lgpWTmdexs9jRNBZtxepGaKul8UdduZCTBdUUMd73b49MjZ TdaSY4AhmA28/vzzX7h4O5IRfxbrGqdM8ojv6zaHsvKwdYb7iCUWo9Xr+LB7CNMQoPU/ EzFpRNZUSTaH0pR5j4lzkCnGBy7fglnN5odE3UyyreZy7nLJholwBBJVxbwx3U8cUKWR wW2g== X-Received: by 10.236.126.194 with SMTP id b42mr18277712yhi.23.1362603141210; Wed, 06 Mar 2013 12:52:21 -0800 (PST) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id f64si658832yhj.7.2013.03.06.12.52.21 (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Wed, 06 Mar 2013 12:52:21 -0800 (PST) Received: from blast2.mtv.corp.google.com (blast2.mtv.corp.google.com [172.17.132.164]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id 12D8E31C241; Wed, 6 Mar 2013 12:52:21 -0800 (PST) Received: by blast2.mtv.corp.google.com (Postfix, from userid 5463) id B8802222C7F; Wed, 6 Mar 2013 12:52:20 -0800 (PST) From: Yuchung Cheng To: davem@davemloft.net, ncardwell@google.com, edumazet@google.com, nanditad@google.com Cc: ilpo.jarvinen@cs.helsinki.fi, netdev@vger.kernel.org, Yuchung Cheng Subject: [PATCH 2/3 net-next] tcp: refactor CA_Loss state processing Date: Wed, 6 Mar 2013 12:52:09 -0800 Message-Id: <1362603130-16501-2-git-send-email-ycheng@google.com> X-Mailer: git-send-email 1.8.1.3 In-Reply-To: <1362603130-16501-1-git-send-email-ycheng@google.com> References: <1362603130-16501-1-git-send-email-ycheng@google.com> X-Gm-Message-State: ALoCoQmUOi+frVu7ShuFBg708mB72QWIHqGUoNEvBCE0xcU76Z0qSwNegW0s3c6/pkm2ZYWw7RHXZtmHl2Jz7d8iJiBJSIX5iv4y9Lzs2+4rMRbm4EmRcwsod1cd+i5KSpfvJ+7GD2VrXmdDEa5mfxBhNEFBwv71zSUu3lSBlhouY5jJIoTdDnRGDoTMMqBhAIcLD6P5I2Ue Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Consolidate all of TCP CA_Loss state processing in tcp_fastretrans_alert() into a new function called tcp_process_loss(). This is to prepare the new F-RTO implementation in the next patch. Signed-off-by: Yuchung Cheng Acked-by: Neal Cardwell --- net/ipv4/tcp_input.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9933b6b..07a05e0 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2662,6 +2662,30 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack) tcp_set_ca_state(sk, TCP_CA_Recovery); } +/* Process an ACK in CA_Loss state. Move to CA_Open if lost data are + * recovered or spurious. Otherwise retransmits more on partial ACKs. + */ +static void tcp_process_loss(struct sock *sk, int flag) +{ + struct inet_connection_sock *icsk = inet_csk(sk); + struct tcp_sock *tp = tcp_sk(sk); + + if (!before(tp->snd_una, tp->high_seq)) { + icsk->icsk_retransmits = 0; + tcp_try_undo_recovery(sk); + return; + } + + if (flag & FLAG_DATA_ACKED) + icsk->icsk_retransmits = 0; + if (tcp_is_reno(tp) && flag & FLAG_SND_UNA_ADVANCED) + tcp_reset_reno_sack(tp); + if (tcp_try_undo_loss(sk)) + return; + tcp_moderate_cwnd(tp); + tcp_xmit_retransmit_queue(sk); +} + /* Process an event, which can update packets-in-flight not trivially. * Main goal of this function is to calculate new estimate for left_out, * taking into account both packets sitting in receiver's buffer and @@ -2708,12 +2732,6 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, tp->retrans_stamp = 0; } else if (!before(tp->snd_una, tp->high_seq)) { switch (icsk->icsk_ca_state) { - case TCP_CA_Loss: - icsk->icsk_retransmits = 0; - if (tcp_try_undo_recovery(sk)) - return; - break; - case TCP_CA_CWR: /* CWR is to be held something *above* high_seq * is ACKed for CWR bit to reach receiver. */ @@ -2744,18 +2762,10 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; break; case TCP_CA_Loss: - if (flag & FLAG_DATA_ACKED) - icsk->icsk_retransmits = 0; - if (tcp_is_reno(tp) && flag & FLAG_SND_UNA_ADVANCED) - tcp_reset_reno_sack(tp); - if (!tcp_try_undo_loss(sk)) { - tcp_moderate_cwnd(tp); - tcp_xmit_retransmit_queue(sk); - return; - } + tcp_process_loss(sk, flag); if (icsk->icsk_ca_state != TCP_CA_Open) return; - /* Loss is undone; fall through to processing in Open state. */ + /* Fall through to processing in Open state. */ default: if (tcp_is_reno(tp)) { if (flag & FLAG_SND_UNA_ADVANCED)