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
next prev parent 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.