From patchwork Fri Sep 25 14:39:18 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 522875 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 537B81400A0 for ; Sat, 26 Sep 2015 00:41:15 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=doGBT8h7; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932445AbbIYOlD (ORCPT ); Fri, 25 Sep 2015 10:41:03 -0400 Received: from mail-pa0-f52.google.com ([209.85.220.52]:34286 "EHLO mail-pa0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932405AbbIYOkT (ORCPT ); Fri, 25 Sep 2015 10:40:19 -0400 Received: by padhy16 with SMTP id hy16so107771568pad.1 for ; Fri, 25 Sep 2015 07:40:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=C9o57ci9S0APwK5q3a5CFqzqv+mEA5EEOfwZL4yTxsE=; b=doGBT8h71FDP3T75nywrQJtSTFVU9/BP0DKMaCUnMvNjgfmK2TK6+cAr57BtATA/4d UsKUhBKe7dO+pXffV0R3pGXdB9ImQxIx27PsnE8xXEC76tq90zNr5WwzwUXAT4kcQqXP Xe3QXJSCHk05SNfWWPFtwAzItwC8GPdD+DaTIUQxK16AbUESmB0hLwN8+GzkPSHG24e2 CxOQ+7Bav9FEsm3yP7mdzCaCE8WsKF8eUF1lya82eWRacE87sbwa5qBjMWBklmo25/D9 h7qXX5KEQ7i7Jrna0Nfq6Xh0jKVVA+y0bI5Vv0+dmMn9Ev6q7ioRDfs8Mzvzxu/usBB5 F0nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=C9o57ci9S0APwK5q3a5CFqzqv+mEA5EEOfwZL4yTxsE=; b=FwW7zPHwYm8BWr1tEC+G/oOvNdrStamQ2b51FkaYSgQlinczpxQgU0QyTrUh5WVJFv UeFRcHTI2ZpX/WnbXY/TcrX6452et65INb3OzKT7tV44SQTFa8kaHhO6VPFUPiyxCR48 Ggv2d7oxaNq+dhO1WojTPk3X3AAtefue7+QdJaudI1TO5Ejl/7s0h4k9/XCBMDtHN2EJ xi6Xe2w3wnbD2/isE8N8HDxqSWeYNvHYmB6cKLM9S7OQQyjl99pT5MtD0fdQY2DVb6JZ EGNGQfM7LraQxl8nbv4a9Kc8Te7uchVsCFqT/LD+7A/6i4dGIi1xbUDEaefTZkRf4YEO EWAg== X-Gm-Message-State: ALoCoQkJKRO04zOsRZZp/NsdgpmwhcvBbLBsSAtqJ3vcUV+def4KAq4yMxln+ZzolWeUMQFLJB8e X-Received: by 10.68.195.3 with SMTP id ia3mr7599426pbc.106.1443192019349; Fri, 25 Sep 2015 07:40:19 -0700 (PDT) Received: from localhost ([2620:0:1000:3002:1cc3:31a2:9afe:27e6]) by smtp.gmail.com with ESMTPSA id ch3sm4363713pbb.18.2015.09.25.07.40.17 (version=TLS1_2 cipher=AES128-SHA256 bits=128/128); Fri, 25 Sep 2015 07:40:17 -0700 (PDT) From: Eric Dumazet To: "David S . Miller" Cc: netdev , Eric Dumazet , Eric Dumazet Subject: [PATCH net-next 11/17] tcp: remove tcp_ecn_make_synack() socket argument Date: Fri, 25 Sep 2015 07:39:18 -0700 Message-Id: <1443191964-923-12-git-send-email-edumazet@google.com> X-Mailer: git-send-email 2.6.0.rc2.230.g3dd15c0 In-Reply-To: <1443191964-923-1-git-send-email-edumazet@google.com> References: <1443191964-923-1-git-send-email-edumazet@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org SYNACK packets might be sent without holding socket lock. For DCTCP/ECN sake, we should call INET_ECN_xmit() while socket lock is owned, and only when we init/change congestion control. This also fixies a bug if congestion module is changed from dctcp to another one on a listener : we now clear ECN bits properly. Signed-off-by: Eric Dumazet --- net/ipv4/tcp_cong.c | 12 ++++++++++-- net/ipv4/tcp_output.c | 10 +++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 93c4dc3ab23f..882caa4e72bc 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c @@ -173,6 +173,10 @@ out: */ if (ca->get_info) memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv)); + if (ca->flags & TCP_CONG_NEEDS_ECN) + INET_ECN_xmit(sk); + else + INET_ECN_dontxmit(sk); } void tcp_init_congestion_control(struct sock *sk) @@ -181,6 +185,10 @@ void tcp_init_congestion_control(struct sock *sk) if (icsk->icsk_ca_ops->init) icsk->icsk_ca_ops->init(sk); + if (tcp_ca_needs_ecn(sk)) + INET_ECN_xmit(sk); + else + INET_ECN_dontxmit(sk); } static void tcp_reinit_congestion_control(struct sock *sk, @@ -192,8 +200,8 @@ static void tcp_reinit_congestion_control(struct sock *sk, icsk->icsk_ca_ops = ca; icsk->icsk_ca_setsockopt = 1; - if (sk->sk_state != TCP_CLOSE && icsk->icsk_ca_ops->init) - icsk->icsk_ca_ops->init(sk); + if (sk->sk_state != TCP_CLOSE) + tcp_init_congestion_control(sk); } /* Manage refcounts on socket close. */ diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index ab03018fb621..dcb5c144f8fa 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -357,14 +357,10 @@ static void tcp_ecn_clear_syn(struct sock *sk, struct sk_buff *skb) } static void -tcp_ecn_make_synack(const struct request_sock *req, struct tcphdr *th, - struct sock *sk) +tcp_ecn_make_synack(const struct request_sock *req, struct tcphdr *th) { - if (inet_rsk(req)->ecn_ok) { + if (inet_rsk(req)->ecn_ok) th->ece = 1; - if (tcp_ca_needs_ecn(sk)) - INET_ECN_xmit(sk); - } } /* Set up ECN state for a packet on a ESTABLISHED socket that is about to @@ -2999,7 +2995,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, memset(th, 0, sizeof(struct tcphdr)); th->syn = 1; th->ack = 1; - tcp_ecn_make_synack(req, th, sk); + tcp_ecn_make_synack(req, th); th->source = htons(ireq->ir_num); th->dest = ireq->ir_rmt_port; /* Setting of flags are superfluous here for callers (and ECE is