1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | |||
3 | v13: | ||
4 | - use '__ign' suffix to ignore the argument type checks of | ||
5 | bpf_mptcp_subflow_ctx() and bpf_sk_stream_memory_free(), | ||
6 | instead of adding a new helper bpf_mptcp_send_info_to_ssk(). | ||
7 | - use 'bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk)' instead | ||
8 | of using 'bpf_for_each(mptcp_subflow, subflow, msk)'. | ||
9 | - keep struct mptcp_sched_data for future use. | ||
10 | |||
11 | Depends on: | ||
12 | - Squash to "Add mptcp_subflow bpf_iter support", v2 | ||
13 | |||
14 | Based-on: <cover.1738470660.git.tanggeliang@kylinos.cn> | ||
15 | |||
16 | v12: | ||
17 | - drop struct mptcp_sched_data. | ||
18 | - rebased on "split get_subflow interface into two" v2. | ||
19 | |||
20 | v11: | ||
21 | If another squash-to patchset (Squash to "Add mptcp_subflow bpf_iter | ||
22 | support") under review is merged before this set, v10 will fail to run. | ||
23 | v11 fixes this issue and can run regardless of whether it is merged | ||
24 | before or after the squash-to patchset. | ||
25 | |||
26 | Compared with v10, only patches 3, 5, and 8 have been modified: | ||
27 | - use mptcp_subflow_tcp_sock instead of bpf_mptcp_subflow_tcp_sock in | ||
28 | patch 3 and patch 5. | ||
29 | - drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead | ||
30 | in patch 8. | ||
31 | |||
32 | v10: | ||
33 | - drop mptcp_subflow_set_scheduled() helper and WRITE_ONCE() in BPF. | ||
34 | - add new bpf helper bpf_mptcp_send_info_to_ssk() for burst scheduler. | ||
35 | |||
36 | v9: | ||
37 | - merge 'Fixes for "use bpf_iter in bpf schedulers" v8' into this set. | ||
38 | - rebased on "add netns helpers" v4 | ||
39 | |||
40 | v8: | ||
41 | - address Mat's comments in v7. | ||
42 | - move sk_stream_memory_free check inside bpf_for_each() loop. | ||
43 | - implement mptcp_subflow_set_scheduled helper in BPF. | ||
44 | - add cleanup patches into this set again. | ||
2 | 45 | ||
3 | v7: | 46 | v7: |
4 | - move cleanup patches out of this set. | 47 | - move cleanup patches out of this set. |
5 | - rebased. | 48 | - rebased. |
6 | 49 | ||
... | ... | ||
27 | With the newly added mptcp_subflow bpf_iter, we can get rid of the | 70 | With the newly added mptcp_subflow bpf_iter, we can get rid of the |
28 | subflows array "contexts" in struct mptcp_sched_data. This set | 71 | subflows array "contexts" in struct mptcp_sched_data. This set |
29 | uses bpf_for_each(mptcp_subflow) helper to update all the bpf | 72 | uses bpf_for_each(mptcp_subflow) helper to update all the bpf |
30 | schedules: | 73 | schedules: |
31 | 74 | ||
32 | bpf_for_each(mptcp_subflow, subflow, msk) { | 75 | bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
33 | ... ... | 76 | ... ... |
34 | mptcp_subflow_set_scheduled(subflow, true); | 77 | mptcp_subflow_set_scheduled(subflow, true); |
35 | } | 78 | } |
36 | 79 | ||
37 | Geliang Tang (5): | 80 | Geliang Tang (9): |
81 | Squash to "bpf: Register mptcp common kfunc set" | ||
82 | Revert "mptcp: add sched_data helpers" | ||
83 | Squash to "bpf: Export mptcp packet scheduler helpers" | ||
84 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | ||
38 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" | 85 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" |
39 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" | 86 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" |
40 | Squash to "selftests/bpf: Add bpf_red scheduler & test" | 87 | Squash to "selftests/bpf: Add bpf_red scheduler & test" |
41 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 88 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
42 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | 89 | mptcp: drop subflow contexts in mptcp_sched_data |
43 | 90 | ||
91 | include/net/mptcp.h | 3 - | ||
92 | net/mptcp/bpf.c | 52 +++++++------ | ||
93 | net/mptcp/protocol.h | 2 - | ||
94 | net/mptcp/sched.c | 22 ------ | ||
44 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - | 95 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - |
45 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 18 +---- | 96 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +--- |
46 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 79 ++++++++++--------- | 97 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
47 | .../selftests/bpf/progs/mptcp_bpf_first.c | 10 ++- | 98 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +- |
48 | .../selftests/bpf/progs/mptcp_bpf_red.c | 10 +-- | 99 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 +- |
49 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 26 +++--- | 100 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 ++++---- |
50 | 6 files changed, 67 insertions(+), 79 deletions(-) | 101 | 10 files changed, 80 insertions(+), 143 deletions(-) |
51 | 102 | ||
52 | -- | 103 | -- |
53 | 2.45.2 | 104 | 2.43.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
1 | 2 | ||
3 | Instead of adding a new BPF function bpf_mptcp_send_info_to_ssk() in | ||
4 | v12, this patch uses a much more simpler approach, which using '__ign' | ||
5 | suffix for the argument of bpf_mptcp_subflow_ctx() to let BPF to | ||
6 | ignore the type check of this argument. | ||
7 | |||
8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
9 | --- | ||
10 | net/mptcp/bpf.c | 8 ++++---- | ||
11 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
12 | |||
13 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/net/mptcp/bpf.c | ||
16 | +++ b/net/mptcp/bpf.c | ||
17 | @@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern { | ||
18 | __bpf_kfunc_start_defs(); | ||
19 | |||
20 | __bpf_kfunc static struct mptcp_subflow_context * | ||
21 | -bpf_mptcp_subflow_ctx(const struct sock *sk) | ||
22 | +bpf_mptcp_subflow_ctx(const struct sock *sk__ign) | ||
23 | { | ||
24 | - if (sk && sk_fullsock(sk) && | ||
25 | - sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) | ||
26 | - return mptcp_subflow_ctx(sk); | ||
27 | + if (sk__ign && sk_fullsock(sk__ign) && | ||
28 | + sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign)) | ||
29 | + return mptcp_subflow_ctx(sk__ign); | ||
30 | |||
31 | return NULL; | ||
32 | } | ||
33 | -- | ||
34 | 2.43.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
1 | 2 | ||
3 | Drop this patch. bpf_mptcp_subflow_ctx_by_pos and | ||
4 | mptcp_sched_data_set_contexts are uesless now. | ||
5 | |||
6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
7 | --- | ||
8 | net/mptcp/bpf.c | 8 -------- | ||
9 | net/mptcp/protocol.h | 2 -- | ||
10 | net/mptcp/sched.c | 22 ---------------------- | ||
11 | 3 files changed, 32 deletions(-) | ||
12 | |||
13 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/net/mptcp/bpf.c | ||
16 | +++ b/net/mptcp/bpf.c | ||
17 | @@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it) | ||
18 | { | ||
19 | } | ||
20 | |||
21 | -__bpf_kfunc struct mptcp_subflow_context * | ||
22 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) | ||
23 | -{ | ||
24 | - if (pos >= MPTCP_SUBFLOWS_MAX) | ||
25 | - return NULL; | ||
26 | - return data->contexts[pos]; | ||
27 | -} | ||
28 | - | ||
29 | __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | ||
30 | { | ||
31 | return tcp_rtx_queue_empty(sk); | ||
32 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | ||
33 | index XXXXXXX..XXXXXXX 100644 | ||
34 | --- a/net/mptcp/protocol.h | ||
35 | +++ b/net/mptcp/protocol.h | ||
36 | @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk); | ||
37 | void mptcp_sock_graft(struct sock *sk, struct socket *parent); | ||
38 | u64 mptcp_wnd_end(const struct mptcp_sock *msk); | ||
39 | void mptcp_set_timeout(struct sock *sk); | ||
40 | -struct mptcp_subflow_context * | ||
41 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos); | ||
42 | struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); | ||
43 | bool __mptcp_close(struct sock *sk, long timeout); | ||
44 | void mptcp_cancel_work(struct sock *sk); | ||
45 | diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c | ||
46 | index XXXXXXX..XXXXXXX 100644 | ||
47 | --- a/net/mptcp/sched.c | ||
48 | +++ b/net/mptcp/sched.c | ||
49 | @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, | ||
50 | WRITE_ONCE(subflow->scheduled, scheduled); | ||
51 | } | ||
52 | |||
53 | -static void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk, | ||
54 | - struct mptcp_sched_data *data) | ||
55 | -{ | ||
56 | - struct mptcp_subflow_context *subflow; | ||
57 | - int i = 0; | ||
58 | - | ||
59 | - mptcp_for_each_subflow(msk, subflow) { | ||
60 | - if (i == MPTCP_SUBFLOWS_MAX) { | ||
61 | - pr_warn_once("too many subflows"); | ||
62 | - break; | ||
63 | - } | ||
64 | - mptcp_subflow_set_scheduled(subflow, false); | ||
65 | - data->contexts[i++] = subflow; | ||
66 | - } | ||
67 | - data->subflows = i; | ||
68 | - | ||
69 | - for (; i < MPTCP_SUBFLOWS_MAX; i++) | ||
70 | - data->contexts[i] = NULL; | ||
71 | -} | ||
72 | - | ||
73 | int mptcp_sched_get_send(struct mptcp_sock *msk) | ||
74 | { | ||
75 | struct mptcp_subflow_context *subflow; | ||
76 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_send(struct mptcp_sock *msk) | ||
77 | |||
78 | if (msk->sched == &mptcp_sched_default || !msk->sched) | ||
79 | return mptcp_sched_default_get_send(msk, &data); | ||
80 | - mptcp_sched_data_set_contexts(msk, &data); | ||
81 | return msk->sched->get_send(msk, &data); | ||
82 | } | ||
83 | |||
84 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk) | ||
85 | if (msk->sched == &mptcp_sched_default || !msk->sched) | ||
86 | return mptcp_sched_default_get_retrans(msk, &data); | ||
87 | |||
88 | - mptcp_sched_data_set_contexts(msk, &data); | ||
89 | if (msk->sched->get_retrans) | ||
90 | return msk->sched->get_retrans(msk, &data); | ||
91 | return msk->sched->get_send(msk, &data); | ||
92 | -- | ||
93 | 2.43.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
1 | 2 | ||
3 | Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set. | ||
4 | Drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead. | ||
5 | Add new helpers bpf_mptcp_subflow_tcp_sock() and | ||
6 | bpf_sk_stream_memory_free(). | ||
7 | |||
8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
9 | --- | ||
10 | net/mptcp/bpf.c | 38 ++++++++++++++++++++++++-------------- | ||
11 | 1 file changed, 24 insertions(+), 14 deletions(-) | ||
12 | |||
13 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/net/mptcp/bpf.c | ||
16 | +++ b/net/mptcp/bpf.c | ||
17 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign) | ||
18 | return NULL; | ||
19 | } | ||
20 | |||
21 | +__bpf_kfunc static struct sock * | ||
22 | +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | ||
23 | +{ | ||
24 | + if (!subflow) | ||
25 | + return NULL; | ||
26 | + | ||
27 | + return mptcp_subflow_tcp_sock(subflow); | ||
28 | +} | ||
29 | + | ||
30 | __bpf_kfunc static int | ||
31 | bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it, | ||
32 | struct sock *sk) | ||
33 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | ||
34 | return tcp_rtx_queue_empty(sk); | ||
35 | } | ||
36 | |||
37 | +__bpf_kfunc static bool bpf_sk_stream_memory_free(const struct sock *sk__ign) | ||
38 | +{ | ||
39 | + if (sk__ign && sk_fullsock(sk__ign) && | ||
40 | + sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign)) | ||
41 | + return sk_stream_memory_free(sk__ign); | ||
42 | + | ||
43 | + return NULL; | ||
44 | +} | ||
45 | + | ||
46 | __bpf_kfunc_end_defs(); | ||
47 | |||
48 | BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) | ||
49 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL) | ||
50 | +BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock, KF_RET_NULL) | ||
51 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS) | ||
52 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) | ||
53 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) | ||
54 | -BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | ||
55 | - | ||
56 | -static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | ||
57 | - .owner = THIS_MODULE, | ||
58 | - .set = &bpf_mptcp_common_kfunc_ids, | ||
59 | -}; | ||
60 | - | ||
61 | -BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) | ||
62 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) | ||
63 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) | ||
64 | BTF_ID_FLAGS(func, mptcp_subflow_active) | ||
65 | BTF_ID_FLAGS(func, mptcp_set_timeout) | ||
66 | BTF_ID_FLAGS(func, mptcp_wnd_end) | ||
67 | -BTF_ID_FLAGS(func, tcp_stream_memory_free) | ||
68 | +BTF_ID_FLAGS(func, bpf_sk_stream_memory_free, KF_RET_NULL) | ||
69 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) | ||
70 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) | ||
71 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | ||
72 | +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | ||
73 | |||
74 | -static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { | ||
75 | +static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | ||
76 | .owner = THIS_MODULE, | ||
77 | - .set = &bpf_mptcp_sched_kfunc_ids, | ||
78 | + .set = &bpf_mptcp_common_kfunc_ids, | ||
79 | }; | ||
80 | |||
81 | static int __init bpf_mptcp_kfunc_init(void) | ||
82 | @@ -XXX,XX +XXX,XX @@ static int __init bpf_mptcp_kfunc_init(void) | ||
83 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT, | ||
84 | &bpf_mptcp_common_kfunc_set); | ||
85 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, | ||
86 | - &bpf_mptcp_sched_kfunc_set); | ||
87 | + &bpf_mptcp_common_kfunc_set); | ||
88 | #ifdef CONFIG_BPF_JIT | ||
89 | ret = ret ?: register_bpf_struct_ops(&bpf_mptcp_sched_ops, mptcp_sched_ops); | ||
90 | #endif | ||
91 | -- | ||
92 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | Drop bpf_mptcp_subflow_ctx_by_pos declaration. | ||
4 | 5 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 7 | --- |
7 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --- | 8 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --- |
8 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 10 ++++++++-- | 9 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++- |
9 | 2 files changed, 8 insertions(+), 5 deletions(-) | 10 | 2 files changed, 7 insertions(+), 4 deletions(-) |
10 | 11 | ||
11 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 12 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
12 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 14 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
14 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 15 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
15 | @@ -XXX,XX +XXX,XX @@ extern bool bpf_ipv6_addr_v4mapped(const struct mptcp_addr_info *a) __ksym; | 16 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym; |
16 | extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, | 17 | extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, |
17 | bool scheduled) __ksym; | 18 | bool scheduled) __ksym; |
18 | 19 | ||
19 | -extern struct mptcp_subflow_context * | 20 | -extern struct mptcp_subflow_context * |
20 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym; | 21 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym; |
... | ... | ||
23 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 24 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
24 | index XXXXXXX..XXXXXXX 100644 | 25 | index XXXXXXX..XXXXXXX 100644 |
25 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 26 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
26 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 27 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
27 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") | 28 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
28 | int BPF_PROG(bpf_first_get_subflow, struct mptcp_sock *msk, | 29 | int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk, |
29 | struct mptcp_sched_data *data) | 30 | struct mptcp_sched_data *data) |
30 | { | 31 | { |
31 | - mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true); | 32 | - mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true); |
32 | + struct mptcp_subflow_context *subflow; | 33 | + struct mptcp_subflow_context *subflow; |
33 | + | 34 | + |
34 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 35 | + subflow = bpf_mptcp_subflow_ctx(msk->first); |
35 | + mptcp_subflow_set_scheduled(subflow, true); | 36 | + if (!subflow) |
36 | + break; | 37 | + return -1; |
37 | + } | ||
38 | + | 38 | + |
39 | + mptcp_subflow_set_scheduled(subflow, true); | ||
39 | return 0; | 40 | return 0; |
40 | } | 41 | } |
41 | 42 | ||
42 | -SEC(".struct_ops") | ||
43 | +SEC(".struct_ops.link") | ||
44 | struct mptcp_sched_ops first = { | ||
45 | .init = (void *)mptcp_sched_first_init, | ||
46 | .release = (void *)mptcp_sched_first_release, | ||
47 | -- | 43 | -- |
48 | 2.45.2 | 44 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | 4 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 6 | --- |
7 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 18 ++++-------------- | 7 | .../testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +++------------- |
8 | 1 file changed, 4 insertions(+), 14 deletions(-) | 8 | 1 file changed, 3 insertions(+), 13 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c |
14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | int BPF_PROG(bpf_bkup_get_subflow, struct mptcp_sock *msk, | 15 | int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk, |
16 | struct mptcp_sched_data *data) | 16 | struct mptcp_sched_data *data) |
17 | { | 17 | { |
18 | - int nr = -1; | 18 | - int nr = -1; |
19 | - | 19 | - |
20 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 20 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
... | ... | ||
23 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 23 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
24 | - if (!subflow) | 24 | - if (!subflow) |
25 | - break; | 25 | - break; |
26 | + struct mptcp_subflow_context *subflow; | 26 | + struct mptcp_subflow_context *subflow; |
27 | 27 | ||
28 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 28 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
29 | if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) || | 29 | if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) || |
30 | !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) { | 30 | !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) { |
31 | - nr = i; | 31 | - nr = i; |
32 | + mptcp_subflow_set_scheduled(subflow, true); | 32 | + mptcp_subflow_set_scheduled(subflow, true); |
33 | break; | 33 | break; |
... | ... | ||
39 | - return -1; | 39 | - return -1; |
40 | - } | 40 | - } |
41 | return 0; | 41 | return 0; |
42 | } | 42 | } |
43 | 43 | ||
44 | -SEC(".struct_ops") | ||
45 | +SEC(".struct_ops.link") | ||
46 | struct mptcp_sched_ops bkup = { | ||
47 | .init = (void *)mptcp_sched_bkup_init, | ||
48 | .release = (void *)mptcp_sched_bkup_release, | ||
49 | -- | 44 | -- |
50 | 2.45.2 | 45 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | 4 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 6 | --- |
7 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 26 ++++++++----------- | 7 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++++++---------- |
8 | 1 file changed, 11 insertions(+), 15 deletions(-) | 8 | 1 file changed, 14 insertions(+), 17 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c |
14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, | 15 | int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk, |
16 | struct mptcp_sched_data *data) | 16 | struct mptcp_sched_data *data) |
17 | { | 17 | { |
18 | - struct mptcp_subflow_context *subflow; | 18 | - struct mptcp_subflow_context *subflow; |
19 | + struct mptcp_subflow_context *subflow, *next; | 19 | + struct mptcp_subflow_context *subflow, *next; |
20 | struct mptcp_rr_storage *ptr; | 20 | struct mptcp_rr_storage *ptr; |
21 | struct sock *last_snd = NULL; | 21 | - struct sock *last_snd = NULL; |
22 | - int nr = 0; | 22 | - int nr = 0; |
23 | 23 | ||
24 | ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0, | 24 | ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0, |
25 | BPF_LOCAL_STORAGE_GET_F_CREATE); | 25 | BPF_LOCAL_STORAGE_GET_F_CREATE); |
26 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, | 26 | if (!ptr) |
27 | return -1; | 27 | return -1; |
28 | 28 | ||
29 | last_snd = ptr->last_snd; | 29 | - last_snd = ptr->last_snd; |
30 | + next = bpf_mptcp_subflow_ctx(msk->first); | 30 | + next = bpf_mptcp_subflow_ctx(msk->first); |
31 | + if (!next) | ||
32 | + return -1; | ||
31 | 33 | ||
32 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 34 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
33 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 35 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
34 | - if (!last_snd || !subflow) | 36 | - if (!last_snd || !subflow) |
35 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 37 | - break; |
36 | + if (!last_snd) | 38 | + if (!ptr->last_snd) |
37 | break; | 39 | + goto out; |
38 | 40 | ||
39 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { | 41 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { |
40 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || | 42 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || |
41 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) | 43 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) |
42 | + if (bpf_mptcp_subflow_tcp_sock(subflow) == last_snd) { | 44 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
45 | + if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) { | ||
43 | + subflow = bpf_iter_mptcp_subflow_next(&___it); | 46 | + subflow = bpf_iter_mptcp_subflow_next(&___it); |
44 | + if (!subflow) | 47 | + if (!subflow) |
45 | break; | 48 | break; |
46 | 49 | ||
47 | - nr = i + 1; | 50 | - nr = i + 1; |
... | ... | ||
53 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr); | 56 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr); |
54 | - if (!subflow) | 57 | - if (!subflow) |
55 | - return -1; | 58 | - return -1; |
56 | - mptcp_subflow_set_scheduled(subflow, true); | 59 | - mptcp_subflow_set_scheduled(subflow, true); |
57 | - ptr->last_snd = mptcp_subflow_tcp_sock(subflow); | 60 | - ptr->last_snd = mptcp_subflow_tcp_sock(subflow); |
61 | +out: | ||
58 | + mptcp_subflow_set_scheduled(next, true); | 62 | + mptcp_subflow_set_scheduled(next, true); |
59 | + ptr->last_snd = bpf_mptcp_subflow_tcp_sock(next); | 63 | + ptr->last_snd = mptcp_subflow_tcp_sock(next); |
60 | return 0; | 64 | return 0; |
61 | } | 65 | } |
62 | 66 | ||
63 | -SEC(".struct_ops") | ||
64 | +SEC(".struct_ops.link") | ||
65 | struct mptcp_sched_ops rr = { | ||
66 | .init = (void *)mptcp_sched_rr_init, | ||
67 | .release = (void *)mptcp_sched_rr_release, | ||
68 | -- | 67 | -- |
69 | 2.45.2 | 68 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | 4 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 6 | --- |
7 | tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 10 ++++------ | 7 | tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 8 +++----- |
8 | 1 file changed, 4 insertions(+), 6 deletions(-) | 8 | 1 file changed, 3 insertions(+), 5 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c |
14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | int BPF_PROG(bpf_red_get_subflow, struct mptcp_sock *msk, | 15 | int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk, |
16 | struct mptcp_sched_data *data) | 16 | struct mptcp_sched_data *data) |
17 | { | 17 | { |
18 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 18 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
19 | - if (!bpf_mptcp_subflow_ctx_by_pos(data, i)) | 19 | - if (!bpf_mptcp_subflow_ctx_by_pos(data, i)) |
20 | - break; | 20 | - break; |
21 | + struct mptcp_subflow_context *subflow; | 21 | + struct mptcp_subflow_context *subflow; |
22 | 22 | ||
23 | - mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, i), true); | 23 | - mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, i), true); |
24 | - } | 24 | - } |
25 | + bpf_for_each(mptcp_subflow, subflow, msk) | 25 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) |
26 | + mptcp_subflow_set_scheduled(subflow, true); | 26 | + mptcp_subflow_set_scheduled(subflow, true); |
27 | 27 | ||
28 | return 0; | 28 | return 0; |
29 | } | 29 | } |
30 | |||
31 | -SEC(".struct_ops") | ||
32 | +SEC(".struct_ops.link") | ||
33 | struct mptcp_sched_ops red = { | ||
34 | .init = (void *)mptcp_sched_red_init, | ||
35 | .release = (void *)mptcp_sched_red_release, | ||
36 | -- | 30 | -- |
37 | 2.45.2 | 31 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | Drop bpf_subflow_send_info, use subflow_send_info instead. | ||
4 | 5 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 7 | --- |
7 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 79 ++++++++++--------- | 8 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
8 | 1 file changed, 40 insertions(+), 39 deletions(-) | 9 | 1 file changed, 26 insertions(+), 52 deletions(-) |
9 | 10 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 11 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
11 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 13 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 14 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
14 | @@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL"; | 15 | @@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL"; |
15 | 16 | ||
16 | #define min(a, b) ((a) < (b) ? (a) : (b)) | 17 | #define min(a, b) ((a) < (b) ? (a) : (b)) |
17 | 18 | ||
18 | +#define SSK_MODE_ACTIVE 0 | 19 | -struct bpf_subflow_send_info { |
19 | +#define SSK_MODE_BACKUP 1 | 20 | - __u8 subflow_id; |
20 | +#define SSK_MODE_MAX 2 | 21 | - __u64 linger_time; |
21 | + | 22 | -}; |
22 | struct bpf_subflow_send_info { | 23 | - |
23 | __u8 subflow_id; | 24 | extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym; |
24 | __u64 linger_time; | 25 | extern void mptcp_set_timeout(struct sock *sk) __ksym; |
25 | @@ -XXX,XX +XXX,XX @@ extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym; | 26 | extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym; |
27 | -extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym; | ||
28 | +extern bool bpf_sk_stream_memory_free(const struct sock *sk) __ksym; | ||
26 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; | 29 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; |
27 | extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym; | 30 | extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym; |
28 | 31 | ||
29 | -#define SSK_MODE_ACTIVE 0 | 32 | @@ -XXX,XX +XXX,XX @@ static __always_inline bool tcp_rtx_and_write_queues_empty(struct sock *sk) |
30 | -#define SSK_MODE_BACKUP 1 | 33 | return bpf_mptcp_subflow_queues_empty(sk) && tcp_write_queue_empty(sk); |
31 | -#define SSK_MODE_MAX 2 | 34 | } |
35 | |||
36 | -static __always_inline bool __sk_stream_memory_free(const struct sock *sk, int wake) | ||
37 | -{ | ||
38 | - if (sk->sk_wmem_queued >= sk->sk_sndbuf) | ||
39 | - return false; | ||
32 | - | 40 | - |
33 | static __always_inline __u64 div_u64(__u64 dividend, __u32 divisor) | 41 | - return tcp_stream_memory_free(sk, wake); |
34 | { | 42 | -} |
35 | return dividend / divisor; | 43 | - |
36 | @@ -XXX,XX +XXX,XX @@ static __always_inline bool sk_stream_memory_free(const struct sock *sk) | 44 | -static __always_inline bool sk_stream_memory_free(const struct sock *sk) |
37 | return __sk_stream_memory_free(sk, 0); | 45 | -{ |
38 | } | 46 | - return __sk_stream_memory_free(sk, 0); |
39 | 47 | -} | |
40 | +static struct mptcp_subflow_context * | 48 | - |
41 | +mptcp_lookup_subflow_by_id(struct mptcp_sock *msk, unsigned int id) | ||
42 | +{ | ||
43 | + struct mptcp_subflow_context *subflow; | ||
44 | + | ||
45 | + bpf_for_each(mptcp_subflow, subflow, msk) { | ||
46 | + if (subflow->subflow_id == id) | ||
47 | + return subflow; | ||
48 | + } | ||
49 | + | ||
50 | + return NULL; | ||
51 | +} | ||
52 | + | ||
53 | SEC("struct_ops") | 49 | SEC("struct_ops") |
54 | void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk) | 50 | void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk) |
55 | { | 51 | { |
56 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk) | 52 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
53 | int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | ||
54 | struct mptcp_sched_data *data) | ||
57 | { | 55 | { |
58 | } | 56 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; |
59 | 57 | + struct subflow_send_info send_info[SSK_MODE_MAX]; | |
60 | -static int bpf_burst_get_send(struct mptcp_sock *msk, | ||
61 | - struct mptcp_sched_data *data) | ||
62 | +static int bpf_burst_get_send(struct mptcp_sock *msk) | ||
63 | { | ||
64 | struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; | ||
65 | struct mptcp_subflow_context *subflow; | 58 | struct mptcp_subflow_context *subflow; |
66 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 59 | struct sock *sk = (struct sock *)msk; |
60 | __u32 pace, burst, wmem; | ||
61 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | ||
62 | |||
63 | /* pick the subflow with the lower wmem/wspace ratio */ | ||
64 | for (i = 0; i < SSK_MODE_MAX; ++i) { | ||
65 | - send_info[i].subflow_id = MPTCP_SUBFLOWS_MAX; | ||
66 | + send_info[i].ssk = NULL; | ||
67 | send_info[i].linger_time = -1; | 67 | send_info[i].linger_time = -1; |
68 | } | 68 | } |
69 | 69 | ||
70 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 70 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
71 | - bool backup; | 71 | - bool backup; |
72 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 72 | - |
73 | + bool backup = subflow->backup || subflow->request_bkup; | ||
74 | |||
75 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 73 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
76 | - if (!subflow) | 74 | - if (!subflow) |
77 | - break; | 75 | - break; |
78 | - | 76 | - |
79 | - backup = subflow->backup || subflow->request_bkup; | 77 | - backup = subflow->backup || subflow->request_bkup; |
80 | - | 78 | + bpf_for_each(mptcp_subflow, subflow, sk) { |
81 | - ssk = mptcp_subflow_tcp_sock(subflow); | 79 | + bool backup = subflow->backup || subflow->request_bkup; |
82 | + ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 80 | |
81 | ssk = mptcp_subflow_tcp_sock(subflow); | ||
83 | if (!mptcp_subflow_active(subflow)) | 82 | if (!mptcp_subflow_active(subflow)) |
84 | continue; | 83 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, |
85 | |||
86 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | ||
87 | 84 | ||
88 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); | 85 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); |
89 | if (linger_time < send_info[backup].linger_time) { | 86 | if (linger_time < send_info[backup].linger_time) { |
90 | - send_info[backup].subflow_id = i; | 87 | - send_info[backup].subflow_id = i; |
91 | + send_info[backup].subflow_id = subflow->subflow_id; | 88 | + send_info[backup].ssk = ssk; |
92 | send_info[backup].linger_time = linger_time; | 89 | send_info[backup].linger_time = linger_time; |
93 | } | 90 | } |
94 | } | 91 | } |
95 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 92 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, |
93 | |||
94 | /* pick the best backup if no other subflow is active */ | ||
96 | if (!nr_active) | 95 | if (!nr_active) |
97 | send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id; | 96 | - send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id; |
97 | + send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk; | ||
98 | 98 | ||
99 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id); | 99 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id); |
100 | + subflow = mptcp_lookup_subflow_by_id(msk, send_info[SSK_MODE_ACTIVE].subflow_id); | 100 | - if (!subflow) |
101 | if (!subflow) | 101 | + ssk = send_info[SSK_MODE_ACTIVE].ssk; |
102 | + if (!ssk || !bpf_sk_stream_memory_free(ssk)) | ||
102 | return -1; | 103 | return -1; |
103 | - ssk = mptcp_subflow_tcp_sock(subflow); | 104 | - ssk = mptcp_subflow_tcp_sock(subflow); |
104 | + ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 105 | - if (!ssk || !sk_stream_memory_free(ssk)) |
105 | if (!ssk || !sk_stream_memory_free(ssk)) | 106 | + |
107 | + subflow = bpf_mptcp_subflow_ctx(ssk); | ||
108 | + if (!subflow) | ||
106 | return -1; | 109 | return -1; |
107 | 110 | ||
108 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 111 | burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); |
109 | return 0; | 112 | + ssk = bpf_core_cast(ssk, struct sock); |
110 | } | 113 | wmem = ssk->sk_wmem_queued; |
111 | 114 | if (!burst) | |
112 | -static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 115 | goto out; |
113 | - struct mptcp_sched_data *data) | 116 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
114 | +static int bpf_burst_get_retrans(struct mptcp_sock *msk) | 117 | int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, |
118 | struct mptcp_sched_data *data) | ||
115 | { | 119 | { |
116 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; | 120 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; |
117 | + struct sock *backup = NULL, *pick = NULL; | 121 | + struct sock *backup = NULL, *pick = NULL; |
118 | struct mptcp_subflow_context *subflow; | 122 | struct mptcp_subflow_context *subflow; |
119 | int min_stale_count = INT_MAX; | 123 | int min_stale_count = INT_MAX; |
120 | - struct sock *ssk; | 124 | - struct sock *ssk; |
121 | 125 | ||
122 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 126 | - for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
123 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 127 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
124 | - if (!subflow) | 128 | - if (!subflow) |
125 | - break; | 129 | - break; |
126 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 130 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
127 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 131 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); |
128 | 132 | ||
129 | if (!mptcp_subflow_active(subflow)) | 133 | - if (!mptcp_subflow_active(subflow)) |
134 | + if (!ssk || !mptcp_subflow_active(subflow)) | ||
130 | continue; | 135 | continue; |
131 | 136 | ||
132 | - ssk = mptcp_subflow_tcp_sock(subflow); | 137 | - ssk = mptcp_subflow_tcp_sock(subflow); |
133 | /* still data outstanding at TCP level? skip this */ | 138 | /* still data outstanding at TCP level? skip this */ |
134 | if (!tcp_rtx_and_write_queues_empty(ssk)) { | 139 | if (!tcp_rtx_and_write_queues_empty(ssk)) { |
135 | mptcp_pm_subflow_chk_stale(msk, ssk); | 140 | mptcp_pm_subflow_chk_stale(msk, ssk); |
136 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 141 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, |
137 | } | 142 | } |
138 | 143 | ||
139 | if (subflow->backup || subflow->request_bkup) { | 144 | if (subflow->backup || subflow->request_bkup) { |
140 | - if (backup == MPTCP_SUBFLOWS_MAX) | 145 | - if (backup == MPTCP_SUBFLOWS_MAX) |
141 | - backup = i; | 146 | - backup = i; |
... | ... | ||
164 | + return -1; | 169 | + return -1; |
165 | + subflow = bpf_mptcp_subflow_ctx(pick); | 170 | + subflow = bpf_mptcp_subflow_ctx(pick); |
166 | if (!subflow) | 171 | if (!subflow) |
167 | return -1; | 172 | return -1; |
168 | mptcp_subflow_set_scheduled(subflow, true); | 173 | mptcp_subflow_set_scheduled(subflow, true); |
169 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_subflow, struct mptcp_sock *msk, | ||
170 | struct mptcp_sched_data *data) | ||
171 | { | ||
172 | if (data->reinject) | ||
173 | - return bpf_burst_get_retrans(msk, data); | ||
174 | - return bpf_burst_get_send(msk, data); | ||
175 | + return bpf_burst_get_retrans(msk); | ||
176 | + return bpf_burst_get_send(msk); | ||
177 | } | ||
178 | |||
179 | -SEC(".struct_ops") | ||
180 | +SEC(".struct_ops.link") | ||
181 | struct mptcp_sched_ops burst = { | ||
182 | .init = (void *)mptcp_sched_burst_init, | ||
183 | .release = (void *)mptcp_sched_burst_release, | ||
184 | -- | 174 | -- |
185 | 2.45.2 | 175 | 2.43.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
1 | 2 | ||
3 | The mptcp_subflow bpf_iter is added now, it's better to use the helper | ||
4 | bpf_for_each(mptcp_subflow) to traverse all subflows on the conn_list of | ||
5 | an MPTCP socket and then call kfunc to modify the fields of each subflow | ||
6 | in the WIP MPTCP BPF packet scheduler examples, instead of converting them | ||
7 | to a fixed array. With this helper, we can get rid of this subflow array | ||
8 | "contexts" in struct mptcp_sched_data. | ||
9 | |||
10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
11 | --- | ||
12 | include/net/mptcp.h | 3 --- | ||
13 | 1 file changed, 3 deletions(-) | ||
14 | |||
15 | diff --git a/include/net/mptcp.h b/include/net/mptcp.h | ||
16 | index XXXXXXX..XXXXXXX 100644 | ||
17 | --- a/include/net/mptcp.h | ||
18 | +++ b/include/net/mptcp.h | ||
19 | @@ -XXX,XX +XXX,XX @@ struct mptcp_out_options { | ||
20 | #define MPTCP_SCHED_MAX 128 | ||
21 | #define MPTCP_SCHED_BUF_MAX (MPTCP_SCHED_NAME_MAX * MPTCP_SCHED_MAX) | ||
22 | |||
23 | -#define MPTCP_SUBFLOWS_MAX 8 | ||
24 | - | ||
25 | struct mptcp_sched_data { | ||
26 | u8 subflows; | ||
27 | - struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX]; | ||
28 | }; | ||
29 | |||
30 | struct mptcp_sched_ops { | ||
31 | -- | ||
32 | 2.43.0 | diff view generated by jsdifflib |