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