From: Geliang Tang <tanggeliang@kylinos.cn>
In order to implement .read_sock interface of mptcp later, this patch
extends __mptcp_recvmsg_mskq() to a more general __mptcp_recvmsg_desc(),
which accepts read_descriptor_t and sk_read_actor_t parameters. In this
way, the original __mptcp_recvmsg_mskq() can be implemented by passing
a newly defined mptcp_recvmsg_actor() to __mptcp_recvmsg_desc(). This
mptcp_recvmsg_actor() is a wrapper for skb_copy_datagram_msg().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/protocol.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 2f747ab730e5..2ebdad6b233d 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1844,8 +1844,9 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied);
-static int __mptcp_recvmsg_mskq(struct sock *sk,
- struct msghdr *msg,
+static int __mptcp_recvmsg_desc(struct sock *sk,
+ read_descriptor_t *desc,
+ sk_read_actor_t recv_actor,
size_t len, int flags,
struct scm_timestamping_internal *tss,
int *cmsg_flags)
@@ -1861,12 +1862,14 @@ static int __mptcp_recvmsg_mskq(struct sock *sk,
int err;
if (!(flags & MSG_TRUNC)) {
- err = skb_copy_datagram_msg(skb, offset, msg, count);
- if (unlikely(err < 0)) {
+ err = recv_actor(desc, skb, offset, count);
+ if (err <= 0) {
if (!copied)
return err;
break;
}
+ if (!WARN_ON_ONCE(err > count))
+ count = err;
}
if (MPTCP_SKB_CB(skb)->has_rxtstamp) {
@@ -1902,6 +1905,32 @@ static int __mptcp_recvmsg_mskq(struct sock *sk,
return copied;
}
+static int mptcp_recvmsg_actor(read_descriptor_t *rd_desc, struct sk_buff *skb,
+ unsigned int offset, size_t len)
+{
+ struct msghdr *msg = rd_desc->arg.data;
+ int err;
+
+ err = skb_copy_datagram_msg(skb, offset, msg, len);
+ if (unlikely(err < 0))
+ return err;
+ return len;
+}
+
+static int __mptcp_recvmsg_mskq(struct sock *sk,
+ struct msghdr *msg,
+ size_t len, int flags,
+ struct scm_timestamping_internal *tss,
+ int *cmsg_flags)
+{
+ read_descriptor_t desc = {
+ .arg.data = msg,
+ };
+
+ return __mptcp_recvmsg_desc(sk, &desc, mptcp_recvmsg_actor,
+ len, flags, tss, cmsg_flags);
+}
+
/* receive buffer autotuning. See tcp_rcv_space_adjust for more information.
*
* Only difference: Use highest rtt estimate of the subflows in use.
--
2.48.1
hi,
I'm sorry, I look at v4 too late...
On 6/28/25 8:57 AM, Geliang Tang wrote:
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 2f747ab730e5..2ebdad6b233d 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1844,8 +1844,9 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
>
> static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied);
>
> -static int __mptcp_recvmsg_mskq(struct sock *sk,
> - struct msghdr *msg,
> +static int __mptcp_recvmsg_desc(struct sock *sk,
> + read_descriptor_t *desc,
> + sk_read_actor_t recv_actor,
> size_t len, int flags,
> struct scm_timestamping_internal *tss,
> int *cmsg_flags)
> @@ -1861,12 +1862,14 @@ static int __mptcp_recvmsg_mskq(struct sock *sk,
> int err;
>
> if (!(flags & MSG_TRUNC)) {
> - err = skb_copy_datagram_msg(skb, offset, msg, count);
> - if (unlikely(err < 0)) {
> + err = recv_actor(desc, skb, offset, count);
> + if (err <= 0) {
> if (!copied)
> return err;
> break;
> }
> + if (!WARN_ON_ONCE(err > count))
> + count = err;
> }
>
> if (MPTCP_SKB_CB(skb)->has_rxtstamp) {
> @@ -1902,6 +1905,32 @@ static int __mptcp_recvmsg_mskq(struct sock *sk,
> return copied;
> }
>
> +static int mptcp_recvmsg_actor(read_descriptor_t *rd_desc, struct sk_buff *skb,
> + unsigned int offset, size_t len)
> +{
> + struct msghdr *msg = rd_desc->arg.data;
> + int err;
> +
> + err = skb_copy_datagram_msg(skb, offset, msg, len);
> + if (unlikely(err < 0))
> + return err;
> + return len;
> +}
> +
> +static int __mptcp_recvmsg_mskq(struct sock *sk,
> + struct msghdr *msg,
> + size_t len, int flags,
> + struct scm_timestamping_internal *tss,
> + int *cmsg_flags)
> +{
> + read_descriptor_t desc = {
> + .arg.data = msg,
> + };
> +
> + return __mptcp_recvmsg_desc(sk, &desc, mptcp_recvmsg_actor,
> + len, flags, tss, cmsg_flags);
We want to avoid this indirect call in the fast path, even with the
indirect call wrapper. I think the approach in v4 should be preferred.
Also this looks problematic from a functional perspective, see comment
on the next patch
/P
© 2016 - 2026 Red Hat, Inc.