1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 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. | ||
45 | |||
46 | v7: | ||
47 | - move cleanup patches out of this set. | ||
48 | - rebased. | ||
49 | |||
50 | v6: | ||
51 | - rebased to "add mptcp_subflow bpf_iter" v10 | ||
52 | |||
53 | v5: | ||
54 | - patch 2, drop mptcp_sock_type and mptcp_subflow_type. | ||
55 | - patch 3, revert "bpf: Export more bpf_burst related functions" | ||
56 | - patch 4, merge "bpf: Export more bpf_burst related functions" into it. | ||
57 | |||
58 | v4: | ||
59 | - patch 2, a new cleanup for "bpf: Add bpf_mptcp_sched_ops". | ||
60 | - patch 3 should be reverted. | ||
61 | - patch 8, register kfunc_set. | ||
62 | |||
63 | v3: | ||
64 | - rebased. | ||
65 | - put the "drop has_bytes_sent" squash-to patch into this set. | ||
66 | |||
67 | v2: | ||
68 | - update bpf_rr and bpf_burst | ||
69 | |||
3 | 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 |
4 | subflows array "contexts" in struct mptcp_sched_data. This set | 71 | subflows array "contexts" in struct mptcp_sched_data. This set |
5 | 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 |
6 | schedules: | 73 | schedules: |
7 | 74 | ||
8 | bpf_for_each(mptcp_subflow, subflow, msk) { | 75 | bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
9 | ... ... | 76 | ... ... |
10 | mptcp_subflow_set_scheduled(subflow, true); | 77 | mptcp_subflow_set_scheduled(subflow, true); |
11 | } | 78 | } |
12 | 79 | ||
13 | Depends on: | 80 | Geliang Tang (9): |
14 | - "add mptcp_subflow bpf_iter" v6 | 81 | Squash to "bpf: Register mptcp common kfunc set" |
15 | 82 | Revert "mptcp: add sched_data helpers" | |
16 | @Matt, I forgot which keyword should I use here to trigger the | 83 | Squash to "bpf: Export mptcp packet scheduler helpers" |
17 | CI test with dependencies, please tell me again, thanks a lot. | ||
18 | |||
19 | Geliang Tang (8): | ||
20 | Squash to "mptcp: add sched_data helpers" | ||
21 | Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" | ||
22 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | 84 | Squash to "selftests/bpf: Add bpf_first scheduler & test" |
23 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" | 85 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" |
24 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" | 86 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" |
25 | Squash to "selftests/bpf: Add bpf_red scheduler & test" | 87 | Squash to "selftests/bpf: Add bpf_red scheduler & test" |
26 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 88 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
27 | mptcp: drop subflow contexts in mptcp_sched_data | 89 | mptcp: drop subflow contexts in mptcp_sched_data |
28 | 90 | ||
29 | include/net/mptcp.h | 2 - | 91 | include/net/mptcp.h | 3 - |
30 | net/mptcp/bpf.c | 25 +++++++----- | 92 | net/mptcp/bpf.c | 52 +++++++------ |
31 | net/mptcp/sched.c | 22 ----------- | 93 | net/mptcp/protocol.h | 2 - |
32 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 2 +- | 94 | net/mptcp/sched.c | 22 ------ |
33 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 ++------ | 95 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - |
34 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 39 +++++++------------ | 96 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +--- |
35 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +++- | 97 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
36 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 ++-- | 98 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +- |
37 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 18 +++++---- | 99 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 +- |
38 | 9 files changed, 53 insertions(+), 87 deletions(-) | 100 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 ++++---- |
101 | 10 files changed, 80 insertions(+), 143 deletions(-) | ||
39 | 102 | ||
40 | -- | 103 | -- |
41 | 2.43.0 | 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 |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Drop bpf_mptcp_subflow_ctx_by_pos declaration, since | 3 | Drop this patch. bpf_mptcp_subflow_ctx_by_pos and |
4 | "-Wmissing-declarations" is ignored in __bpf_kfunc_start_defs. | 4 | mptcp_sched_data_set_contexts are uesless now. |
5 | |||
6 | Rename bpf_mptcp_subflow_ctx_by_pos to bpf_mptcp_lookup_subflow_by_id | ||
7 | and drop mptcp_sched_data_set_contexts. | ||
8 | 5 | ||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
10 | --- | 7 | --- |
11 | net/mptcp/bpf.c | 13 +++++++++---- | 8 | net/mptcp/bpf.c | 8 -------- |
12 | net/mptcp/sched.c | 22 ---------------------- | 9 | net/mptcp/protocol.h | 2 -- |
13 | 2 files changed, 9 insertions(+), 26 deletions(-) | 10 | net/mptcp/sched.c | 22 ---------------------- |
11 | 3 files changed, 32 deletions(-) | ||
14 | 12 | ||
15 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | 13 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c |
16 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
17 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
18 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
19 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk) | 17 | @@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it) |
18 | { | ||
20 | } | 19 | } |
21 | 20 | ||
22 | __bpf_kfunc struct mptcp_subflow_context * | 21 | -__bpf_kfunc struct mptcp_subflow_context * |
23 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) | 22 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) |
24 | +bpf_mptcp_lookup_subflow_by_id(struct mptcp_sock *msk, unsigned int id) | 23 | -{ |
25 | { | ||
26 | - if (pos >= MPTCP_SUBFLOWS_MAX) | 24 | - if (pos >= MPTCP_SUBFLOWS_MAX) |
27 | - return NULL; | 25 | - return NULL; |
28 | - return data->contexts[pos]; | 26 | - return data->contexts[pos]; |
29 | + struct mptcp_subflow_context *subflow; | 27 | -} |
30 | + | 28 | - |
31 | + mptcp_for_each_subflow(msk, subflow) { | 29 | __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) |
32 | + if (subflow->subflow_id == id) | 30 | { |
33 | + return subflow; | 31 | return tcp_rtx_queue_empty(sk); |
34 | + } | 32 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h |
35 | + | 33 | index XXXXXXX..XXXXXXX 100644 |
36 | + return NULL; | 34 | --- a/net/mptcp/protocol.h |
37 | } | 35 | +++ b/net/mptcp/protocol.h |
38 | 36 | @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk); | |
39 | __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | 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); | ||
40 | diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c | 45 | diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c |
41 | index XXXXXXX..XXXXXXX 100644 | 46 | index XXXXXXX..XXXXXXX 100644 |
42 | --- a/net/mptcp/sched.c | 47 | --- a/net/mptcp/sched.c |
43 | +++ b/net/mptcp/sched.c | 48 | +++ b/net/mptcp/sched.c |
44 | @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, | 49 | @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, |
... | ... | ||
67 | - | 72 | - |
68 | int mptcp_sched_get_send(struct mptcp_sock *msk) | 73 | int mptcp_sched_get_send(struct mptcp_sock *msk) |
69 | { | 74 | { |
70 | struct mptcp_subflow_context *subflow; | 75 | struct mptcp_subflow_context *subflow; |
71 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_send(struct mptcp_sock *msk) | 76 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_send(struct mptcp_sock *msk) |
72 | data.reinject = false; | 77 | |
73 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 78 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
74 | return mptcp_sched_default_get_subflow(msk, &data); | 79 | return mptcp_sched_default_get_send(msk, &data); |
75 | - mptcp_sched_data_set_contexts(msk, &data); | 80 | - mptcp_sched_data_set_contexts(msk, &data); |
76 | return msk->sched->get_subflow(msk, &data); | 81 | return msk->sched->get_send(msk, &data); |
77 | } | 82 | } |
78 | 83 | ||
79 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk) | 84 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk) |
80 | data.reinject = true; | ||
81 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 85 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
82 | return mptcp_sched_default_get_subflow(msk, &data); | 86 | return mptcp_sched_default_get_retrans(msk, &data); |
87 | |||
83 | - mptcp_sched_data_set_contexts(msk, &data); | 88 | - mptcp_sched_data_set_contexts(msk, &data); |
84 | return msk->sched->get_subflow(msk, &data); | 89 | if (msk->sched->get_retrans) |
85 | } | 90 | return msk->sched->get_retrans(msk, &data); |
91 | return msk->sched->get_send(msk, &data); | ||
86 | -- | 92 | -- |
87 | 2.43.0 | 93 | 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 | Please update the subject to | 3 | Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set. |
4 | 4 | Drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead. | |
5 | "bpf: Register mptcp struct_ops kfunc set" | 5 | Add new helpers bpf_mptcp_subflow_tcp_sock() and |
6 | 6 | bpf_sk_stream_memory_free(). | |
7 | Rename bpf_mptcp_sched_kfunc_set to bpf_mptcp_struct_ops_kfunc_set, since | ||
8 | this kfunc set will not only use in bpf packet schedulers, but also in | ||
9 | other struct_ops like bpf path managers. | ||
10 | |||
11 | Rename bpf_mptcp_subflow_ctx_by_pos to bpf_mptcp_lookup_subflow_by_id. | ||
12 | 7 | ||
13 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
14 | --- | 9 | --- |
15 | net/mptcp/bpf.c | 12 ++++++------ | 10 | net/mptcp/bpf.c | 38 ++++++++++++++++++++++++-------------- |
16 | 1 file changed, 6 insertions(+), 6 deletions(-) | 11 | 1 file changed, 24 insertions(+), 14 deletions(-) |
17 | 12 | ||
18 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | 13 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c |
19 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
20 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
21 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
22 | @@ -XXX,XX +XXX,XX @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | 17 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
23 | .set = &bpf_mptcp_common_kfunc_ids, | 18 | return NULL; |
24 | }; | 19 | } |
25 | 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 | - | ||
26 | -BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) | 61 | -BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) |
27 | +BTF_KFUNCS_START(bpf_mptcp_struct_ops_kfunc_ids) | ||
28 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) | 62 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) |
29 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) | 63 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) |
30 | +BTF_ID_FLAGS(func, bpf_mptcp_lookup_subflow_by_id) | 64 | BTF_ID_FLAGS(func, mptcp_subflow_active) |
31 | BTF_ID_FLAGS(func, mptcp_set_timeout) | 65 | BTF_ID_FLAGS(func, mptcp_set_timeout) |
32 | BTF_ID_FLAGS(func, mptcp_wnd_end) | 66 | BTF_ID_FLAGS(func, mptcp_wnd_end) |
33 | BTF_ID_FLAGS(func, tcp_stream_memory_free) | 67 | -BTF_ID_FLAGS(func, tcp_stream_memory_free) |
68 | +BTF_ID_FLAGS(func, bpf_sk_stream_memory_free, KF_RET_NULL) | ||
34 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) | 69 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) |
35 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale) | 70 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) |
36 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | 71 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) |
37 | +BTF_KFUNCS_END(bpf_mptcp_struct_ops_kfunc_ids) | 72 | +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) |
38 | 73 | ||
39 | -static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { | 74 | -static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { |
40 | +static const struct btf_kfunc_id_set bpf_mptcp_struct_ops_kfunc_set = { | 75 | +static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { |
41 | .owner = THIS_MODULE, | 76 | .owner = THIS_MODULE, |
42 | - .set = &bpf_mptcp_sched_kfunc_ids, | 77 | - .set = &bpf_mptcp_sched_kfunc_ids, |
43 | + .set = &bpf_mptcp_struct_ops_kfunc_ids, | 78 | + .set = &bpf_mptcp_common_kfunc_ids, |
44 | }; | 79 | }; |
45 | 80 | ||
46 | static int __init bpf_mptcp_kfunc_init(void) | 81 | static int __init bpf_mptcp_kfunc_init(void) |
47 | @@ -XXX,XX +XXX,XX @@ static int __init bpf_mptcp_kfunc_init(void) | 82 | @@ -XXX,XX +XXX,XX @@ static int __init bpf_mptcp_kfunc_init(void) |
48 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, | 83 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT, |
49 | &bpf_mptcp_common_kfunc_set); | 84 | &bpf_mptcp_common_kfunc_set); |
50 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, | 85 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, |
51 | - &bpf_mptcp_sched_kfunc_set); | 86 | - &bpf_mptcp_sched_kfunc_set); |
52 | + &bpf_mptcp_struct_ops_kfunc_set); | 87 | + &bpf_mptcp_common_kfunc_set); |
53 | #ifdef CONFIG_BPF_JIT | 88 | #ifdef CONFIG_BPF_JIT |
54 | ret = ret ?: register_bpf_struct_ops(&bpf_mptcp_sched_ops, mptcp_sched_ops); | 89 | ret = ret ?: register_bpf_struct_ops(&bpf_mptcp_sched_ops, mptcp_sched_ops); |
55 | #endif | 90 | #endif |
56 | -- | 91 | -- |
57 | 2.43.0 | 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 | 2 +- | 8 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --- |
8 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++- | 9 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++- |
9 | 2 files changed, 8 insertions(+), 2 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 void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, | 16 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym; |
17 | extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, | ||
16 | bool scheduled) __ksym; | 18 | bool scheduled) __ksym; |
17 | 19 | ||
18 | extern struct mptcp_subflow_context * | 20 | -extern struct mptcp_subflow_context * |
19 | -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; |
20 | +bpf_mptcp_lookup_subflow_by_id(struct mptcp_sock *msk, unsigned int id) __ksym; | 22 | - |
21 | |||
22 | #endif | 23 | #endif |
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 | -- | 43 | -- |
43 | 2.43.0 | 44 | 2.43.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
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; |
... | ... | 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 | .../testing/selftests/bpf/progs/mptcp_bpf_rr.c | 18 ++++++++++-------- | 7 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++++++---------- |
8 | 1 file changed, 10 insertions(+), 8 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 @@ int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | struct mptcp_subflow_context *subflow; | 15 | int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk, |
16 | struct mptcp_sched_data *data) | ||
17 | { | ||
18 | - struct mptcp_subflow_context *subflow; | ||
19 | + struct mptcp_subflow_context *subflow, *next; | ||
16 | struct mptcp_rr_storage *ptr; | 20 | struct mptcp_rr_storage *ptr; |
17 | struct sock *last_snd = NULL; | 21 | - struct sock *last_snd = NULL; |
18 | - int nr = 0; | 22 | - int nr = 0; |
19 | + int id = 1; | ||
20 | 23 | ||
21 | ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0, | 24 | ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0, |
22 | BPF_LOCAL_STORAGE_GET_F_CREATE); | 25 | BPF_LOCAL_STORAGE_GET_F_CREATE); |
23 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, | 26 | if (!ptr) |
24 | 27 | return -1; | |
25 | last_snd = ptr->last_snd; | 28 | |
29 | - last_snd = ptr->last_snd; | ||
30 | + next = bpf_mptcp_subflow_ctx(msk->first); | ||
31 | + if (!next) | ||
32 | + return -1; | ||
26 | 33 | ||
27 | - 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++) { |
28 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 35 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
29 | - if (!last_snd || !subflow) | 36 | - if (!last_snd || !subflow) |
30 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 37 | - break; |
31 | + if (!last_snd) | 38 | + if (!ptr->last_snd) |
32 | break; | 39 | + goto out; |
33 | 40 | ||
34 | if (mptcp_subflow_tcp_sock(subflow) == last_snd) { | 41 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { |
35 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || | 42 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || |
36 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) | 43 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) |
37 | + struct mptcp_subflow_context *next; | 44 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
38 | + | 45 | + if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) { |
39 | + next = bpf_core_cast(list_next_entry(subflow, node), | 46 | + subflow = bpf_iter_mptcp_subflow_next(&___it); |
40 | + struct mptcp_subflow_context); | 47 | + if (!subflow) |
41 | + if (list_entry_is_head(next, &msk->conn_list, node)) | ||
42 | break; | 48 | break; |
43 | 49 | ||
44 | - nr = i + 1; | 50 | - nr = i + 1; |
45 | + id = next->subflow_id; | 51 | + next = subflow; |
46 | break; | 52 | break; |
47 | } | 53 | } |
48 | } | 54 | } |
49 | 55 | ||
50 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr); | 56 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr); |
51 | + subflow = bpf_mptcp_lookup_subflow_by_id(msk, id); | 57 | - if (!subflow) |
52 | if (!subflow) | 58 | - return -1; |
53 | return -1; | 59 | - mptcp_subflow_set_scheduled(subflow, true); |
54 | mptcp_subflow_set_scheduled(subflow, true); | 60 | - ptr->last_snd = mptcp_subflow_tcp_sock(subflow); |
61 | +out: | ||
62 | + mptcp_subflow_set_scheduled(next, true); | ||
63 | + ptr->last_snd = mptcp_subflow_tcp_sock(next); | ||
64 | return 0; | ||
65 | } | ||
66 | |||
55 | -- | 67 | -- |
56 | 2.43.0 | 68 | 2.43.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
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 | -- | 30 | -- |
31 | 2.43.0 | 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 | 39 +++++++------------ | 8 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
8 | 1 file changed, 14 insertions(+), 25 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 @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk) | 15 | @@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL"; |
16 | |||
17 | #define min(a, b) ((a) < (b) ? (a) : (b)) | ||
18 | |||
19 | -struct bpf_subflow_send_info { | ||
20 | - __u8 subflow_id; | ||
21 | - __u64 linger_time; | ||
22 | -}; | ||
23 | - | ||
24 | extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym; | ||
25 | extern void mptcp_set_timeout(struct sock *sk) __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; | ||
29 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; | ||
30 | extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym; | ||
31 | |||
32 | @@ -XXX,XX +XXX,XX @@ static __always_inline bool tcp_rtx_and_write_queues_empty(struct sock *sk) | ||
33 | return bpf_mptcp_subflow_queues_empty(sk) && tcp_write_queue_empty(sk); | ||
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; | ||
40 | - | ||
41 | - return tcp_stream_memory_free(sk, wake); | ||
42 | -} | ||
43 | - | ||
44 | -static __always_inline bool sk_stream_memory_free(const struct sock *sk) | ||
45 | -{ | ||
46 | - return __sk_stream_memory_free(sk, 0); | ||
47 | -} | ||
48 | - | ||
49 | SEC("struct_ops") | ||
50 | void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk) | ||
15 | { | 51 | { |
16 | } | 52 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
17 | 53 | int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | |
18 | -static int bpf_burst_get_send(struct mptcp_sock *msk, | 54 | struct mptcp_sched_data *data) |
19 | - struct mptcp_sched_data *data) | ||
20 | +static int bpf_burst_get_send(struct mptcp_sock *msk) | ||
21 | { | 55 | { |
22 | struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; | 56 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; |
57 | + struct subflow_send_info send_info[SSK_MODE_MAX]; | ||
23 | struct mptcp_subflow_context *subflow; | 58 | struct mptcp_subflow_context *subflow; |
24 | @@ -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; | ||
25 | send_info[i].linger_time = -1; | 67 | send_info[i].linger_time = -1; |
26 | } | 68 | } |
27 | 69 | ||
28 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 70 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
29 | - bool backup; | 71 | - bool backup; |
30 | - | 72 | - |
31 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 73 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
32 | - if (!subflow) | 74 | - if (!subflow) |
33 | - break; | 75 | - break; |
34 | - | 76 | - |
35 | - backup = subflow->backup || subflow->request_bkup; | 77 | - backup = subflow->backup || subflow->request_bkup; |
36 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 78 | + bpf_for_each(mptcp_subflow, subflow, sk) { |
37 | + bool backup = subflow->backup || subflow->request_bkup; | 79 | + bool backup = subflow->backup || subflow->request_bkup; |
38 | 80 | ||
39 | ssk = mptcp_subflow_tcp_sock(subflow); | 81 | ssk = mptcp_subflow_tcp_sock(subflow); |
40 | if (!mptcp_subflow_active(subflow)) | 82 | if (!mptcp_subflow_active(subflow)) |
41 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 83 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, |
42 | 84 | ||
43 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); | 85 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); |
44 | if (linger_time < send_info[backup].linger_time) { | 86 | if (linger_time < send_info[backup].linger_time) { |
45 | - send_info[backup].subflow_id = i; | 87 | - send_info[backup].subflow_id = i; |
46 | + send_info[backup].subflow_id = subflow->subflow_id; | 88 | + send_info[backup].ssk = ssk; |
47 | send_info[backup].linger_time = linger_time; | 89 | send_info[backup].linger_time = linger_time; |
48 | } | 90 | } |
49 | } | 91 | } |
50 | @@ -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 */ | ||
51 | if (!nr_active) | 95 | if (!nr_active) |
52 | 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; | ||
53 | 98 | ||
54 | - 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); |
55 | + subflow = bpf_mptcp_lookup_subflow_by_id(msk, send_info[SSK_MODE_ACTIVE].subflow_id); | 100 | - if (!subflow) |
56 | if (!subflow) | 101 | + ssk = send_info[SSK_MODE_ACTIVE].ssk; |
102 | + if (!ssk || !bpf_sk_stream_memory_free(ssk)) | ||
57 | return -1; | 103 | return -1; |
58 | ssk = mptcp_subflow_tcp_sock(subflow); | 104 | - ssk = mptcp_subflow_tcp_sock(subflow); |
59 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 105 | - if (!ssk || !sk_stream_memory_free(ssk)) |
60 | return 0; | 106 | + |
61 | } | 107 | + subflow = bpf_mptcp_subflow_ctx(ssk); |
62 | 108 | + if (!subflow) | |
63 | -static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 109 | return -1; |
64 | - struct mptcp_sched_data *data) | 110 | |
65 | +static int bpf_burst_get_retrans(struct mptcp_sock *msk) | 111 | burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); |
112 | + ssk = bpf_core_cast(ssk, struct sock); | ||
113 | wmem = ssk->sk_wmem_queued; | ||
114 | if (!burst) | ||
115 | goto out; | ||
116 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") | ||
117 | int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, | ||
118 | struct mptcp_sched_data *data) | ||
66 | { | 119 | { |
67 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; | 120 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; |
68 | + int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX; | 121 | + struct sock *backup = NULL, *pick = NULL; |
69 | struct mptcp_subflow_context *subflow; | 122 | struct mptcp_subflow_context *subflow; |
70 | int min_stale_count = INT_MAX; | 123 | int min_stale_count = INT_MAX; |
71 | struct sock *ssk; | 124 | - struct sock *ssk; |
72 | + int subflow_id; | ||
73 | 125 | ||
74 | - 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++) { |
75 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 127 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
76 | - if (!subflow) | 128 | - if (!subflow) |
77 | - break; | 129 | - break; |
78 | - | 130 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
79 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 131 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); |
80 | if (!mptcp_subflow_active(subflow)) | 132 | |
133 | - if (!mptcp_subflow_active(subflow)) | ||
134 | + if (!ssk || !mptcp_subflow_active(subflow)) | ||
81 | continue; | 135 | continue; |
82 | 136 | ||
83 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 137 | - ssk = mptcp_subflow_tcp_sock(subflow); |
138 | /* still data outstanding at TCP level? skip this */ | ||
139 | if (!tcp_rtx_and_write_queues_empty(ssk)) { | ||
140 | mptcp_pm_subflow_chk_stale(msk, ssk); | ||
141 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, | ||
142 | } | ||
84 | 143 | ||
85 | if (subflow->backup || subflow->request_bkup) { | 144 | if (subflow->backup || subflow->request_bkup) { |
86 | if (backup == MPTCP_SUBFLOWS_MAX) | 145 | - if (backup == MPTCP_SUBFLOWS_MAX) |
87 | - backup = i; | 146 | - backup = i; |
88 | + backup = subflow->subflow_id; | 147 | + if (!backup) |
148 | + backup = ssk; | ||
89 | continue; | 149 | continue; |
90 | } | 150 | } |
91 | 151 | ||
92 | if (pick == MPTCP_SUBFLOWS_MAX) | 152 | - if (pick == MPTCP_SUBFLOWS_MAX) |
93 | - pick = i; | 153 | - pick = i; |
94 | + pick = subflow->subflow_id; | 154 | + if (!pick) |
155 | + pick = ssk; | ||
95 | } | 156 | } |
96 | 157 | ||
97 | if (pick < MPTCP_SUBFLOWS_MAX) { | 158 | - if (pick < MPTCP_SUBFLOWS_MAX) { |
98 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 159 | - subflow_id = pick; |
99 | subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX; | 160 | + if (pick) |
161 | goto out; | ||
162 | - } | ||
163 | - subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX; | ||
164 | + pick = min_stale_count > 1 ? backup : NULL; | ||
100 | 165 | ||
101 | out: | 166 | out: |
102 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, subflow_id); | 167 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, subflow_id); |
103 | + subflow = bpf_mptcp_lookup_subflow_by_id(msk, subflow_id); | 168 | + if (!pick) |
169 | + return -1; | ||
170 | + subflow = bpf_mptcp_subflow_ctx(pick); | ||
104 | if (!subflow) | 171 | if (!subflow) |
105 | return -1; | 172 | return -1; |
106 | mptcp_subflow_set_scheduled(subflow, true); | 173 | mptcp_subflow_set_scheduled(subflow, true); |
107 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_subflow, struct mptcp_sock *msk, | ||
108 | struct mptcp_sched_data *data) | ||
109 | { | ||
110 | if (data->reinject) | ||
111 | - return bpf_burst_get_retrans(msk, data); | ||
112 | - return bpf_burst_get_send(msk, data); | ||
113 | + return bpf_burst_get_retrans(msk); | ||
114 | + return bpf_burst_get_send(msk); | ||
115 | } | ||
116 | |||
117 | SEC(".struct_ops") | ||
118 | -- | 174 | -- |
119 | 2.43.0 | 175 | 2.43.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
3 | The mptcp_subflow bpf_iter is added now, it's better to use the helper | 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 | 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 | 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 | 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 | 7 | to a fixed array. With this helper, we can get rid of this subflow array |
8 | "contexts" and the size of it "subflows" in struct mptcp_sched_data. | 8 | "contexts" in struct mptcp_sched_data. |
9 | 9 | ||
10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
11 | --- | 11 | --- |
12 | include/net/mptcp.h | 2 -- | 12 | include/net/mptcp.h | 3 --- |
13 | 1 file changed, 2 deletions(-) | 13 | 1 file changed, 3 deletions(-) |
14 | 14 | ||
15 | diff --git a/include/net/mptcp.h b/include/net/mptcp.h | 15 | diff --git a/include/net/mptcp.h b/include/net/mptcp.h |
16 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
17 | --- a/include/net/mptcp.h | 17 | --- a/include/net/mptcp.h |
18 | +++ b/include/net/mptcp.h | 18 | +++ b/include/net/mptcp.h |
19 | @@ -XXX,XX +XXX,XX @@ struct mptcp_out_options { | 19 | @@ -XXX,XX +XXX,XX @@ struct mptcp_out_options { |
20 | 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 | - | ||
21 | struct mptcp_sched_data { | 25 | struct mptcp_sched_data { |
22 | bool reinject; | 26 | u8 subflows; |
23 | - u8 subflows; | ||
24 | - struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX]; | 27 | - struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX]; |
25 | }; | 28 | }; |
26 | 29 | ||
27 | struct mptcp_sched_ops { | 30 | struct mptcp_sched_ops { |
28 | -- | 31 | -- |
29 | 2.43.0 | 32 | 2.43.0 | diff view generated by jsdifflib |