MPTCP Linux Development
 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 v4 03/10] Squash to "mptcp: add get_subflow wrappers"
Date: Tue, 31 May 2022 17:59:40 -0700 (PDT)	[thread overview]
Message-ID: <4afab57d-4c35-fa46-c379-453c98a963ef@linux.intel.com> (raw)
In-Reply-To: <38eee17dadb62fe1e21a19c875cf63e1cadb0f1f.1653987929.git.geliang.tang@suse.com>

On Tue, 31 May 2022, Geliang Tang wrote:

> Please update the commit log:
>
> '''
> This patch defines two new wrappers mptcp_sched_get_send() and
> mptcp_sched_get_retrans(), invoke get_subflow() of msk->sched in them.
> Use them instead of using mptcp_subflow_get_send() or
> mptcp_subflow_get_retrans() directly.
>
> Set the subflow pointers array in struct mptcp_sched_data before invoking
> get_subflow(), then it can be used in get_subflow() in the BPF contexts.
>
> Check the subflow scheduled flags to test which subflow or subflows are
> picked by the scheduler.
> '''
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/sched.c | 54 +++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 43 insertions(+), 11 deletions(-)
>
> diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
> index 3ceb721e6489..613b7005938c 100644
> --- a/net/mptcp/sched.c
> +++ b/net/mptcp/sched.c
> @@ -88,11 +88,25 @@ void mptcp_release_sched(struct mptcp_sock *msk)
> 	bpf_module_put(sched, sched->owner);
> }
>
> -static int mptcp_sched_data_init(struct mptcp_sock *msk,
> +static int mptcp_sched_data_init(struct mptcp_sock *msk, bool reinject,
> 				 struct mptcp_sched_data *data)
> {
> -	data->sock = NULL;
> -	data->call_again = 0;
> +	struct mptcp_subflow_context *subflow;
> +	int i = 0;
> +
> +	data->reinject = reinject;
> +
> +	mptcp_for_each_subflow(msk, subflow) {
> +		if (i == MPTCP_SUBFLOWS_MAX) {
> +			pr_warn_once("too many subflows");
> +			break;
> +		}
> +		WRITE_ONCE(subflow->scheduled, false);

If subflow->scheduled is using READ_ONCE/WRITE_ONCE semantics, then 
writing it directly from BPF code is going to be a problem. The code in 
this patch set would work ok since all read and write access is under the 
msk lock, but I think integrating with all of the transmit and retransmit 
code (especially transmission in mptcp_subflow_process_delegated()) would 
make it important to use WRITE_ONCE() to set subflow->scheduled.

I think that requires using a C helper function called from BPF to do 
WRITE_ONCE(subflow->scheduled), or using a lock to order accesses. The 
mptcp_data_lock is already used in mptcp_subflow_process_delegated() but 
we probably don't want to add more locking to mptcp_sendmsg(). That makes 
me think the helper function might be better - unless there's a generic 
BPF technique for using WRITE_ONCE.

> +		data->contexts[i++] = subflow;
> +	}
> +
> +	for (; i < MPTCP_SUBFLOWS_MAX; i++)
> +		data->contexts[i] = NULL;
>
> 	return 0;
> }
> @@ -100,6 +114,8 @@ static int mptcp_sched_data_init(struct mptcp_sock *msk,
> struct sock *mptcp_sched_get_send(struct mptcp_sock *msk)
> {
> 	struct mptcp_sched_data data;
> +	struct sock *ssk = NULL;
> +	int i;
>
> 	sock_owned_by_me((struct sock *)msk);
>
> @@ -113,16 +129,25 @@ struct sock *mptcp_sched_get_send(struct mptcp_sock *msk)
> 	if (!msk->sched)
> 		return mptcp_subflow_get_send(msk);
>
> -	mptcp_sched_data_init(msk, &data);
> -	msk->sched->get_subflow(msk, false, &data);
> +	mptcp_sched_data_init(msk, false, &data);
> +	msk->sched->get_subflow(msk, &data);
> +
> +	for (i = 0; i < MPTCP_SUBFLOWS_MAX; i++) {
> +		if (data.contexts[i] && READ_ONCE(data.contexts[i]->scheduled)) {
> +			ssk = data.contexts[i]->tcp_sock;
> +			msk->last_snd = ssk;
> +			break;
> +		}
> +	}

I think this is ok for a placeholder until more of the transmit 
integration is done.

>
> -	msk->last_snd = data.sock;
> -	return data.sock;
> +	return ssk;
> }
>
> struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk)
> {
> 	struct mptcp_sched_data data;
> +	struct sock *ssk = NULL;
> +	int i;
>
> 	sock_owned_by_me((const struct sock *)msk);
>
> @@ -133,9 +158,16 @@ struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk)
> 	if (!msk->sched)
> 		return mptcp_subflow_get_retrans(msk);
>
> -	mptcp_sched_data_init(msk, &data);
> -	msk->sched->get_subflow(msk, true, &data);
> +	mptcp_sched_data_init(msk, true, &data);
> +	msk->sched->get_subflow(msk, &data);
> +
> +	for (i = 0; i < MPTCP_SUBFLOWS_MAX; i++) {
> +		if (data.contexts[i] && READ_ONCE(data.contexts[i]->scheduled)) {
> +			ssk = data.contexts[i]->tcp_sock;
> +			msk->last_snd = ssk;
> +			break;
> +		}
> +	}
>
> -	msk->last_snd = data.sock;
> -	return data.sock;
> +	return ssk;
> }
> -- 
> 2.34.1
>
>
>

--
Mat Martineau
Intel

  reply	other threads:[~2022-06-01  0:59 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-31  9:09 [PATCH mptcp-next v4 00/10] BPF packet scheduler Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 01/10] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
2022-06-01  0:38   ` Mat Martineau
2022-05-31  9:09 ` [PATCH mptcp-next v4 02/10] Squash to "mptcp: add sched in mptcp_sock" Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 03/10] Squash to "mptcp: add get_subflow wrappers" Geliang Tang
2022-06-01  0:59   ` Mat Martineau [this message]
2022-05-31  9:09 ` [PATCH mptcp-next v4 04/10] Squash to "mptcp: add bpf_mptcp_sched_ops" Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 05/10] Squash to "selftests/bpf: add bpf_first scheduler" Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 06/10] Squash to "selftests/bpf: add bpf_first test" Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 07/10] selftests/bpf: add bpf_bkup scheduler Geliang Tang
2022-06-01  1:11   ` Mat Martineau
2022-05-31  9:09 ` [PATCH mptcp-next v4 08/10] selftests/bpf: add bpf_backup test Geliang Tang
2022-05-31  9:24   ` Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 09/10] selftests/bpf: add bpf_rr scheduler Geliang Tang
2022-05-31  9:09 ` [PATCH mptcp-next v4 10/10] selftests/bpf: add bpf_rr test Geliang Tang
2022-05-31  9:21   ` selftests/bpf: add bpf_rr test: Build Failure MPTCP CI
2022-05-31 10:39   ` selftests/bpf: add bpf_rr test: 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=4afab57d-4c35-fa46-c379-453c98a963ef@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox