The core benches a subflow via the "stale" bit after
net.mptcp.stale_loss_cnt retransmission intervals without progress.
That bit is core-owned and RTO-coupled -- cleared as soon as a packet
is acked on the subflow. A scheduler has no way to bench a subflow for
its own reasons (high latency, instability) independently of ack
traffic.
"scheduled" doesn't help either: the core clears it after every
send/retrans pass, so it can't hold a standing "leave this alone"
decision, and nothing outside the scheduler that set it can see it.
Changes since v2:
v2 was generated against a stale local snapshot that predated several
unrelated upstream commits touching the same bitfield region in
mptcp_subflow_context; applying v2 against the real export tree
produced a merge conflict in protocol.h. This series is a straight
rebase onto the current export tree -- no functional change from v2.
Only two things differ as a result of the rebase itself:
- avoid now leaves __unused:8 instead of __unused:7, since the real
tree has 9 unused bits available at this point rather than 8.
- line offsets throughout protocol.c/protocol.h shifted to match
current export.
Changes since v1:
- avoid now lives in the existing __unused bitfield padding instead
of its own bool. No struct growth (Paolo).
- the selftest scheduler sets avoid once, on the first get_send()
call, and only reads it back afterward -- proving persistence
scheduled can't do, instead of just claiming it. A get_send_calls
counter, asserted >1, makes sure multiple rounds actually ran
(Paolo).
- mptcp_subflow_get_send() and mptcp_subflow_get_retrans() -- the
default subflow picker, active with or without a custom scheduler
-- now skip an avoided subflow next to the existing active-subflow
check. avoid is also exposed via MPTCP diag (Paolo).
- set_avoid() marked __bpf_kfunc: it has no C callers, unlike
set_scheduled(), and could be dropped under LTO before
resolve_btfids finds it in BTF (review bot).
- added the missing extern __ksym for mptcp_subflow_active() in the
selftest, matching mptcp_bpf_burst.c (review bot).
- moved the set_avoid extern out of mptcp_bpf.h into
mptcp_bpf_avoid.c: checkpatch flags new externs in shared headers,
and it has only the one caller.
Probing an avoided subflow to decide when to clear it (issue #348) is
left out on purpose -- that's scheduler policy, not core mechanism.
Patch 1 adds the flag, the kfunc, default-scheduler enforcement, and
diag support. Patch 2 reworks the selftest to prove persistence and
picks up the missing extern.
Ran the full suite through mptcp-upstream-virtme-docker (auto-normal
and auto-btf) -- selftests, packetdrill, and BPF tests pass, avoid
subtest included.
Link: https://github.com/multipath-tcp/mptcp_net-next/issues/349
Kalpan Jani (2):
mptcp: sched: add subflow avoid flag and enforce it in core
selftests: mptcp: bpf: exercise the subflow avoid flag across rounds
include/uapi/linux/mptcp.h | 1 +
net/mptcp/bpf.c | 1 +
net/mptcp/diag.c | 2 +
net/mptcp/protocol.c | 4 +-
net/mptcp/protocol.h | 5 +-
net/mptcp/sched.c | 6 ++
.../testing/selftests/bpf/prog_tests/mptcp.c | 16 +++++
.../selftests/bpf/progs/mptcp_bpf_avoid.c | 70 +++++++++++++++++++
8 files changed, 102 insertions(+), 3 deletions(-)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_avoid.c
base-commit: 21f4dd6665f74afe8fe39591e4abd5971828cf08
--
2.43.0