From nobody Thu Sep 18 12:39:42 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:a689:0:0:0:0:0 with SMTP id j9csp1929066jam; Fri, 24 Sep 2021 14:12:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxbzMntOpejDP5orRd1111OgVPnkhv9Sj4ij8cRkBYYL0gcU6PfBISrvNAV9cb7iaP8XNCW X-Received: by 2002:a63:330f:: with SMTP id z15mr5423749pgz.402.1632517976159; Fri, 24 Sep 2021 14:12:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632517976; cv=none; d=google.com; s=arc-20160816; b=v1ox2PEjm0g3mRKD3QsphzVUN9m9DQplcuqGaN6XOmT2NAd7RE/PiqcUmrLa7t5UcF ZNhoWW8Is7RWceSid+UEXvCkYdTnA8K0OYuTzAaUlD+BGbX9c6jOpYtwk9sbC79aLdPe xHhYQpOU/r2FGNHFmVYq1HhP/MltHNtFCLup3KLYcD57i6JLkHAVTv/NV0CD/VhVK/DN /OkITIPOBDiYsLsRVIvyMbiXXhQRuULh/uVKDs4aOq2G4JqfhRJ8I8wHwRYR3pWRPN03 9vOcuW26L7EReXOVU5C4KlLkVRxjgEOcT0P0y8e32STZICP3WHltwNqVgGYt6CO4XGZ1 /vhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=NhgxWyEcy1hNcblanjZmL29zZ/znaMmzdtvN+Ljm8DI=; b=zrvNVmfRazXUxZSsyc8Bn+dPIouNyABxa5Jt9j5jx6yS17krithaiPvAMaZSRqtUec 4szAVnouu0g3Prr6yhn/CJDpuPBF+3Ja2IYltLtLEiIhaL34rZIfy2kSH2MivqpJFHJX TrALU9IHxKCCPeaHV4OqFha+Pi64RxhZQvGNrCdymbqkylGke9DvCuVU9o0JW4LttFCa ifpH9EwFn2YSMxiLvZE4mSOPqsy7GEy/O6UfCeFpRKQ1+19P8wxyt3cEM/Wbc9YcYqw/ HyN0D58en7j1HOLZROlbDNUJSBZCXz6NIR2+2iW81GETbj8UU33OQIvpVvcHPloP7PgU dCLg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2056-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2056-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id l8si17070875pjc.34.2021.09.24.14.12.56 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Sep 2021 14:12:56 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-2056-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of mptcp+bounces-2056-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2056-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id AD7573E1035 for ; Fri, 24 Sep 2021 21:12:55 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DF9C43FD4; Fri, 24 Sep 2021 21:12:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 027E73FC8 for ; Fri, 24 Sep 2021 21:12:49 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10117"; a="246639641" X-IronPort-AV: E=Sophos;i="5.85,321,1624345200"; d="scan'208";a="246639641" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Sep 2021 14:12:47 -0700 X-IronPort-AV: E=Sophos;i="5.85,321,1624345200"; d="scan'208";a="704320293" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.52.210]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Sep 2021 14:12:46 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Florian Westphal , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, pabeni@redhat.com, Mat Martineau Subject: [PATCH net-next 5/5] mptcp: re-arm retransmit timer if data is pending Date: Fri, 24 Sep 2021 14:12:38 -0700 Message-Id: <20210924211238.162509-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210924211238.162509-1-mathew.j.martineau@linux.intel.com> References: <20210924211238.162509-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal The retransmit head will be NULL in case there is no in-flight data (meaning all data injected into network has been acked). In that case the retransmit timer is stopped. This is only correct if there is no more pending, not-yet-sent data. If there is, the retransmit timer needs to set the PENDING bit again so that mptcp tries to send the remaining (new) data once a subflow can accept more data. Also, mptcp_subflow_get_retrans() has to be called unconditionally. This function checks for subflows that have become unresponsive and marks them as stale, so in the case where the rtx queue is empty, subflows will never be marked stale which prevents available backup subflows from becoming eligible for transmit. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/226 Acked-by: Paolo Abeni Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- net/mptcp/protocol.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 5b0ed64c5cd2..8029bbbe1c9e 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1105,7 +1105,8 @@ static void __mptcp_clean_una(struct sock *sk) if (cleaned && tcp_under_memory_pressure(sk)) __mptcp_mem_reclaim_partial(sk); =20 - if (snd_una =3D=3D READ_ONCE(msk->snd_nxt) && !msk->recovery) { + if (snd_una =3D=3D READ_ONCE(msk->snd_nxt) && + snd_una =3D=3D READ_ONCE(msk->write_seq)) { if (mptcp_timer_pending(sk) && !mptcp_data_fin_enabled(msk)) mptcp_stop_timer(sk); } else { @@ -1547,6 +1548,13 @@ static void mptcp_update_post_push(struct mptcp_sock= *msk, msk->snd_nxt =3D snd_nxt_new; } =20 +static void mptcp_check_and_set_pending(struct sock *sk) +{ + if (mptcp_send_head(sk) && + !test_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags)) + set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); +} + void __mptcp_push_pending(struct sock *sk, unsigned int flags) { struct sock *prev_ssk =3D NULL, *ssk =3D NULL; @@ -2414,6 +2422,9 @@ static void __mptcp_retrans(struct sock *sk) int ret; =20 mptcp_clean_una_wakeup(sk); + + /* first check ssk: need to kick "stale" logic */ + ssk =3D mptcp_subflow_get_retrans(msk); dfrag =3D mptcp_rtx_head(sk); if (!dfrag) { if (mptcp_data_fin_enabled(msk)) { @@ -2426,10 +2437,12 @@ static void __mptcp_retrans(struct sock *sk) goto reset_timer; } =20 - return; + if (!mptcp_send_head(sk)) + return; + + goto reset_timer; } =20 - ssk =3D mptcp_subflow_get_retrans(msk); if (!ssk) goto reset_timer; =20 @@ -2456,6 +2469,8 @@ static void __mptcp_retrans(struct sock *sk) release_sock(ssk); =20 reset_timer: + mptcp_check_and_set_pending(sk); + if (!mptcp_timer_pending(sk)) mptcp_reset_timer(sk); } --=20 2.33.0