All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mat Martineau <mathew.j.martineau@linux.intel.com>
To: Geliang Tang <geliang.tang@suse.com>
Cc: mptcp@lists.linux.dev
Subject: Re: [PATCH mptcp-next v2 2/4] mptcp: add do_push_pending helper
Date: Thu, 29 Sep 2022 17:46:56 -0700 (PDT)	[thread overview]
Message-ID: <147df9d2-45a2-9020-95e5-4ebe12a7f469@linux.intel.com> (raw)
In-Reply-To: <3c7f5eb863b0b3b065fe28dfa116e7e1955b40d1.1664463491.git.geliang.tang@suse.com>

On Thu, 29 Sep 2022, Geliang Tang wrote:

> This patch moves the duplicate code from __mptcp_push_pending() and
> __mptcp_subflow_push_pending() into a new helper function, named
> __do_push_pending(). And simplify __mptcp_push_pending() by invoking
> this helper.
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/protocol.c | 62 ++++++++++++++++++++++++--------------------
> 1 file changed, 34 insertions(+), 28 deletions(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 37a252a3f05b..fe92a301b8f7 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1483,12 +1483,6 @@ struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
> 	return ssk;
> }
>
> -static void mptcp_push_release(struct sock *ssk, struct mptcp_sendmsg_info *info)
> -{
> -	tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle, info->size_goal);
> -	release_sock(ssk);
> -}
> -
> static void mptcp_update_post_push(struct mptcp_sock *msk,
> 				   struct mptcp_data_frag *dfrag,
> 				   u32 sent)
> @@ -1520,40 +1514,29 @@ void mptcp_check_and_set_pending(struct sock *sk)
> 		mptcp_sk(sk)->push_pending |= BIT(MPTCP_PUSH_PENDING);
> }
>
> -void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> +static int __do_push_pending(struct sock *sk, struct sock *ssk,
> +			     struct mptcp_sendmsg_info *info)
> {
> 	struct mptcp_sock *msk = mptcp_sk(sk);
> -	struct mptcp_sendmsg_info info = {
> -				.flags = flags,
> -	};
> -	bool do_check_data_fin = false;
> 	struct mptcp_data_frag *dfrag;
> -	struct sock *ssk;
> -	int len;
> -
> -	ssk = mptcp_sched_get_send(msk);
> -	if (!ssk)
> -		goto out;
> -
> -	lock_sock(ssk);
> +	int len, copied = 0;
>
> 	while ((dfrag = mptcp_send_head(sk))) {
> -		info.sent = dfrag->already_sent;
> -		info.limit = dfrag->data_len;
> +		info->sent = dfrag->already_sent;
> +		info->limit = dfrag->data_len;
> 		len = dfrag->data_len - dfrag->already_sent;
> 		while (len > 0) {
> 			int ret = 0;
>
> -			ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
> +			ret = mptcp_sendmsg_frag(sk, ssk, dfrag, info);
> 			if (ret <= 0) {
> 				if (ret == -EAGAIN)
> 					continue;
> -				mptcp_push_release(ssk, &info);
> 				goto out;
> 			}
>
> -			do_check_data_fin = true;
> -			info.sent += ret;
> +			info->sent += ret;
> +			copied += ret;
> 			len -= ret;
>
> 			mptcp_update_post_push(msk, dfrag, ret);
> @@ -1569,10 +1552,33 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> 		}
> 	}
>
> -	if (do_check_data_fin) {
> -		tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
> -			 info.size_goal);
> +out:
> +	if (copied) {
> +		tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle,
> +			 info->size_goal);
> 	}
> +
> +	return copied;
> +}
> +
> +void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> +{
> +	struct mptcp_sock *msk = mptcp_sk(sk);
> +	struct mptcp_sendmsg_info info = {
> +				.flags = flags,
> +	};
> +	bool do_check_data_fin = false;
> +	struct sock *ssk;
> +
> +	ssk = mptcp_sched_get_send(msk);
> +	if (!ssk)
> +		goto out;
> +
> +	if (!mptcp_send_head(sk))
> +		goto out;
> +
> +	lock_sock(ssk);
> +	do_check_data_fin = __do_push_pending(sk, ssk, &info);
> 	release_sock(ssk);
>
> out:

I think this is getting close to what I was talking about, but does not 
have the loop that will call the scheduler again. I tried this code and 
got slightly better performance in simult_flows.sh:

void __mptcp_push_pending(struct sock *sk, unsigned int flags)
{
 	struct mptcp_sock *msk = mptcp_sk(sk);
 	struct mptcp_sendmsg_info info = {
 				.flags = flags,
 	};
 	bool do_check_data_fin = false;
 	struct sock *ssk;

 	while (mptcp_send_head(sk) && (ssk = mptcp_sched_get_send(msk))) {
 		lock_sock(ssk);
 		do_check_data_fin = __do_push_pending(sk, ssk, &info);
 		release_sock(ssk);
 	}

 	/* ensure the rtx timer is running */
 	if (!mptcp_timer_pending(sk))
 		mptcp_reset_timer(sk);
 	if (do_check_data_fin)
 		__mptcp_check_send_data_fin(sk);
}



--
Mat Martineau
Intel

  reply	other threads:[~2022-09-30  0:47 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-29 15:03 [PATCH mptcp-next v2 0/4] refactor push pending Geliang Tang
2022-09-29 15:03 ` [PATCH mptcp-next v2 1/4] mptcp: update __mptcp_push_pending Geliang Tang
2022-09-30  0:44   ` Mat Martineau
2022-09-29 15:03 ` [PATCH mptcp-next v2 2/4] mptcp: add do_push_pending helper Geliang Tang
2022-09-30  0:46   ` Mat Martineau [this message]
2022-09-29 15:03 ` [PATCH mptcp-next v2 3/4] mptcp: update __mptcp_subflow_push_pending Geliang Tang
2022-09-29 15:03 ` [PATCH mptcp-next v2 4/4] mptcp: simplify __mptcp_subflow_push_pending Geliang Tang
2022-10-06 17:46   ` mptcp: simplify __mptcp_subflow_push_pending: Tests Results MPTCP CI

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=147df9d2-45a2-9020-95e5-4ebe12a7f469@linux.intel.com \
    --to=mathew.j.martineau@linux.intel.com \
    --cc=geliang.tang@suse.com \
    --cc=mptcp@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.