From: Mat Martineau <mathew.j.martineau@linux.intel.com>
To: Geliang Tang <geliang.tang@suse.com>
Cc: Paolo Abeni <pabeni@redhat.com>, mptcp@lists.linux.dev
Subject: Re: [PATCH mptcp-next 1/4] mptcp: update __mptcp_push_pending
Date: Wed, 28 Sep 2022 17:02:13 -0700 (PDT) [thread overview]
Message-ID: <9c2baa9d-db31-3bd7-d1ec-bc3860d68a80@linux.intel.com> (raw)
In-Reply-To: <20220928125251.GA4575@bogon>
On Wed, 28 Sep 2022, Geliang Tang wrote:
> On Wed, Sep 28, 2022 at 01:02:07PM +0200, Paolo Abeni wrote:
>> On Wed, 2022-09-28 at 17:48 +0800, Geliang Tang wrote:
>>> To support redundant package schedulers more easily, this patch moves the
>>> packet scheduler out of the dfrags loop in __mptcp_push_pending(), invoke
>>> mptcp_sched_get_send() only once.
>>
>> I fear the above will make cause hitting HoL blocking [more]
>> frequently/easily. I'm not sure if the simult_flows.sh self test will
>> catch that, but you should see a measurably worse running time for such
>> test - in non debug build, as the average of multiple runs.
>
> Yes, simult_flows.sh self test failed in my tests. I guess this problem
> also exists in "BPF redundant scheduler" v12, because it also uses the
> same logic in __mptcp_push_pending(), move the packet scheduler out of
> the dfrags loop.
>
Hi Geliang -
Thanks for posting the __mptcp_push_pending() changes as a separate
series, that's the main area of complexity in the BPF redundant scheduler
series. I was trying to come up with some more detailed proposals for this
part of the code, but it will be easier to discuss it in this 4-patch
series.
We had talked about the need to change the __mptcp_push_pending() loops to
support the redundant scheduler, since the existing structure and locking
optimizations don't fit well with trying to send the same dfrags across
multiple subflows. A simplified view of the existing code is this:
/* [1] Existing send loops */
For each dfrag:
While sends succeed:
Call the scheduler (selects subflow and msk->snd_burst)
Update subflow locks (push/release/acquire as needed)
Send the dfrag data with mptcp_sendmsg_frag()
Update dfrag->already_sent, msk->snd_nxt, msk->snd_burst
Update msk->first_pending
Push/release on final subflow
With the redundant scheduler, it's necessary to send each dfrag on
multiple subflows. If the top-level loop is "For each dfrag", then
redundant sends have to lock/unlock every subflow on every iteration of
the inner loop.
Because of that, I proposed changing the outer loop to be based on the
scheduler:
/* [2] Proposed send loops */
While the scheduler selects one or more subflows:
For each subflow:
Lock the subflow
For each pending dfrag:
Send the dfrag data with mptcp_sendmsg_frag()
Break if required by msk->snd_burst / etc
Push and release the subflow
Update dfrag metadata and msk->first_pending
>>
>> I'm sorry, I can't see a feasible way out here :(
>>
I'm still optimistic here :)
Whatever the outer loop is, I think we can still make basically the same
sequence of calls to the subflow locks, mptcp_sendmsg_frag(), and
tcp_push(). And fewer scheduler calls too! That would maintain the
blest-like behavior Paolo implemented.
It seems to me that this v1 iteration of the patches is missing one
important detail compared to the proposed pseudocode [2]: There's no outer
loop to call the scheduler again after msk->snd_burst is exhausted. If
this block of code is moved out of mptcp_subflow_get_send():
/* re-use last subflow, if the burst allow that */
if (msk->last_snd && msk->snd_burst > 0 &&
sk_stream_memory_free(msk->last_snd) &&
mptcp_subflow_active(mptcp_subflow_ctx(msk->last_snd))) {
mptcp_set_timeout(sk);
return msk->last_snd;
}
and those conditions are instead checked in the inner "For each pending
dfrag" loop of my proposed pseudocode above, I think the single subflow
case is feasible. Once that is working then redundant subflow support can
be added in later patches.
--
Mat Martineau
Intel
next prev parent reply other threads:[~2022-09-29 0:02 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-28 9:48 [PATCH mptcp-next 0/4] refactor push pending Geliang Tang
2022-09-28 9:48 ` [PATCH mptcp-next 1/4] mptcp: update __mptcp_push_pending Geliang Tang
2022-09-28 11:02 ` Paolo Abeni
2022-09-28 12:52 ` Geliang Tang
2022-09-29 0:02 ` Mat Martineau [this message]
2022-09-28 9:48 ` [PATCH mptcp-next 2/4] mptcp: add do_push_pending helper Geliang Tang
2022-09-28 9:48 ` [PATCH mptcp-next 3/4] mptcp: update __mptcp_subflow_push_pending Geliang Tang
2022-09-28 9:48 ` [PATCH mptcp-next 4/4] mptcp: simplify __mptcp_subflow_push_pending Geliang Tang
2022-09-28 11:56 ` 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=9c2baa9d-db31-3bd7-d1ec-bc3860d68a80@linux.intel.com \
--to=mathew.j.martineau@linux.intel.com \
--cc=geliang.tang@suse.com \
--cc=mptcp@lists.linux.dev \
--cc=pabeni@redhat.com \
/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