From patchwork Wed Mar 20 23:32:59 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuchung Cheng X-Patchwork-Id: 229522 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 56E1C2C00B6 for ; Thu, 21 Mar 2013 10:40:39 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754430Ab3CTXkf (ORCPT ); Wed, 20 Mar 2013 19:40:35 -0400 Received: from mail-ye0-f201.google.com ([209.85.213.201]:44622 "EHLO mail-ye0-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754347Ab3CTXke (ORCPT ); Wed, 20 Mar 2013 19:40:34 -0400 Received: by mail-ye0-f201.google.com with SMTP id m12so212451yen.4 for ; Wed, 20 Mar 2013 16:40:33 -0700 (PDT) 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=/9wzVHXXAlaMHaKvG40dHyL1YqhQsMOqFyzoIRMgNEA=; b=C8z6doNc+bsXIhNLInqOi/B2aPvvlf7PR6TIFzwfDuUsmCrLYehkPL6rUd6WqKXsMy X/lLy39+awee6Hx1RCYIGBZgfgHyKUxiBfLF/n34JkDhEoIU2dlcf1qI+X319MykgXcG cjn/ujaR5k7UATglC2xwWnMka6cm5Fcrq34VFl7W8U/awAcUShl2d468ywhNtPCTfKLE vCSVtUSba0j3Wqa+RM7NeT/iI50jsRkMkDPDLRmy2jjgp+VFfi1DZx+wuQE5ZfBFAnDh oMPIcURpinsQOHPMSN3E07CQSKEdVIqBqwgQ0+lICAuSqxemLLQ5oDSy0f6z16qM2z/X 1VJw== 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=/9wzVHXXAlaMHaKvG40dHyL1YqhQsMOqFyzoIRMgNEA=; b=lXzGLF038WkIDMmkxXDRf51kZXqurpRHy/TJtBK2jtwr0bemkH10+xNuz2ovFEu4Do S2yjEvXc4LUXqSZh1dXSkSD9CNqOqWU7CzHtbg//TWzXNDlkamAvXdAGjRs2uUGuc3nY p8/CJqOttoVQaBdOHQJ8GRLFmo8EkObNyr4hCyLjCc3DvoJmKlNefpTpJFkx6fXHBZl4 xeFGDawKSJWFVVXDKg7XKYHWWWj4cq2LGkaYBmTuXNjcLWx/ax7RHpC0JMabQ5/WdlE6 AMYaGOfTbzd+D6D22BwNGtXWxiHkzdUW21Wj62SK0z5BFdgFYX+V7kb3zQeMWzttGuAJ sETw== X-Received: by 10.224.110.68 with SMTP id m4mr4468754qap.2.1363822394011; Wed, 20 Mar 2013 16:33:14 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id t12si2139036qcz.3.2013.03.20.16.33.13 (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Wed, 20 Mar 2013 16:33:14 -0700 (PDT) Received: from blast2.mtv.corp.google.com (blast2.mtv.corp.google.com [172.17.132.164]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id BA4545A4028; Wed, 20 Mar 2013 16:33:13 -0700 (PDT) Received: by blast2.mtv.corp.google.com (Postfix, from userid 5463) id 6EF8A22072B; Wed, 20 Mar 2013 16:33:13 -0700 (PDT) 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 v2 2/3 net-next] tcp: refactor CA_Loss state processing Date: Wed, 20 Mar 2013 16:32:59 -0700 Message-Id: <1363822380-16687-2-git-send-email-ycheng@google.com> X-Mailer: git-send-email 1.8.1.3 In-Reply-To: <1363822380-16687-1-git-send-email-ycheng@google.com> References: <1363822380-16687-1-git-send-email-ycheng@google.com> X-Gm-Message-State: ALoCoQlWxzrLn+YGM6O3AnofkkWmWXBvQGFOsd+mJWARkco2DO9eKahiLeLAhOhAKoI9n4kFa0egtQh0eBfnJmraHLZnql1AexfBfzGWBJU2CSYUxKpVmcJ860zsSatZGSIxBzzJBh0oOSN3kTyD0thguZ7rrkEddAdg/fw9qurbtlqsbWLj3k3xXRcePCgbktPLM8TD/F7E 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 Acked-by: Eric Dumazet --- 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 231c79f..8d821e4 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2664,6 +2664,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 @@ -2710,12 +2734,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. */ @@ -2746,18 +2764,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)