Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9452946pxu; Mon, 28 Dec 2020 17:06:04 -0800 (PST) X-Google-Smtp-Source: ABdhPJzn9fePaDTXnx+2+DGWhSpHMx5tjJ6w8E14Zz8H0Dgfy3BTDNm+wuT0M0em9VJvhvVws6MW X-Received: by 2002:aa7:cd63:: with SMTP id ca3mr42175206edb.164.1609203964432; Mon, 28 Dec 2020 17:06:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609203964; cv=none; d=google.com; s=arc-20160816; b=OVvDxWSv5xK6rBTcsbDEJvfkCGArH1mM2lnH2wtsy3AKguXSRMfulmkKP0fD2823/A e88oRyJMvMCB3U77F/MLWYGgehZ+lCAvp76ZrjWuRsbbPoNkp1WYRvbYGNFbRGtOD1rB GwyYvaJoSBM0Ljgsi5jKUiYmWcwqYQr0z9F54BZ+O34Ykajn1dH7tkh1bqDvdCOpv+iC wD1NSmFut95UtT3obnH/3qfd4MSwXDdoGKcUKi86sbrBrSfTg/jXuTRqo43vjEqAKCvu Uk/041tEdVxy9Dlo9IiwFe3Ao8my3jTRBnDSwZIakXEYaKcc31CVEH1TQ4+Q7FTPk/OA OC+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ynVYcRXvaZaqIOGAyZq3l7XY9puk5I5imhUFNsDNvHs=; b=ENNM6Af7b4K8ZcY9mXRpxKcGgvyaO3Cm/llZ93rream8wBU+kIGeTxGlCvDX5wmuiE j8PfVll8oK8YoZkAIvMijjdzmfmIWxvvDP/HCAkeYMkOEjCrGCj0PM2qqYBljYAO4biU NzjtWV+/Fc3PmXDjbFcz8o+tR6Kh0Pl2W8c8Co3Y2R2oTfCfht1kWaQhun8AZt3Xx3G5 E31/CEregv7BnCTdNkkC177NKzqSPmjAHRkYUCcKwPgym2e7dXNEL89wLyiXW88yP8mY 16MVLEqk94vT7zJPbClK/plEafnK5a6Uj8ad0OWRXEViz2ZtdCUFet4dQnGrLdXvub7T eb1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=sHaCHFcm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c26si20508845edv.182.2020.12.28.17.05.42; Mon, 28 Dec 2020 17:06:04 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=sHaCHFcm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2633483AbgL1Q1v (ORCPT + 99 others); Mon, 28 Dec 2020 11:27:51 -0500 Received: from mail.kernel.org ([198.145.29.99]:35858 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730876AbgL1NIP (ORCPT ); Mon, 28 Dec 2020 08:08:15 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5FDA4208B6; Mon, 28 Dec 2020 13:07:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609160855; bh=mO0L3GZjY/iQu0aOfTqBqJ0euAD8j2aeJ+KkTPJ3IgE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sHaCHFcm2pYYjyqR3exX2st7Xi6/Rge2y/7LlWbj8De7qsLzYzwqDFAwKDllZ0Hsn K7z0Bg55l5D7dnGHImsspo/vuX642dd2V2f2WMc+Blg4LIf9JCL3f9z1pDt09aZ2Qu aJhQfYCd3x2POKxzElKlmitJNUEVxtcbgxx7usZM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ingemar Johansson , Neal Cardwell , Yuchung Cheng , Soheil Hassas Yeganeh , Eric Dumazet , Jakub Kicinski Subject: [PATCH 4.14 018/242] tcp: fix cwnd-limited bug for TSO deferral where we send nothing Date: Mon, 28 Dec 2020 13:47:03 +0100 Message-Id: <20201228124905.562635497@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228124904.654293249@linuxfoundation.org> References: <20201228124904.654293249@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Neal Cardwell [ Upstream commit 299bcb55ecd1412f6df606e9dc0912d55610029e ] When cwnd is not a multiple of the TSO skb size of N*MSS, we can get into persistent scenarios where we have the following sequence: (1) ACK for full-sized skb of N*MSS arrives -> tcp_write_xmit() transmit full-sized skb with N*MSS -> move pacing release time forward -> exit tcp_write_xmit() because pacing time is in the future (2) TSQ callback or TCP internal pacing timer fires -> try to transmit next skb, but TSO deferral finds remainder of available cwnd is not big enough to trigger an immediate send now, so we defer sending until the next ACK. (3) repeat... So we can get into a case where we never mark ourselves as cwnd-limited for many seconds at a time, even with bulk/infinite-backlog senders, because: o In case (1) above, every time in tcp_write_xmit() we have enough cwnd to send a full-sized skb, we are not fully using the cwnd (because cwnd is not a multiple of the TSO skb size). So every time we send data, we are not cwnd limited, and so in the cwnd-limited tracking code in tcp_cwnd_validate() we mark ourselves as not cwnd-limited. o In case (2) above, every time in tcp_write_xmit() that we try to transmit the "remainder" of the cwnd but defer, we set the local variable is_cwnd_limited to true, but we do not send any packets, so sent_pkts is zero, so we don't call the cwnd-limited logic to update tp->is_cwnd_limited. Fixes: ca8a22634381 ("tcp: make cwnd-limited checks measurement-based, and gentler") Reported-by: Ingemar Johansson Signed-off-by: Neal Cardwell Signed-off-by: Yuchung Cheng Acked-by: Soheil Hassas Yeganeh Signed-off-by: Eric Dumazet Link: https://lore.kernel.org/r/20201209035759.1225145-1-ncardwell.kernel@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/ipv4/tcp_output.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -1620,7 +1620,8 @@ static void tcp_cwnd_validate(struct soc * window, and remember whether we were cwnd-limited then. */ if (!before(tp->snd_una, tp->max_packets_seq) || - tp->packets_out > tp->max_packets_out) { + tp->packets_out > tp->max_packets_out || + is_cwnd_limited) { tp->max_packets_out = tp->packets_out; tp->max_packets_seq = tp->snd_nxt; tp->is_cwnd_limited = is_cwnd_limited; @@ -2411,6 +2412,10 @@ repair: else tcp_chrono_stop(sk, TCP_CHRONO_RWND_LIMITED); + is_cwnd_limited |= (tcp_packets_in_flight(tp) >= tp->snd_cwnd); + if (likely(sent_pkts || is_cwnd_limited)) + tcp_cwnd_validate(sk, is_cwnd_limited); + if (likely(sent_pkts)) { if (tcp_in_cwnd_reduction(sk)) tp->prr_out += sent_pkts; @@ -2418,8 +2423,6 @@ repair: /* Send one loss probe per tail loss episode. */ if (push_one != 2) tcp_schedule_loss_probe(sk, false); - is_cwnd_limited |= (tcp_packets_in_flight(tp) >= tp->snd_cwnd); - tcp_cwnd_validate(sk, is_cwnd_limited); return false; } return !tp->packets_out && tcp_send_head(sk);