From patchwork Thu Aug 9 16:38:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuchung Cheng X-Patchwork-Id: 955730 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="jxkShMhV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41mYpr0s0rz9s1c for ; Fri, 10 Aug 2018 02:38:28 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732570AbeHITEH (ORCPT ); Thu, 9 Aug 2018 15:04:07 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:47088 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732458AbeHITEG (ORCPT ); Thu, 9 Aug 2018 15:04:06 -0400 Received: by mail-pl0-f66.google.com with SMTP id t17-v6so2767525ply.13 for ; Thu, 09 Aug 2018 09:38:26 -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 :mime-version:content-transfer-encoding; bh=2+E2vt8yN+PCpWaf6obxReicki0SA0YzTyjJ9uLpQg0=; b=jxkShMhVTSrk3mN5L8lcGDUoDL/2EMc233Yd4Ke7P4v73uT1oDEc/XlXvLrOqItQGq ZLo8ms1M4AW7A46wnDd71v1jscEDzH3As3Q2k21c5zRGq/l5StuWOn9Um4DAea5Bx6Ck uJh7rvLPrjhpo47UXTFkSXOb9+MW5mIkDwBQUjbKoSDCcIACUw+fthm8NyNjMURI/7Go EV/0erAcVV1Y8M3TE8u8/l70JCusNKTUqH+uUKAQipAoE3X7ebNQlj6w6N151dMef9KH CBpuWjBfbS//BMHSbSrm5GSJ3hBXW1xuAOWe+2/TCfYd1nj1oIwvaS66vy+Te2/vbdfu m2Lg== 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:mime-version:content-transfer-encoding; bh=2+E2vt8yN+PCpWaf6obxReicki0SA0YzTyjJ9uLpQg0=; b=QGpW9ZJnTiqq/jnVo6Z6OFn4IJW+YhIbnh+C6y3Oeej1NSi+zPeRlkqMCOmLUv4yY3 4U5ebZkm1/6uZs14gMHzHiFwTJhbVV7jGp++6G36xfeijKJxLyIum9JLYoNT/DVdGg/z +a3CO/TClg6FZ4nhFlaqbHAJ5EsAVTK1b7K8CqR4SusasupaWVbbO3NoNicdTFWnPk5z tiUz7SXiFDuUoDYubd93WHyW1JcP9mgJzbT6aeQMcmOACsxJ0PtXB+RB4LB74z4AIQqL fHuYC1PZgeFUODQk1DI1K2kGG2LxEUcG2hYIpFab1OsUS5/R4+cxxrknaqdly5ZGWOpn 4QAA== X-Gm-Message-State: AOUpUlFPbx49az+ZWLbH5/NeE2HO9JWDgnYKdYXFo3lClGfNP0tpq0bW TyyRwVv92SPddHh4jLSgnRVvdA== X-Google-Smtp-Source: AA+uWPxQJkGB9HYcy9DZ3RMHg8uaNav/4RvMVxcvcr6ZN5LTs4ty2oYx4pxvQJ6jynemTA0Uq5j2xA== X-Received: by 2002:a17:902:b594:: with SMTP id a20-v6mr2770876pls.140.1533832705535; Thu, 09 Aug 2018 09:38:25 -0700 (PDT) Received: from ycheng2.svl.corp.google.com ([2620:15c:2c4:201:d660:6c0b:8a4f:4c77]) by smtp.gmail.com with ESMTPSA id m30-v6sm9741556pff.121.2018.08.09.09.38.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Aug 2018 09:38:24 -0700 (PDT) From: Yuchung Cheng To: davem@davemloft.net, edumazet@google.com Cc: netdev@vger.kernel.org, ncardwell@google.com, brakmo@fb.com, weiwan@google.com, Yuchung Cheng Subject: [PATCH net-next 4/4] tcp: avoid resetting ACK timer upon receiving packet with ECN CWR flag Date: Thu, 9 Aug 2018 09:38:12 -0700 Message-Id: <20180809163812.58365-5-ycheng@google.com> X-Mailer: git-send-email 2.18.0.597.ga71716f1ad-goog In-Reply-To: <20180809163812.58365-1-ycheng@google.com> References: <20180809163812.58365-1-ycheng@google.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Previously commit 9aee40006190 ("tcp: ack immediately when a cwr packet arrives") calls tcp_enter_quickack_mode to force sending two immediate ACKs upon receiving a packet w/ CWR flag. The side effect is it'll also reset the delayed ACK timer and interactive session tracking. This patch removes that side effect by using the new ACK_NOW flag to force an immmediate ACK. Packetdrill to demonstrate: 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 +0 setsockopt(3, SOL_TCP, TCP_CONGESTION, "dctcp", 5) = 0 +0 bind(3, ..., ...) = 0 +0 listen(3, 1) = 0 +0 < [ect0] SEW 0:0(0) win 32792 +0 > SE. 0:0(0) ack 1 +.1 < [ect0] . 1:1(0) ack 1 win 257 +0 accept(3, ..., ...) = 4 +0 < [ect0] . 1:1001(1000) ack 1 win 257 +0 > [ect01] . 1:1(0) ack 1001 +0 write(4, ..., 1) = 1 +0 > [ect01] P. 1:2(1) ack 1001 +0 < [ect0] . 1001:2001(1000) ack 2 win 257 +0 write(4, ..., 1) = 1 +0 > [ect01] P. 2:3(1) ack 2001 +0 < [ect0] . 2001:3001(1000) ack 3 win 257 +0 < [ect0] . 3001:4001(1000) ack 3 win 257 // Ack delayed ... +.01 < [ce] P. 4001:4501(500) ack 3 win 257 +0 > [ect01] . 3:3(0) ack 4001 +0 > [ect01] E. 3:3(0) ack 4501 +.001 read(4, ..., 4500) = 4500 +0 write(4, ..., 1) = 1 +0 > [ect01] PE. 3:4(1) ack 4501 win 100 +.01 < [ect0] W. 4501:5501(1000) ack 4 win 257 // No delayed ACK on CWR flag +0 > [ect01] . 4:4(0) ack 5501 +.31 < [ect0] . 5501:6501(1000) ack 4 win 257 +0 > [ect01] . 4:4(0) ack 6501 Fixes: 9aee40006190 ("tcp: ack immediately when a cwr packet arrives") Signed-off-by: Yuchung Cheng Signed-off-by: Neal Cardwell --- net/ipv4/tcp_input.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9a09ff3afef2..4c2dd9f863f7 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -245,16 +245,16 @@ static void tcp_ecn_queue_cwr(struct tcp_sock *tp) tp->ecn_flags |= TCP_ECN_QUEUE_CWR; } -static void tcp_ecn_accept_cwr(struct tcp_sock *tp, const struct sk_buff *skb) +static void tcp_ecn_accept_cwr(struct sock *sk, const struct sk_buff *skb) { if (tcp_hdr(skb)->cwr) { - tp->ecn_flags &= ~TCP_ECN_DEMAND_CWR; + tcp_sk(sk)->ecn_flags &= ~TCP_ECN_DEMAND_CWR; /* If the sender is telling us it has entered CWR, then its * cwnd may be very low (even just 1 packet), so we should ACK * immediately. */ - tcp_enter_quickack_mode((struct sock *)tp, 2); + inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; } } @@ -4703,7 +4703,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) skb_dst_drop(skb); __skb_pull(skb, tcp_hdr(skb)->doff * 4); - tcp_ecn_accept_cwr(tp, skb); + tcp_ecn_accept_cwr(sk, skb); tp->rx_opt.dsack = 0;