[PATCH mptcp-next v5 2/5] mptcp: add recvmsg_desc helper

Geliang Tang posted 5 patches 2 months, 3 weeks ago
There is a newer version of this series
[PATCH mptcp-next v5 2/5] mptcp: add recvmsg_desc helper
Posted by Geliang Tang 2 months, 3 weeks ago
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
Re: [PATCH mptcp-next v5 2/5] mptcp: add recvmsg_desc helper
Posted by Paolo Abeni 2 months, 2 weeks ago
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