From nobody Thu Nov 5 07:28:12 2026 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793324664; b=kq7BQFESz0/Aii7pOafRgn+PYjQo/k30D2uRH26uq00+WSfs65flJ3fUz20PRV5kBbyA V0KtGfPumY+0pEkreIJsbmyVZEyeSOBuipaXB0458w+vj0h79lfZ+3I/OICvr4MCjjZ07 7MRLEf1uTaZoKIvP8/TpFIURImtNtP1/yk4S/KfqWsFRMrJyInsQryHvJzowWbCCNAqiJ 0pN92LZ4PxDwUrpLtbgpAKV9dF1XTUEtCozuUTIcsYjgIxKLw7ycmErt2Rk4A9CaJbdwB xtiuIttF+x/ZChgvGEaDxn8l5oDGAa8jWL9HAU69IgSpvoO8pwpL1SsEGKdfnGKQDdg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793324664; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=FcyZ/23EO9wCaimpG8uixyj/1tWZ+pqjTJz3x+0Dc/c=; b=0ntEF5CosSrcAvWWnDBeoCdLjym0/ZNzYbYHxVn7NVcvyAry7DrtgXxGX55MjgzTiHv5 0ETVMXn3XU6c1+E1u97APBCHGFh3ZXaaNhOjDTZrHVeqH5zob9kp8rAMTvnGkI3RRb1aS Lnyort+YwZGSO3Riesp3oTjkEMEr0sksZXZDkeIMV/zD5wPHsHccXNE7ciA7UbdR/ugmv 97ctIB1NGpihuN8uDX2Ki4XW54zIGQT4gWWDxq9g7Tj5i95bOY5o5M1+l4xSpItdvrwEp OmGlMAsqGviLvo+HWlLmeyBZ8Al7ct2wVOW0gDxHqd8TUIKO14tL/quhtz6t7sGgHMw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=Nds8eudH; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23A1D606A31C for ; Fri, 30 Oct 2026 01:44:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=Nds8eudH Received: by smtp.kernel.org (Postfix) with ESMTPSA id C4A721F00A1C; Fri, 30 Oct 2026 01:44:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793324663; bh=FcyZ/23EO9wCaimpG8uixyj/1tWZ+pqjTJz3x+0Dc/c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Nds8eudHkIIVr1sBXy+q/O1e626DYYEbZ6e25N6MqJx2Hk67R7nVgEuBvUf7jfCU6 Ao7LZE9lRVZjT8B3BWYezjY5ZD9koZFgy1r7XBfVJQWKXPHztIpS2QXduqwF+1cu81 RijPfXgt9T3ednwSZwRCppHiARFYIzO8rROhcevNRW7nEehYGLpXoERXGvzGJXc/Wy powoMG6GHbFPXa0JPz53abCCIAeT/nEMOT0Uh2INy47yJINUr1q8B0gOXHTv3rbqiA QWbo5bMXUzl8qHQTVBsEK7KS+ZDCrgNH6RvP/yhbrdAPJfmB1+vMEvWiQAmVFYUxlK ejeU8nFdkfl/Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Gang Yan , Geliang Tang Subject: [PATCH mptcp-next v3 1/5] mptcp: update mptcp_check_readable Date: Fri, 30 Oct 2026 09:44:13 +0800 Message-ID: X-Mailer: git-send-email 2.55.0 In-Reply-To: References: X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Gang Yan This patch makes mptcp_check_readable() aligned with TCP, and renames it to mptcp_stream_is_readable(). It will be used in the case of KTLS, because 'prot' will be modified, tls_sw_sock_is_readable() is expected to be called from prot->sock_is_readable(). Co-developed-by: Geliang Tang Signed-off-by: Geliang Tang Signed-off-by: Gang Yan --- net/mptcp/protocol.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 02a4f479d9d8..0caa31525b90 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3476,9 +3476,11 @@ void __mptcp_unaccepted_force_close(struct sock *sk) __mptcp_destroy_sock(sk); } =20 -static __poll_t mptcp_check_readable(struct sock *sk) +static bool mptcp_stream_is_readable(struct sock *sk) { - return mptcp_epollin_ready(sk) ? EPOLLIN | EPOLLRDNORM : 0; + if (mptcp_epollin_ready(sk)) + return true; + return sk_is_readable(sk); } =20 static void mptcp_check_listen_stop(struct sock *sk) @@ -4580,7 +4582,8 @@ static __poll_t mptcp_poll(struct file *file, struct = socket *sock, mask |=3D EPOLLIN | EPOLLRDNORM | EPOLLRDHUP; =20 if (state !=3D TCP_SYN_SENT && state !=3D TCP_SYN_RECV) { - mask |=3D mptcp_check_readable(sk); + if (mptcp_stream_is_readable(sk)) + mask |=3D EPOLLIN | EPOLLRDNORM; if (shutdown & SEND_SHUTDOWN) mask |=3D EPOLLOUT | EPOLLWRNORM; else --=20 2.55.0 From nobody Thu Nov 5 07:28:12 2026 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793324665; b=WEE29Zu7YEcXiHQluaV+gz1vW2g5P930zhpfr9y1C7ayaJfm4R9CrCPMGWiR5QQjP3hM RK/PLfcZYCo3GgkpvS9IBDGHw0CKrhTn4tdpxT4wme0mSQCQOfxzwl3AI0ijyyam6XmJY hmRKXoFPmJ13+Qe3vWqq41GVxhXX0e0qMyC39C6RoSbFIMtM2swFzff2DGIMGrh6I6XIs ybS3Xb6/rUAbgRKBwrdK1aDN9C8zoBVKyluT+jW/qneA4ojZW5F3WEO1iJJOocTAOqyym 6cNiS+y/fkH32gt2uq0qKzHRe8n3RqdWMavtPUOnPeuLv5P9ZHY/odc/8leJ4/Epppg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793324665; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=D26+i4vNU6/8l3Lxiv/bOsH67gQLcneTBNlJ3SmL1D4=; b=PGvvhK8CF4grHO3keTp0H/C+3y/BkHj1jsD4pPaVI/vm5P4EkXSUy0Nyt8yYZ8rpe11X uTfF0HtZn2RbVbngUfj8LPdtcrpEQ0jYI8G25iC9Cer1iZJA2ei9j4hcTExtPNTx61v5T s5ttVLnmCJGlylUjsoYyq638nLPmM16rVh3e4zj6O/+0v+mbndWKMr81wXt8XHteEpxTv hFCJdKkpgTMxA5gGkoSoVu1eH+TrVXcA94L/J30Iau0tGsUEmFWoSnSLZM+YYtNCL+mmK lxCZDCUF3GoBW7VtF/hH/CxsRBibu2g4uQ4kZUfKQGPAUy++ft/DyNWpmUAgCH5e1xA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=OSVMM6yp; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82BA6606A31C for ; Fri, 30 Oct 2026 01:44:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=OSVMM6yp Received: by smtp.kernel.org (Postfix) with ESMTPSA id 52F5D1F00A02; Fri, 30 Oct 2026 01:44:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793324665; bh=D26+i4vNU6/8l3Lxiv/bOsH67gQLcneTBNlJ3SmL1D4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=OSVMM6yp/WM2eI1a+g1x9u1tEZJJKUCzmHqGXHU+SxzaiYWuoBAM7ZMf3j277lMxU I4bZYx26hExaf4cu/aq3Lv15JSBS1Ig/xlNSXGBkfEGFdP4JiCNPNvj5WWTOnC+xcn DhjrLD39w3ciIcuIAtGVA/Kl9qjcG4q/VDUdpmGwSvEizGcY9Ah64G1SasL66y9mGb 1SV+gjBOQDSNkNaoilGUE0FlLY0619cDnnjCiM4Aichh1gdbt9SoGoj3hfWNSKRqRq Y5ozsltBVqBHlCZL8syA22CZ7MF/zzmarNLECmPGR4mxrxy9bTv0puCGCg3LCKpEbY 2907fJUmrDYFQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , Zqiang Subject: [PATCH mptcp-next v3 2/5] mptcp: implement peek_len for proto_ops Date: Fri, 30 Oct 2026 09:44:14 +0800 Message-ID: <792219afffb4d3cc71ba3286b648b90ea50b1c86.1793324316.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add mptcp_inq() to compute readable bytes at the MPTCP level using mptcp_data_avail() (bytes_received - bytes_consumed) to avoid TFO overflow issues. Returns 0 during handshake or when avail >=3D INT_MAX (likely torn read on 32-bit). READ_ONCE() is used instead of mptcp_data_lock() because mptcp_inq() will be called from TLS contexts with socket lock held - taking the spinlock would deadlock. Wire into mptcp_peek_len() and assign .peek_len in both mptcp_stream_ops and mptcp_v6_stream_ops. Note: mptcp_inq() differs from mptcp_inq_hint() by returning 0 (not 1) when value is 0, and using mptcp_data_avail() instead of ack_seq - copied_seq with TCP_CLOSE/RCV_SHUTDOWN check, to correctly handle TFO scenarios. Co-developed-by: Zqiang Signed-off-by: Zqiang Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 0caa31525b90..dbd6275963b8 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -4797,6 +4797,26 @@ static ssize_t mptcp_splice_read(struct socket *sock= , loff_t *ppos, return ret; } =20 +static int mptcp_inq(struct sock *sk) +{ + const struct mptcp_sock *msk =3D mptcp_sk(sk); + u64 avail; + + if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) + return 0; + + avail =3D mptcp_data_avail(msk); + if (avail >=3D INT_MAX) + return 0; + + return (unsigned int)avail; +} + +static int mptcp_peek_len(struct socket *sock) +{ + return mptcp_inq(sock->sk); +} + static const struct proto_ops mptcp_stream_ops =3D { .family =3D PF_INET, .owner =3D THIS_MODULE, @@ -4819,6 +4839,7 @@ static const struct proto_ops mptcp_stream_ops =3D { .set_rcvlowat =3D mptcp_set_rcvlowat, .read_sock =3D mptcp_read_sock, .splice_read =3D mptcp_splice_read, + .peek_len =3D mptcp_peek_len, }; =20 static struct inet_protosw mptcp_protosw =3D { @@ -4931,6 +4952,7 @@ static const struct proto_ops mptcp_v6_stream_ops =3D= { .set_rcvlowat =3D mptcp_set_rcvlowat, .read_sock =3D mptcp_read_sock, .splice_read =3D mptcp_splice_read, + .peek_len =3D mptcp_peek_len, }; =20 static struct proto mptcp_v6_prot; --=20 2.55.0 From nobody Thu Nov 5 07:28:12 2026 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793324667; b=EJiyuvERmU6ytl/RY5J/oeBStU3mjSrunAZF4AZs+Q5p5stKwaloC6slb+PRr4qHO8Dy 51OYBOt2IZFsDM+7axiaubTiBDiUJ8Ym3Cbu3Ux308ijT0x/jCKDmwiGepzNNHHtxU5kU qp/6nrP+TBGKzy9VJ9VezTvKE9UPdIEoterqyLgLvw7Vyz7iMR1fua5dpFs9VUGm6fRvR /+ETZvyxpx22b3MLRnTYkdvmE+tlGbwf9jjTaqrUiuvBOVkYM65HHEIwPgJtCwCr8TJfZ TxREdbVpFqjPMO+MtRMp4W2T2XWD14G7Id+jfqtOYoEzERW3AkdUUjrZK3h4tm3qIVg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793324667; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=DQljSdbExFwljTSduEPl/pm0/Xm5/pNnDOFFk/H1X1c=; b=sDO+joKvHLwkvn1qifzVRzmpEtfMAnkYEb6jqn4rBvV1q9kzS4iM+GCwK9Jm2LGX/Enw M8kfNpnCpOEA4e0zPbqivV7k08i3HTFF8amRehGMYhsLCWXreaUHwgI6XzO1IEESmYT+g KKI3BQpqoRv6V8O25fkEfsjFg4cula4y71qDVQg7ovXv3ybhmM4vot23Xl/fjGz8D9ARn PM926iC2eFdc3JSUYUMNMweO/bvYc/AJQLkRIz0/ExzRo0kiuZjf4Wbz8mbfd/Y28AG8N sY4wckYBY+M5AQ1NeIuoy8QKOReG1XxsPd2eizpFy4oTFSaEOuZL1AYoHWDbCcfNuNQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=Iv1TBrhG; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 37067606A31C for ; Fri, 30 Oct 2026 01:44:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=Iv1TBrhG Received: by smtp.kernel.org (Postfix) with ESMTPSA id D65F31F00A16; Fri, 30 Oct 2026 01:44:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793324666; bh=DQljSdbExFwljTSduEPl/pm0/Xm5/pNnDOFFk/H1X1c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Iv1TBrhGZGFMBOAXx9NxhdneBJbKNpiAcceEJCaj4lwMJTYizA7UaYaq+IJug9Jo3 tULj/14EjkpjVe0uS+KxvOb6yv+ZWqKGluX3VhGKQmGijT9QWzI40ftARC4PJd+BBN YJVdGkntE9UfOv+GkFcttlaT91t42qrN1MA8oua60ED3fa0yCG1xPM123k976tfSEQ zUjAuoIp7SYWAAePk8ZH5lcLwyyIIld7Gwp0TjfOaakluzzSXdWKJVde1MZf6hhofE e6EuSBTiocVOmZI04rz9xO2RUyupx2ZoKSbid89NK605+pet03ABSonXVhZTxT7ZRs l/ETe+HB835rQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 3/5] mptcp: add sendmsg_locked to proto_ops Date: Fri, 30 Oct 2026 09:44:15 +0800 Message-ID: <17cd2f5615f886f0ec82d99cb1312fec99e797f0.1793324316.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang MPTCP currently provides a standard sendmsg() implementation which acquires and releases the socket lock internally. However, certain upper layers need to call the sendmsg method while the socket lock is already held. Split the existing mptcp_sendmsg() into mptcp_sendmsg_locked() which assumes the caller holds the socket lock, and a tiny wrapper mptcp_sendmsg() that acquires the lock and calls the locked version. Add msk_owned_by_me() assertion to enforce the locking requirement. Expose .sendmsg_locked in both mptcp_stream_ops and mptcp_v6_stream_ops. This prepares for upcoming kTLS and sockmap support. Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index dbd6275963b8..696cdba76bc9 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2038,7 +2038,7 @@ static void mptcp_rps_record_subflows(const struct mp= tcp_sock *msk) } } =20 -static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +static int mptcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_= t len) { struct mptcp_sock *msk =3D mptcp_sk(sk); struct page_frag *pfrag; @@ -2046,12 +2046,12 @@ static int mptcp_sendmsg(struct sock *sk, struct ms= ghdr *msg, size_t len) int ret =3D 0; long timeo; =20 + msk_owned_by_me(msk); + /* silently ignore everything else */ msg->msg_flags &=3D MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL | MSG_FASTOPEN | MSG_EOR; =20 - lock_sock(sk); - mptcp_rps_record_subflows(msk); =20 if (unlikely(inet_test_bit(DEFER_CONNECT, sk) || @@ -2167,7 +2167,6 @@ static int mptcp_sendmsg(struct sock *sk, struct msgh= dr *msg, size_t len) } =20 out: - release_sock(sk); return copied; =20 do_error: @@ -2180,6 +2179,17 @@ static int mptcp_sendmsg(struct sock *sk, struct msg= hdr *msg, size_t len) goto out; } =20 +static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) +{ + int ret; + + lock_sock(sk); + ret =3D mptcp_sendmsg_locked(sk, msg, len); + release_sock(sk); + + return ret; +} + static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied); =20 static void mptcp_eat_recv_skb(struct sock *sk, struct sk_buff *skb) @@ -4840,6 +4850,7 @@ static const struct proto_ops mptcp_stream_ops =3D { .read_sock =3D mptcp_read_sock, .splice_read =3D mptcp_splice_read, .peek_len =3D mptcp_peek_len, + .sendmsg_locked =3D mptcp_sendmsg_locked, }; =20 static struct inet_protosw mptcp_protosw =3D { @@ -4953,6 +4964,7 @@ static const struct proto_ops mptcp_v6_stream_ops =3D= { .read_sock =3D mptcp_read_sock, .splice_read =3D mptcp_splice_read, .peek_len =3D mptcp_peek_len, + .sendmsg_locked =3D mptcp_sendmsg_locked, }; =20 static struct proto mptcp_v6_prot; --=20 2.55.0 From nobody Thu Nov 5 07:28:12 2026 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793324668; b=G8zdj+0Ae+in1PKajPEhXEQ1fwWHQGlcdHDC8CRUpIDsZFk5epFUigiyMt8BzDDAomc/ SmOuBYMnbwCsM84tt5CEkN0+gTxWR2JkqZnNtLDIqrAmQOFOeruTAjyUDFXn1vgWslBSD l/2JO4XlWPzoiewiF0pDYl0w4qYz9AjKH/Xzv2ABp+jpWEn5ngUphOhQDxWwvkc3DpSLR 5/mQIzXsWZhyX0egr4zsoVY6P5+QKlHJwMNtTnscwPA9WhCKPRUds5mqc5BLdpOaK0MRm 6NidJzO2Q2MP1QXzrjSLFIp0OhoHqplHUD6EBi5BE37zGaGKCsP8fC9sl/zKvOZZeUw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793324668; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=Ug9Alc1wEMUhe2Yn0LTxVcg90mtk32hHv23Ht5XBpR0=; b=I7DRDPeApP4k7HYFCstZu1txRTyWpMtXxv4v2W2QBq8NRH5WTqIE+EfR/zV1KryN+Fme abBrogdDxL1KMHXiGrno5bp0oT3VM3cTD+IWWffGsfZ5IY81wkkxIY6xFstHFJ9kU2DQh KNT2HNVb1vjZA/Ocv91YkNyWBo/kw/f+5rE0DgQ0qHD1bkzpsNVulg1PgdjFCpPPmAQ/v P+qcJvJevl3yrTK2vjxvW2r6pfPZfzy1INetB53tX5fqaDX6DOM3qwuZ4v9/GUwI+Eqbs D4FtNgJtYKoYzgAvSnePmaAma2Yal1tXwiLdAxUhm9MYm0pTyF080mXZhWIS6bxIS+w== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=dhHPJpM0; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9296D606A31C for ; Fri, 30 Oct 2026 01:44:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=dhHPJpM0 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4BF491F00A02; Fri, 30 Oct 2026 01:44:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793324668; bh=Ug9Alc1wEMUhe2Yn0LTxVcg90mtk32hHv23Ht5XBpR0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=dhHPJpM04VlDL99Pv6E19TomaB6iegE5HM7xTqBmfgO79izf1m2vR81YxF7PG3ITF lFKY351NmdNSepAM1Ufhc6tvqb2siEdV0PWujwcGpY1mEFqsvIx5PXMCnvn3cKBECB ldbcUXMSi+1bNLlGH5gRgR6ce9mGsSb64dTzvAWDAr292wQIoqG534Y0zrs2bj/zUp 1o3ZT4kO/BxDWvTGWilyzjzdiipUEhl8utMuuEMQC/Xv3NuXnemIl0VrR4y5oc/snO VxX3GhCaqkVhM9kpVSoModUh8je6AoYTZJmtfGHCI3uIkI65atPTtdyO4KuEpDOJAu 3AhYEaMGXdK9g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 4/5] mptcp: track app-limited state in mptcp_sendmsg Date: Fri, 30 Oct 2026 09:44:16 +0800 Message-ID: <9fd8f849cbcb94b46bc2f59225dbdde81e8389d2.1793324316.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add mptcp_rate_check_app_limited() that walks every subflow of the mptcp_sock and runs tcp_rate_check_app_limited() under each subflow's socket lock. The helper bails out early when MPTCP still has unsent data: - msk->write_seq !=3D msk->snd_nxt: new data not yet pushed - mptcp_send_head(sk) !=3D NULL: re-injected data from rtx queue during failover or stale-subflow recovery In these cases the subflows may look idle only because data has not been pushed down yet, and marking them app-limited would be wrong. Invoke mptcp_rate_check_app_limited() from mptcp_sendmsg_locked() right after the send-side setup, so the delivery-rate app_limited state stays in sync with what the application actually has to send across each subflow. With this in place, subflow rate samples taken while the MPTCP connection is genuinely application-limited are flagged as such, allowing congestion controllers like BBR to ignore them when estimating bandwidth. Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 696cdba76bc9..f30e14a2775a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2038,6 +2038,24 @@ static void mptcp_rps_record_subflows(const struct m= ptcp_sock *msk) } } =20 +static void mptcp_rate_check_app_limited(struct sock *sk) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct mptcp_subflow_context *subflow; + + if (msk->write_seq !=3D msk->snd_nxt || mptcp_send_head(sk)) + return; + + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + bool slow; + + slow =3D lock_sock_fast_nested(ssk); + tcp_rate_check_app_limited(ssk); + unlock_sock_fast(ssk, slow); + } +} + static int mptcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_= t len) { struct mptcp_sock *msk =3D mptcp_sk(sk); @@ -2068,6 +2086,9 @@ static int mptcp_sendmsg_locked(struct sock *sk, stru= ct msghdr *msg, size_t len) =20 timeo =3D sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); =20 + /* is sending application-limited? */ + mptcp_rate_check_app_limited(sk); + if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { ret =3D sk_stream_wait_connect(sk, &timeo); if (ret) --=20 2.55.0 From nobody Thu Nov 5 07:28:12 2026 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793324670; b=vGK8MnWrz8IV+wRFFluRh56KsH7pzOND4oDV6PgkdNAaqlbu/AWbzI1W69sLMprL3hQe g+wHSLLnFCrFz9ZaCMVW6aMCKmeFfzOBfgO3BGi7qBeRy3yFCntWal39NQ/bUX5ZITz88 BfM2PK4MpSz7YACEQBD9bJT9DBo1vlscV7WI1RI1QfzRjEMiBrIvQyGdvQaEu5NmCgMjS /+8R8Pi5syVOwbk90mSfL/pQgDzI41NP5qtv0Omn+zQanWovVLKrHcy2fPTk8A7DO2WwY qFmLU7h2JvVZXMu5e9Dhq86mUaj5LmtaCC7bxhld3vMBwhDUYExnPGNilePd1B0nGFA== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793324670; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=OvSV2HMWa/s1IrAeK2YVLhcVAMU9pwUspa1vCLLae3c=; b=Nx41ezFPXXt9pMqwbOUEwyem88UhbzuTW9kMb75H1VQTZbpyxNxkZs5VT74VtFQ5pVL6 T0d/2mxYyZUiZqTIa2ZeF399XZhnrpZk1T/vX/LioU75pHRuIIK2haOMgtOQG7bR/falW JMmgUwVjYNJCO92RiF80SetVJJEhNtqtMK6BRgtAmPkT02C9q5BHPsKcqImLGUMJeEixb Qvu7kBFA4qIhVU74OdSrbOblJ4sxHuOv+GiclcyvdrM05WuvPFzSIEC/LKoqzmLgbSesp F2pclGa7hXWEiltYiDHRNuaRfcA6lBICsishGjxIznAubemDz7yLpeIXOlCmNMNfOBQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=jnoGWzlM; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE64E606A31A for ; Fri, 30 Oct 2026 01:44:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=jnoGWzlM Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5DEF1F00919; Fri, 30 Oct 2026 01:44:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793324669; bh=OvSV2HMWa/s1IrAeK2YVLhcVAMU9pwUspa1vCLLae3c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jnoGWzlM4+8dMZL+aJVuN94tAy/tfxhMaxC1bgYIXvqXeMclSOD8wl4jKD/KkHixy xnPJThLuxgLzqoT0/7Hgwa12EQISJQ6HcuW7EAbsVbirE0iLJSjKkkTiHCf7H57dkn qy/tFpJ6l2jK0mcF1MFdrkRfGA0ScP+LvKmg8S7OG0/A8xieA5aU2XV6zROuh6dXqy cY9H3dQSo+bcT7TU1jPwlnUJLgHIP2QTHUnTun/p400hZX9CAs7jEguJE123Sk1pQ/ /T/5Cbep6yZGoWf0trRX4YM/yvroQuRgg7PkmVwb8dEuv1oTwUi1T6LOyZbVOokzEs DcBQGukEizH1w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 5/5] selftests: mptcp: sockopt: check app_limited Date: Fri, 30 Oct 2026 09:44:17 +0800 Message-ID: <3067cbb56400f1c1c7d372b17e82c1fd61d3e102.1793324316.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang After a small data exchange, assert tcpi_delivery_rate_app_limited =3D=3D 1. rate_app_limited starts at 1 (tcp_init_sock) and is cleared only by non-app-limited rate samples. The preceding commit makes mptcp_rate_check_app_limited() set tp->app_limited on subflows when MPTCP has no pending data, marking outgoing skbs as app-limited so rate samples don't clear rate_app_limited. This guards against regressions in subflow app-limited accounting. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b8158a1198eb..f7a45b93cbe0 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -635,6 +635,11 @@ static void connect_one_server(int fd, int pipefd) do_getsockopts(&s, fd, total, total); =20 assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + + /* app-limited accounting requires a recent kernel */ + if (expect_all_features()) + assert(s.tcp_info.tcpi_delivery_rate_app_limited =3D=3D 1); + close(fd); } =20 --=20 2.55.0