From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 3D15421B191 for ; Thu, 23 Oct 2025 05:57:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199024; cv=none; b=gOEfnjAm/aIdrOtZH6QnMSJkYOYyEUJ1AGtk47CEnRoBb/qPmTHzyw3myoIohrVFjkSvUGS15L7SWWFbSce1s+QyTVLMSdo1W9FUXsNFoKAq6rw+BVqWa+dR+CrfnCXThee2qCQeGrvX+FYXja1AVWIT1D2/dA4fbOZYtwnkaes= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199024; c=relaxed/simple; bh=vBg86gohczo2OpiIL+s4yD+6iUuOJ2MgWvmfndK07Y4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L8tDAvdb4jtg+nmPQS9szSCWDmfONbQXi4ijZzI21fN8Ee8jz5arbphQBBUTiWYRmmSRgyTr0HuCsky/wLE6+54DHuIwUfRSftKBfg5Qq/UTeraTbNIp0ax5BdZu81/tJoJLmR5w1ZEAz1V3tgyO0QSIHRnvPjEs7t02iuct52g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Wgj48RtC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Wgj48RtC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36893C4CEFB; Thu, 23 Oct 2025 05:56:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199021; bh=vBg86gohczo2OpiIL+s4yD+6iUuOJ2MgWvmfndK07Y4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Wgj48RtCDFWKN4/DY/hN7uS8WZdi2D5+Kll8l5/ysPd2rsMUR7FWnH9izqkwnqozq TVcXpI6dbqyC2Kazx6XU7gb2c6hyPu2Z+7bZQljESvEWjK8t6DsMj5xMnxfdgct5B1 OejSwFZROGS1BDxMahX+xJYbHp3KrBmjggRCgM8DtUZxpyORIELNcK5QwippuP+P0t BiEsHoNDjCo/4ZvjFkCsIQtalck+mWBvFQQNoO4PTuVDq5lVbxpeZ08c36qCF5OAb/ pwf92AppwB2fPkpg4+ilL7KgnT7UYuukKtk+XGsZZRRGL8+VjRhPZ4aWQGRGwYgYtz fJUFS8g9acYBw== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v13 1/8] mptcp: add eat_recv_skb helper Date: Thu, 23 Oct 2025 13:56:44 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang This patch extracts the free skb related code in __mptcp_recvmsg_mskq() into a new helper mptcp_eat_recv_skb(). Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ee4d88e22888..813d438bbea8 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1992,6 +1992,17 @@ static int mptcp_sendmsg(struct sock *sk, struct msg= hdr *msg, size_t len) =20 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) +{ + /* avoid the indirect call, we know the destructor is sock_rfree */ + skb->destructor =3D NULL; + skb->sk =3D NULL; + atomic_sub(skb->truesize, &sk->sk_rmem_alloc); + sk_mem_uncharge(sk, skb->truesize); + __skb_unlink(skb, &sk->sk_receive_queue); + skb_attempt_defer_free(skb); +} + static int __mptcp_recvmsg_mskq(struct sock *sk, struct msghdr *msg, size_t len, int flags, int copied_total, struct scm_timestamping_internal *tss, @@ -2046,13 +2057,7 @@ static int __mptcp_recvmsg_mskq(struct sock *sk, str= uct msghdr *msg, break; } =20 - /* avoid the indirect call, we know the destructor is sock_rfree */ - skb->destructor =3D NULL; - skb->sk =3D NULL; - atomic_sub(skb->truesize, &sk->sk_rmem_alloc); - sk_mem_uncharge(sk, skb->truesize); - __skb_unlink(skb, &sk->sk_receive_queue); - skb_attempt_defer_free(skb); + mptcp_eat_recv_skb(sk, skb); } =20 if (copied >=3D len) --=20 2.43.0 From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 70CE623AE9A for ; Thu, 23 Oct 2025 05:57:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199024; cv=none; b=NGnsUj2euE8i5MwWjS5RHEJ1oLBs8+6M/KJmixFYYrdnJIrUttZq9Yonm1hgTzxbkAP/bHz/6UZ1bgMaVwLjOfB0wOSrH4/SS7q+H2V1zPJHK9vAVnZRsAe+mWKm2CrhvR1nzPzCEtD350h/ejyAu9EE5fvBDcy06j40BZeKvg8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199024; c=relaxed/simple; bh=EwwvYgLKyu/s1cosj1DWg11KfFZ1448EbuBdw9/Dl94=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ndtoSRBXdZccWWUy1UhJlNUdOPwtlJr05lCcPqwBDviy8VbT7hDeO0dHSJxoLORuNL/mhIuqzUj4QxHltdKLnyjoZqkFyj+SwvBuBA2iTw+GepqbdQcLsLsoqqozlEMPHSPNorMBkeYpsdbuv7njty4U7bZ2uAC/W7Q+DmRhzEo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qucqZf5f; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qucqZf5f" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8D23EC4CEE7; Thu, 23 Oct 2025 05:57:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199024; bh=EwwvYgLKyu/s1cosj1DWg11KfFZ1448EbuBdw9/Dl94=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qucqZf5fd2551LJOahsCb1XQxDuDjsWF1lctutyc6p803JWIxMpUBzwS+JeYrEsTa V+e99OI1C/yvCXixwrzspbI9HbO4r0BjRl2wOl9asbFeKISI4FG92sjHpJoKBmjC/I WbkaWMcGDEYiFJapPj7M1874imFz2qYV2gl1SbXVEWeGt1dB75Px5sjE+3Jef4TwbH 1rPjJ7YRNFoQHe9SDhaCYICilMoN/OWJb7caU3ioR2/W8WXoIrAGb6v7ji3VLF/k7C 3TwoQEyjNipPXvSx8An3hGK/A7p712OXAu2iU4Z8POkzos+zHtoZPinaR5m5kG0sS9 TOMMZl05+7kRQ== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v13 2/8] mptcp: implement .read_sock Date: Thu, 23 Oct 2025 13:56:45 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang nvme_tcp_try_recv() needs to call .read_sock interface of struct proto_ops, but it's not implemented in MPTCP. This patch implements it with reference to __tcp_read_sock() and __mptcp_recvmsg_mskq(). Corresponding to tcp_recv_skb(), a new helper for MPTCP named mptcp_recv_skb() is added to peek a skb from sk->sk_receive_queue. Compared with __mptcp_recvmsg_mskq(), mptcp_read_sock() uses sk->sk_rcvbuf as the max read length. The LISTEN status is checked before the while loop, and mptcp_recv_skb() and mptcp_cleanup_rbuf() are invoked after the loop. In the loop, all flags checks for __mptcp_recvmsg_mskq() are removed. Reviewed-by: Hannes Reinecke Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 75 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 813d438bbea8..3f29236ce5fc 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -4197,6 +4197,79 @@ static __poll_t mptcp_poll(struct file *file, struct= socket *sock, return mask; } =20 +static struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct sk_buff *skb; + u32 offset; + + if (!list_empty(&msk->backlog_list)) + mptcp_move_skbs(sk); + + while ((skb =3D skb_peek(&sk->sk_receive_queue)) !=3D NULL) { + offset =3D MPTCP_SKB_CB(skb)->offset; + if (offset < skb->len) { + *off =3D offset; + return skb; + } + mptcp_eat_recv_skb(sk, skb); + } + return NULL; +} + +/* + * Note: + * - It is assumed that the socket was locked by the caller. + */ +static int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc, + sk_read_actor_t recv_actor) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + size_t len =3D sk->sk_rcvbuf; + struct sk_buff *skb; + int copied =3D 0; + u32 offset; + + if (sk->sk_state =3D=3D TCP_LISTEN) + return -ENOTCONN; + while ((skb =3D mptcp_recv_skb(sk, &offset)) !=3D NULL) { + u32 data_len =3D skb->len - offset; + int count; + u32 size; + + size =3D min_t(size_t, len - copied, data_len); + count =3D recv_actor(desc, skb, offset, size); + if (count <=3D 0) { + if (!copied) + copied =3D count; + break; + } + + copied +=3D count; + + msk->bytes_consumed +=3D count; + if (count < data_len) { + MPTCP_SKB_CB(skb)->offset +=3D count; + MPTCP_SKB_CB(skb)->map_seq +=3D count; + break; + } + + mptcp_eat_recv_skb(sk, skb); + + if (copied >=3D len) + break; + } + + mptcp_rcv_space_adjust(msk, copied); + + if (copied > 0) { + mptcp_recv_skb(sk, &offset); + mptcp_cleanup_rbuf(msk, copied); + } + + return copied; +} + static const struct proto_ops mptcp_stream_ops =3D { .family =3D PF_INET, .owner =3D THIS_MODULE, @@ -4217,6 +4290,7 @@ static const struct proto_ops mptcp_stream_ops =3D { .recvmsg =3D inet_recvmsg, .mmap =3D sock_no_mmap, .set_rcvlowat =3D mptcp_set_rcvlowat, + .read_sock =3D mptcp_read_sock, }; =20 static struct inet_protosw mptcp_protosw =3D { @@ -4321,6 +4395,7 @@ static const struct proto_ops mptcp_v6_stream_ops =3D= { .compat_ioctl =3D inet6_compat_ioctl, #endif .set_rcvlowat =3D mptcp_set_rcvlowat, + .read_sock =3D mptcp_read_sock, }; =20 static struct proto mptcp_v6_prot; --=20 2.43.0 From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 67F801DF252 for ; Thu, 23 Oct 2025 05:57:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199026; cv=none; b=rW7rjY/S3kbSfFNj8rnZzR0XVPZDMLaBDPkKBPftABcCtrUz7VMrAwG+usqF1ZDAycDX4k8IHykKL6Dc9iqtDZ6dlnTAZ+U3mbUMIXsdqMYpHUeInXGCJgj7bl7Lq+FMmVjTMBp0Fo9A7GF1beOlMbwZ6hodn3GHTX5W49fI3t0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199026; c=relaxed/simple; bh=Dh7AEh5ePrVz6T/Qe3BXGUCID93lwwa6+4yQ/bLsZTo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ERXH0sbphk3iBA+EQOEvZWXw0RB+gcHUbMgoLXCaDUkU8PbU3trQF3fg2LTRKPCsVZt/hgvz5hCiX32HiBtB0r/0770O2+5dNHet4T5eAIjjBjTW8UiCCHwkzcpigLujtw9TnF15fDand9r32KssbceyYbzG/4aKVClILbf9Nls= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u41DnJmQ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="u41DnJmQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AFFBEC4CEFB; Thu, 23 Oct 2025 05:57:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199026; bh=Dh7AEh5ePrVz6T/Qe3BXGUCID93lwwa6+4yQ/bLsZTo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u41DnJmQe4EIEq/VKnVka4bq2VKTwr2Fessl1grk6yeTrdJ1bEsiO2zr775ZlcVjI zXeb01w/Urw17Fz0iaAzqFhytSKu/GeXFGtBvtKSWGmBF/455B66m06SpqAdYemHt7 smxczjY0YwLY1pUxowunmNrq1Tx3k53EohEr3baJ6TF+SPE+qyudw9iRfp/jIm2ezO cOMtP/6eRWpeYxNQRwDqH3jJDiBvSCns19A/kR/MOMIrkhRly8lvPM+TcnG94uNfEG vG9vycHjtH4tZzUk1i3W1q78GPTCYtpZmBlXU/RqBstZ2/CfYbRCS3Niw3tAhLYuDk QTiKP4BJJ/9VQ== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang , Paolo Abeni Subject: [PATCH mptcp-next v13 3/8] tcp: add recv_should_stop helper Date: Thu, 23 Oct 2025 13:56:46 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang Factor out a new helper tcp_recv_should_stop() from tcp_recvmsg_locked() and tcp_splice_read() to check whether to stop receiving. It will be used for MPTCP too. Suggested-by: Paolo Abeni Signed-off-by: Geliang Tang --- include/net/tcp.h | 23 +++++++++++++++ net/ipv4/tcp.c | 73 ++++++++--------------------------------------- 2 files changed, 35 insertions(+), 61 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 190b3714e93b..4492397a5377 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -2935,4 +2935,27 @@ enum skb_drop_reason tcp_inbound_hash(struct sock *s= k, const void *saddr, const void *daddr, int family, int dif, int sdif); =20 +static inline int tcp_recv_should_stop(struct sock *sk, long timeo) +{ + if (sock_flag(sk, SOCK_DONE)) + return -ENETDOWN; + + if (sk->sk_err) + return sock_error(sk); + + if (sk->sk_shutdown & RCV_SHUTDOWN) + return -ESHUTDOWN; + + if (sk->sk_state =3D=3D TCP_CLOSE) + return -ENOTCONN; + + if (!timeo) + return -EAGAIN; + + if (signal_pending(current)) + return sock_intr_errno(timeo); + + return 0; +} + #endif /* _TCP_H */ diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index adc9edd2e9bb..c5653daa2201 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -842,26 +842,14 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *= ppos, if (ret < 0) break; else if (!ret) { + int err; + if (spliced) break; - if (sock_flag(sk, SOCK_DONE)) - break; - if (sk->sk_err) { - ret =3D sock_error(sk); - break; - } - if (sk->sk_shutdown & RCV_SHUTDOWN) - break; - if (sk->sk_state =3D=3D TCP_CLOSE) { - /* - * This occurs when user tries to read - * from never connected socket. - */ - ret =3D -ENOTCONN; - break; - } - if (!timeo) { - ret =3D -EAGAIN; + err =3D tcp_recv_should_stop(sk, timeo); + if (err < 0) { + if (err !=3D -ENETDOWN && err !=3D -ESHUTDOWN) + ret =3D err; break; } /* if __tcp_splice_read() got nothing while we have @@ -873,10 +861,6 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *p= pos, ret =3D sk_wait_data(sk, &timeo, NULL); if (ret < 0) break; - if (signal_pending(current)) { - ret =3D sock_intr_errno(timeo); - break; - } continue; } tss.len -=3D ret; @@ -887,9 +871,7 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *pp= os, release_sock(sk); lock_sock(sk); =20 - if (sk->sk_err || sk->sk_state =3D=3D TCP_CLOSE || - (sk->sk_shutdown & RCV_SHUTDOWN) || - signal_pending(current)) + if (tcp_recv_should_stop(sk, timeo)) break; } =20 @@ -2730,42 +2712,11 @@ static int tcp_recvmsg_locked(struct sock *sk, stru= ct msghdr *msg, size_t len, if (copied >=3D target && !READ_ONCE(sk->sk_backlog.tail)) break; =20 - if (copied) { - if (!timeo || - sk->sk_err || - sk->sk_state =3D=3D TCP_CLOSE || - (sk->sk_shutdown & RCV_SHUTDOWN) || - signal_pending(current)) - break; - } else { - if (sock_flag(sk, SOCK_DONE)) - break; - - if (sk->sk_err) { - copied =3D sock_error(sk); - break; - } - - if (sk->sk_shutdown & RCV_SHUTDOWN) - break; - - if (sk->sk_state =3D=3D TCP_CLOSE) { - /* This occurs when user tries to read - * from never connected socket. - */ - copied =3D -ENOTCONN; - break; - } - - if (!timeo) { - copied =3D -EAGAIN; - break; - } - - if (signal_pending(current)) { - copied =3D sock_intr_errno(timeo); - break; - } + err =3D tcp_recv_should_stop(sk, timeo); + if (err < 0) { + if (!copied && err !=3D -ENETDOWN && err !=3D -ESHUTDOWN) + copied =3D err; + break; } =20 if (copied >=3D target) { --=20 2.43.0 From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 AA97E1DF252 for ; Thu, 23 Oct 2025 05:57:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199028; cv=none; b=DpAvv+iGZ3E30ewAWcWmAn3j3MTuZWQzDAp/MH5HsW1Usj740MSTiNyHMCmiT62jPY3mKhYOlEKBn/0wzdGlwZRfeRcchzIQduZO1YGW8aDG11Uy14VL/zvzAKdk5o1sWMXE2lKsKnDYRbdxQU/+c0eAPdShKkjroZ0N8h4yd+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199028; c=relaxed/simple; bh=jpOR2B16uY540hC0wfr4+rzKppa46MNcPqYrZFy2x9o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NgHbMil6w8ezKifniF+pva3p/e+3qX9Il3sCmJIy+usq9WNjsdiij5XoDPEs81GBLTBHdZHbol9CHNPCwweT/o0kCPkRc5XuMH450aDUhwN8r4ht/LWPjy2WoAPIEuqj/d8uh5o6S37JBpHVBGoc5iq9/pBkaqNxqrmmMomUQY8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=R4mleXJV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="R4mleXJV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E84DDC4CEFB; Thu, 23 Oct 2025 05:57:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199028; bh=jpOR2B16uY540hC0wfr4+rzKppa46MNcPqYrZFy2x9o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R4mleXJV112SHOU15RNbGyIIuhdfuhRb7+feJ69ERWDRkEBz8nNbBkT68YHROQCkA G3ANU1VhR3DQXqoXzomvxw5q0TXun5aD/INVaaTaORO0gfB98FThASGtonrr/lXDIG LMuey63MySeuJ7+Q/DAyOuTCnH4G8oHqtmiHU/9S1xxnzdSH/mMedUU3GCeWtlHc8c pMLe432r2jn1dngzy+KiHzPEsWj5gD/9Y+8pD/qM44pciD4K0R80p12AKOQnlPXnkk tUSiEqJ84ZTpZ4izLWP+fQZ+sHAXrQEe10eJislYZogPhOnSKEXqA+ZsHZfClYfVtg Sq9em4dvxoB8Q== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v13 4/8] mptcp: use recv_should_stop helper Date: Thu, 23 Oct 2025 13:56:47 +0800 Message-ID: <00529da4ea8b262f82505fc99d717145bc8c2aef.1761198660.git.geliang@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang Use the newly added tcp_recv_should_stop() helper in mptcp_recvmsg() to check whether to stop receiving. Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 35 +++++------------------------------ 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 3f29236ce5fc..1955717e7dfc 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2306,36 +2306,11 @@ static int mptcp_recvmsg(struct sock *sk, struct ms= ghdr *msg, size_t len, if (copied >=3D target) break; =20 - if (copied) { - if (sk->sk_err || - sk->sk_state =3D=3D TCP_CLOSE || - (sk->sk_shutdown & RCV_SHUTDOWN) || - !timeo || - signal_pending(current)) - break; - } else { - if (sk->sk_err) { - copied =3D sock_error(sk); - break; - } - - if (sk->sk_shutdown & RCV_SHUTDOWN) - break; - - if (sk->sk_state =3D=3D TCP_CLOSE) { - copied =3D -ENOTCONN; - break; - } - - if (!timeo) { - copied =3D -EAGAIN; - break; - } - - if (signal_pending(current)) { - copied =3D sock_intr_errno(timeo); - break; - } + err =3D tcp_recv_should_stop(sk, timeo); + if (err < 0) { + if (!copied && err !=3D -ESHUTDOWN) + copied =3D err; + break; } =20 pr_debug("block timeout %ld\n", timeo); --=20 2.43.0 From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 BAD3921B191 for ; Thu, 23 Oct 2025 05:57:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199030; cv=none; b=HVSMnmQ8E32UHs0sxnEY76wh9YuPbG7F0K/pqWMez3qegeu7nsfWfjKe5h1hB07zeSZuaTJ3ngSak5xxWNbcr/qnHYUmmr+dXacSB0BqAz/rwCNs5R+qzJOvn93DXwDkxPCInbUdv96B8W4lmjlVUKkCExjOIdr5VSIETDrTYzI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199030; c=relaxed/simple; bh=05BULzRiW7apYMuz0MjN22qZsOUPN0LFtqDcXSMcOeY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nVqJv3ujMaguXxJ2husyTH+eOxlIgWFMsqT6QvPbaL7xmEeOHmU3mTrU2DM7ay/RqsVsRouv458XIuj9vLp6jw+JFldGGOITdfE+IyBzNPhSrb0mwdFmVQHnpOlpdvihP5LXlBB0e8uJsLU8IdP98UP2TbQRQ/N/dMsaWOYxIXA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hi1VYPcj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hi1VYPcj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DB225C4CEFB; Thu, 23 Oct 2025 05:57:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199030; bh=05BULzRiW7apYMuz0MjN22qZsOUPN0LFtqDcXSMcOeY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hi1VYPcjy816KDHAk6VJ4BP09UG5mATxDCHVpAHYEib0FEV+EAtgdqLeGtvSsYzH2 g0oI5wW8N4CQAdG2jkkUlm1DQpb083S8T+S0gobTbdaWS3txbHd+yTEgpdqmSQC5SD W+3uTAnXgMq8oZEDBL6PXyr3M57v713jfEBl+Q83saaUOMGT0jjB8b8E4yBZ3M9BNB 42u+AqtN7dD+ItbA4dxxt3Y5LPpIHa+9JHpE4AopEfH281HUbLK3P8IrNcXc8GzLyk Ig50KqFgCVRJpPwplgeH9Ly0h/Jr7xzpHVmYXgljYDbavqzd2DM0JkX4BOUV/GL25N WmaXSsh1NmzeQ== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang , Paolo Abeni Subject: [PATCH mptcp-next v13 5/8] tcp: export tcp_splice_state Date: Thu, 23 Oct 2025 13:56:48 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang Export struct tcp_splice_state into net/tcp.h so that it can be used by MPTCP. Suggested-by: Paolo Abeni Signed-off-by: Geliang Tang --- include/net/tcp.h | 9 +++++++++ net/ipv4/tcp.c | 9 --------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 4492397a5377..b54227ba79ce 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -2958,4 +2958,13 @@ static inline int tcp_recv_should_stop(struct sock *= sk, long timeo) return 0; } =20 +/* + * TCP splice context + */ +struct tcp_splice_state { + struct pipe_inode_info *pipe; + size_t len; + unsigned int flags; +}; + #endif /* _TCP_H */ diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index c5653daa2201..27786bebb101 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -318,15 +318,6 @@ EXPORT_SYMBOL(tcp_have_smc); struct percpu_counter tcp_sockets_allocated ____cacheline_aligned_in_smp; EXPORT_IPV6_MOD(tcp_sockets_allocated); =20 -/* - * TCP splice context - */ -struct tcp_splice_state { - struct pipe_inode_info *pipe; - size_t len; - unsigned int flags; -}; - /* * Pressure flag: try to collapse. * Technical note: it is used by multiple contexts non atomically. --=20 2.43.0 From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D5D8B219A7D for ; Thu, 23 Oct 2025 05:57:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199032; cv=none; b=VU7sjDCZciubk+QKQHW/AWZqoX3ZMQMEUDh72rQOZatXduLcIKDHjiGgYHpOl0WNYaholiEk7n05vYiUQ3UhloMMjtW2RCUMA5CO7jWCSRH3fCGrAfrJEvjca8n8DJf3PDqJ9GzkUaGc2eHXOBr0zHXVwsYeC3d6H41eycvcuRw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199032; c=relaxed/simple; bh=rAGUhChJa/qTPr6/TTSMvqLm774ReaCbFwtUBY4DhDk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WM1H3ee0xrq4GtMokC3UWE1TYu26dssNulbt3lkz1IUVqNxm3+RngxqHWMZpqTIEzUpQFeNo8h9pIL2oTjEmRfGgl/gIYu8YyZvK9OmiD3b0rHU1oEsr+BD+jCAdaGyj+615+HarSagneDOsLcPnjNaZm1dg0Xy9VxndTLGmRxI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=N40gnNN4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="N40gnNN4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D180C4CEFD; Thu, 23 Oct 2025 05:57:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199032; bh=rAGUhChJa/qTPr6/TTSMvqLm774ReaCbFwtUBY4DhDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=N40gnNN4rw1t74c7GXnh2UMRYoTTb3TAH4B3VQwzHepNeXRYPDz/fAWX90pExYJrE naN+yhY6Keyym8fjOoDnN/1kXp/G4VQiSTXLAviJpKUZ+LOsoEJn3ts6ehEZTPIblp q5gmDlaIM9W6HmjxrUCGBUVkkAglRWqcca4ZSa/VTyGWbNTMbCn8dC4UursKyELX4u EjwM3HMxRPVuLgAxU1Da/EcTw5k8oNf/CwTGjRb8KD47r4/Ba0UKMLh+zjGM9/++1E ID45AK0KVxOe4wz4PGMqYMY88KVX1Q49Rcn3r+SbySmcHYtABm3PWncFMR5P8wgrru ewSpEXUhAgxQw== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v13 6/8] mptcp: implement .splice_read Date: Thu, 23 Oct 2025 13:56:49 +0800 Message-ID: <6388be6c73553a40fc8a60aa020cea0c10b40005.1761198660.git.geliang@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang This patch implements .splice_read interface of mptcp struct proto_ops as mptcp_splice_read() with reference to tcp_splice_read(). Corresponding to __tcp_splice_read(), __mptcp_splice_read() is defined, invoking mptcp_read_sock() instead of tcp_read_sock(). mptcp_splice_read() is almost the same as tcp_splice_read(), except for sock_rps_record_flow(). Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 109 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 1955717e7dfc..91d3bf5e6a75 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -4245,6 +4245,113 @@ static int mptcp_read_sock(struct sock *sk, read_de= scriptor_t *desc, return copied; } =20 +static int mptcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_bu= ff *skb, + unsigned int offset, size_t len) +{ + struct tcp_splice_state *tss =3D rd_desc->arg.data; + int ret; + + ret =3D skb_splice_bits(skb, skb->sk, offset, tss->pipe, + min(rd_desc->count, len), tss->flags); + if (ret > 0) + rd_desc->count -=3D ret; + return ret; +} + +static int __mptcp_splice_read(struct sock *sk, struct tcp_splice_state *t= ss) +{ + /* Store TCP splice context information in read_descriptor_t. */ + read_descriptor_t rd_desc =3D { + .arg.data =3D tss, + .count =3D tss->len, + }; + + return mptcp_read_sock(sk, &rd_desc, mptcp_splice_data_recv); +} + +/** + * mptcp_splice_read - splice data from MPTCP socket to a pipe + * @sock: socket to splice from + * @ppos: position (not valid) + * @pipe: pipe to splice to + * @len: number of bytes to splice + * @flags: splice modifier flags + * + * Description: + * Will read pages from given socket and fill them into a pipe. + * + **/ +static ssize_t mptcp_splice_read(struct socket *sock, loff_t *ppos, + struct pipe_inode_info *pipe, size_t len, + unsigned int flags) +{ + struct tcp_splice_state tss =3D { + .pipe =3D pipe, + .len =3D len, + .flags =3D flags, + }; + struct sock *sk =3D sock->sk; + ssize_t spliced =3D 0; + int ret =3D 0; + long timeo; + + /* + * We can't seek on a socket input + */ + if (unlikely(*ppos)) + return -ESPIPE; + + lock_sock(sk); + + mptcp_rps_record_subflows(mptcp_sk(sk)); + + timeo =3D sock_rcvtimeo(sk, sock->file->f_flags & O_NONBLOCK); + while (tss.len) { + ret =3D __mptcp_splice_read(sk, &tss); + if (ret < 0) { + break; + } else if (!ret) { + int err; + + if (spliced) + break; + err =3D tcp_recv_should_stop(sk, timeo); + if (err < 0) { + if (err !=3D -ESHUTDOWN) + ret =3D err; + break; + } + /* if __mptcp_splice_read() got nothing while we have + * an skb in receive queue, we do not want to loop. + * This might happen with URG data. + */ + if (!skb_queue_empty(&sk->sk_receive_queue)) + break; + ret =3D sk_wait_data(sk, &timeo, NULL); + if (ret < 0) + break; + continue; + } + tss.len -=3D ret; + spliced +=3D ret; + + if (!tss.len || !timeo) + break; + release_sock(sk); + lock_sock(sk); + + if (tcp_recv_should_stop(sk, timeo)) + break; + } + + release_sock(sk); + + if (spliced) + return spliced; + + return ret; +} + static const struct proto_ops mptcp_stream_ops =3D { .family =3D PF_INET, .owner =3D THIS_MODULE, @@ -4266,6 +4373,7 @@ static const struct proto_ops mptcp_stream_ops =3D { .mmap =3D sock_no_mmap, .set_rcvlowat =3D mptcp_set_rcvlowat, .read_sock =3D mptcp_read_sock, + .splice_read =3D mptcp_splice_read, }; =20 static struct inet_protosw mptcp_protosw =3D { @@ -4371,6 +4479,7 @@ static const struct proto_ops mptcp_v6_stream_ops =3D= { #endif .set_rcvlowat =3D mptcp_set_rcvlowat, .read_sock =3D mptcp_read_sock, + .splice_read =3D mptcp_splice_read, }; =20 static struct proto mptcp_v6_prot; --=20 2.43.0 From nobody Fri Oct 31 16:20:38 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 3C418239E97 for ; Thu, 23 Oct 2025 05:57:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199035; cv=none; b=A5JHlvLVdBsBnFHvU9ZOENZD3rjDmRCd5B4oaIUfYcfn2cPCGdZy6ZZ9oUy+nURQNY4C6KjLTv7j/u8NcdWBA6rLm1AMwJNidNWzGptnvw8RE7HnZLI0cy8Iry4zvGvRUgJUUur4712FxZsIEvhZ0cXwZwfHnpE1xwIrK7ppD68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761199035; c=relaxed/simple; bh=u1OZJ9In7hfd07kTJbkYzYi2oSaHFfRsA0/bm+9E7ug=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=muLSc8Vc8OqkKe/vPxgc3uz64j8Kc79cCkBBH88xzUgs0Ex8oWnrcG3JuSIsOf4uqtFg95FnShAN3ZYD54MHP0YfbKugtni6hAyr8wvPrA8N/AxmkWUo3qiqDjFgn1bXu+AZ482vgLUlk18lvdGFgxt7TVsMe7iFhAT/JBcOp2o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ff+P7ds4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ff+P7ds4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 62EE1C4CEFB; Thu, 23 Oct 2025 05:57:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761199034; bh=u1OZJ9In7hfd07kTJbkYzYi2oSaHFfRsA0/bm+9E7ug=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ff+P7ds4vc4gyg59nn0BZoyYk8ROLJx+4GYOXnB19Gn/bI3LxsNdiqHfkZEsn38Y3 nj1ZU9Ub818T4LyneSyODUmP26cy4zM6BKnQyLzMQx3gHwONH+aNenXJCbIKANzE5y zIMTLoENUKTzbE2ZgpCA2/IyByKZt7zBiWctwIPnuRU/k0YE30LN23zLTd1wrH+0SB urOsr+h7p6Di8/tCLbOSP1cnaq19LtRmMGKAb2m3SVT1s7gbqk1bGNw3V3FE88L/Jf MikuNuD2bn2ALmNbetsGawywMzVxhha4/tIhdrAz78ZbD7Qt8ZgkEPr3vt0RXym86S yVZyWMdOKnDLQ== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v13 7/8] selftests: mptcp: add splice io mode Date: Thu, 23 Oct 2025 13:56:50 +0800 Message-ID: <427c47a3dbdcf1d42b1be8134fb7e5331ffc0dbb.1761198660.git.geliang@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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: Geliang Tang This patch adds a new 'splice' io mode for mptcp_connect to test the newly added read_sock() and splice_read() functions of MPTCP. do_splice() efficiently transfers data directly between two file descriptors (infd and outfd) without copying to userspace, using Linux's splice() system call. Usage: ./mptcp_connect.sh -m splice Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_connect.c | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/test= ing/selftests/net/mptcp/mptcp_connect.c index c030b08a7195..3834304f2b89 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -51,6 +51,7 @@ enum cfg_mode { CFG_MODE_POLL, CFG_MODE_MMAP, CFG_MODE_SENDFILE, + CFG_MODE_SPLICE, }; =20 enum cfg_peek { @@ -123,7 +124,7 @@ static void die_usage(void) fprintf(stderr, "\t-j -- add additional sleep at connection start and= tear down " "-- for MPJ tests\n"); fprintf(stderr, "\t-l -- listens mode, accepts incoming connection\n"= ); - fprintf(stderr, "\t-m [poll|mmap|sendfile] -- use poll(default)/mmap+writ= e/sendfile\n"); + fprintf(stderr, "\t-m [poll|mmap|sendfile|splice] -- use poll(default)/mm= ap+write/sendfile/splice\n"); fprintf(stderr, "\t-M mark -- set socket packet mark\n"); fprintf(stderr, "\t-o option -- test sockopt