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 - 2025 Red Hat, Inc.