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. | ||
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 | ||
2 | 52 | ||
3 | v5: | 53 | v5: |
4 | - patch 2, drop mptcp_sock_type and mptcp_subflow_type. | 54 | - patch 2, drop mptcp_sock_type and mptcp_subflow_type. |
5 | - patch 3, revert "bpf: Export more bpf_burst related functions" | 55 | - patch 3, revert "bpf: Export more bpf_burst related functions" |
6 | - patch 4, merge "bpf: Export more bpf_burst related functions" into it. | 56 | - patch 4, merge "bpf: Export more bpf_burst related functions" into it. |
... | ... | ||
20 | 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 |
21 | subflows array "contexts" in struct mptcp_sched_data. This set | 71 | subflows array "contexts" in struct mptcp_sched_data. This set |
22 | 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 |
23 | schedules: | 73 | schedules: |
24 | 74 | ||
25 | bpf_for_each(mptcp_subflow, subflow, msk) { | 75 | bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
26 | ... ... | 76 | ... ... |
27 | mptcp_subflow_set_scheduled(subflow, true); | 77 | mptcp_subflow_set_scheduled(subflow, true); |
28 | } | 78 | } |
29 | 79 | ||
30 | Depends on: | 80 | Geliang Tang (9): |
31 | - "add mptcp_subflow bpf_iter" v9 | 81 | Squash to "bpf: Register mptcp common kfunc set" |
32 | |||
33 | Based-on: <cover.1728466623.git.tanggeliang@kylinos.cn> | ||
34 | |||
35 | Geliang Tang (11): | ||
36 | Revert "mptcp: add sched_data helpers" | 82 | Revert "mptcp: add sched_data helpers" |
37 | Squash to "bpf: Add bpf_mptcp_sched_ops" | 83 | Squash to "bpf: Export mptcp packet scheduler helpers" |
38 | Revert "bpf: Export more bpf_burst related functions" | ||
39 | Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" | ||
40 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | 84 | Squash to "selftests/bpf: Add bpf_first scheduler & test" |
41 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" | 85 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" |
42 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" | 86 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" |
43 | Squash to "selftests/bpf: Add bpf_red scheduler & test" | 87 | Squash to "selftests/bpf: Add bpf_red scheduler & test" |
44 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 88 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
45 | mptcp: drop subflow contexts in mptcp_sched_data | 89 | mptcp: drop subflow contexts in mptcp_sched_data |
46 | Squash to "selftests/bpf: Add bpf scheduler test" - drop | ||
47 | has_bytes_sent | ||
48 | 90 | ||
49 | include/net/mptcp.h | 2 - | 91 | include/net/mptcp.h | 3 - |
50 | net/mptcp/bpf.c | 24 ++---- | 92 | net/mptcp/bpf.c | 52 +++++++------ |
51 | net/mptcp/protocol.h | 3 - | 93 | net/mptcp/protocol.h | 2 - |
52 | net/mptcp/sched.c | 22 ------ | 94 | net/mptcp/sched.c | 22 ------ |
53 | .../testing/selftests/bpf/prog_tests/mptcp.c | 48 ++++++------ | ||
54 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - | 95 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - |
55 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +--- | 96 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +--- |
56 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++++---------- | 97 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
57 | .../selftests/bpf/progs/mptcp_bpf_bytes.c | 39 ++++++++++ | ||
58 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +- | 98 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +- |
59 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 +- | 99 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 +- |
60 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 24 +++--- | 100 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 ++++---- |
61 | 12 files changed, 133 insertions(+), 142 deletions(-) | 101 | 10 files changed, 80 insertions(+), 143 deletions(-) |
62 | create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c | ||
63 | 102 | ||
64 | -- | 103 | -- |
65 | 2.43.0 | 104 | 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 | Instead of adding a new BPF function bpf_mptcp_send_info_to_ssk() in |
4 | 4 | v12, this patch uses a much more simpler approach, which using '__ign' | |
5 | bpf: Add mptcp packet scheduler struct_ops | 5 | suffix for the argument of bpf_mptcp_subflow_ctx() to let BPF to |
6 | 6 | ignore the type check of this argument. | |
7 | Drop mptcp_sock_type and mptcp_subflow_type. | ||
8 | 7 | ||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
10 | --- | 9 | --- |
11 | net/mptcp/bpf.c | 15 ++++++--------- | 10 | net/mptcp/bpf.c | 8 ++++---- |
12 | 1 file changed, 6 insertions(+), 9 deletions(-) | 11 | 1 file changed, 4 insertions(+), 4 deletions(-) |
13 | 12 | ||
14 | 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 |
15 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
17 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
18 | @@ -XXX,XX +XXX,XX @@ | 17 | @@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern { |
19 | 18 | __bpf_kfunc_start_defs(); | |
20 | #ifdef CONFIG_BPF_JIT | 19 | |
21 | static struct bpf_struct_ops bpf_mptcp_sched_ops; | 20 | __bpf_kfunc static struct mptcp_subflow_context * |
22 | -static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly; | 21 | -bpf_mptcp_subflow_ctx(const struct sock *sk) |
23 | static u32 mptcp_sock_id, mptcp_subflow_id; | 22 | +bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
24 | |||
25 | +/* MPTCP BPF packet scheduler */ | ||
26 | + | ||
27 | static const struct bpf_func_proto * | ||
28 | bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id, | ||
29 | const struct bpf_prog *prog) | ||
30 | @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log, | ||
31 | const struct bpf_reg_state *reg, | ||
32 | int off, int size) | ||
33 | { | 23 | { |
34 | - const struct btf_type *t; | 24 | - if (sk && sk_fullsock(sk) && |
35 | + u32 id = reg->btf_id; | 25 | - sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) |
36 | size_t end; | 26 | - return mptcp_subflow_ctx(sk); |
37 | 27 | + if (sk__ign && sk_fullsock(sk__ign) && | |
38 | - t = btf_type_by_id(reg->btf, reg->btf_id); | 28 | + sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign)) |
39 | - | 29 | + return mptcp_subflow_ctx(sk__ign); |
40 | - if (t == mptcp_sock_type) { | 30 | |
41 | + if (id == mptcp_sock_id) { | 31 | return NULL; |
42 | switch (off) { | ||
43 | case offsetof(struct mptcp_sock, snd_burst): | ||
44 | end = offsetofend(struct mptcp_sock, snd_burst); | ||
45 | @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log, | ||
46 | off); | ||
47 | return -EACCES; | ||
48 | } | ||
49 | - } else if (t == mptcp_subflow_type) { | ||
50 | + } else if (id == mptcp_subflow_id) { | ||
51 | switch (off) { | ||
52 | case offsetof(struct mptcp_subflow_context, avg_pacing_rate): | ||
53 | end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate); | ||
54 | @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log, | ||
55 | |||
56 | if (off + size > end) { | ||
57 | bpf_log(log, "access beyond %s at off %u size %u ended at %zu", | ||
58 | - t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context", | ||
59 | + id == mptcp_sock_id ? "mptcp_sock" : "mptcp_subflow_context", | ||
60 | off, size, end); | ||
61 | return -EACCES; | ||
62 | } | ||
63 | @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_init(struct btf *btf) | ||
64 | if (type_id < 0) | ||
65 | return -EINVAL; | ||
66 | mptcp_sock_id = type_id; | ||
67 | - mptcp_sock_type = btf_type_by_id(btf, mptcp_sock_id); | ||
68 | |||
69 | type_id = btf_find_by_name_kind(btf, "mptcp_subflow_context", | ||
70 | BTF_KIND_STRUCT); | ||
71 | if (type_id < 0) | ||
72 | return -EINVAL; | ||
73 | mptcp_subflow_id = type_id; | ||
74 | - mptcp_subflow_type = btf_type_by_id(btf, mptcp_subflow_id); | ||
75 | |||
76 | return 0; | ||
77 | } | 32 | } |
78 | -- | 33 | -- |
79 | 2.43.0 | 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 this patch. | 3 | Drop this patch. bpf_mptcp_subflow_ctx_by_pos and |
4 | mptcp_sched_data_set_contexts are uesless now. | ||
4 | 5 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 7 | --- |
7 | net/mptcp/bpf.c | 8 -------- | 8 | net/mptcp/bpf.c | 8 -------- |
8 | net/mptcp/protocol.h | 2 -- | 9 | net/mptcp/protocol.h | 2 -- |
... | ... | ||
11 | 12 | ||
12 | 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 |
13 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
15 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
16 | @@ -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) |
17 | WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); | 18 | { |
18 | } | 19 | } |
19 | 20 | ||
20 | -__bpf_kfunc struct mptcp_subflow_context * | 21 | -__bpf_kfunc struct mptcp_subflow_context * |
21 | -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) |
22 | -{ | 23 | -{ |
23 | - if (pos >= MPTCP_SUBFLOWS_MAX) | 24 | - if (pos >= MPTCP_SUBFLOWS_MAX) |
24 | - return NULL; | 25 | - return NULL; |
25 | - return data->contexts[pos]; | 26 | - return data->contexts[pos]; |
26 | -} | 27 | -} |
27 | - | 28 | - |
28 | __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | 29 | __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) |
29 | { | 30 | { |
30 | return tcp_rtx_queue_empty(sk); | 31 | return tcp_rtx_queue_empty(sk); |
31 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | 32 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h |
32 | index XXXXXXX..XXXXXXX 100644 | 33 | index XXXXXXX..XXXXXXX 100644 |
33 | --- a/net/mptcp/protocol.h | 34 | --- a/net/mptcp/protocol.h |
34 | +++ b/net/mptcp/protocol.h | 35 | +++ b/net/mptcp/protocol.h |
35 | @@ -XXX,XX +XXX,XX @@ void mptcp_sock_graft(struct sock *sk, struct socket *parent); | 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); | ||
36 | u64 mptcp_wnd_end(const struct mptcp_sock *msk); | 38 | u64 mptcp_wnd_end(const struct mptcp_sock *msk); |
37 | void mptcp_set_timeout(struct sock *sk); | 39 | void mptcp_set_timeout(struct sock *sk); |
38 | bool bpf_mptcp_subflow_queues_empty(struct sock *sk); | ||
39 | -struct mptcp_subflow_context * | 40 | -struct mptcp_subflow_context * |
40 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos); | 41 | -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos); |
41 | struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); | 42 | struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); |
42 | bool __mptcp_close(struct sock *sk, long timeout); | 43 | bool __mptcp_close(struct sock *sk, long timeout); |
43 | void mptcp_cancel_work(struct sock *sk); | 44 | void mptcp_cancel_work(struct sock *sk); |
... | ... | ||
71 | - | 72 | - |
72 | int mptcp_sched_get_send(struct mptcp_sock *msk) | 73 | int mptcp_sched_get_send(struct mptcp_sock *msk) |
73 | { | 74 | { |
74 | struct mptcp_subflow_context *subflow; | 75 | struct mptcp_subflow_context *subflow; |
75 | @@ -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) |
76 | data.reinject = false; | 77 | |
77 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 78 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
78 | return mptcp_sched_default_get_subflow(msk, &data); | 79 | return mptcp_sched_default_get_send(msk, &data); |
79 | - mptcp_sched_data_set_contexts(msk, &data); | 80 | - mptcp_sched_data_set_contexts(msk, &data); |
80 | return msk->sched->get_subflow(msk, &data); | 81 | return msk->sched->get_send(msk, &data); |
81 | } | 82 | } |
82 | 83 | ||
83 | @@ -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) |
84 | data.reinject = true; | ||
85 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 85 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
86 | return mptcp_sched_default_get_subflow(msk, &data); | 86 | return mptcp_sched_default_get_retrans(msk, &data); |
87 | |||
87 | - mptcp_sched_data_set_contexts(msk, &data); | 88 | - mptcp_sched_data_set_contexts(msk, &data); |
88 | return msk->sched->get_subflow(msk, &data); | 89 | if (msk->sched->get_retrans) |
89 | } | 90 | return msk->sched->get_retrans(msk, &data); |
91 | return msk->sched->get_send(msk, &data); | ||
90 | -- | 92 | -- |
91 | 2.43.0 | 93 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
2 | 1 | ||
3 | This reverts commit d0f5ca7a98fea075d60fb88f1c2b29a6f5f04d68. | ||
4 | --- | ||
5 | net/mptcp/bpf.c | 10 ---------- | ||
6 | net/mptcp/protocol.c | 4 ++-- | ||
7 | net/mptcp/protocol.h | 3 --- | ||
8 | 3 files changed, 2 insertions(+), 15 deletions(-) | ||
9 | |||
10 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/net/mptcp/bpf.c | ||
13 | +++ b/net/mptcp/bpf.c | ||
14 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk) | ||
15 | WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); | ||
16 | } | ||
17 | |||
18 | -__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | ||
19 | -{ | ||
20 | - return tcp_rtx_queue_empty(sk); | ||
21 | -} | ||
22 | - | ||
23 | __bpf_kfunc_end_defs(); | ||
24 | |||
25 | BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) | ||
26 | @@ -XXX,XX +XXX,XX @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | ||
27 | |||
28 | BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) | ||
29 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) | ||
30 | -BTF_ID_FLAGS(func, mptcp_set_timeout) | ||
31 | -BTF_ID_FLAGS(func, mptcp_wnd_end) | ||
32 | -BTF_ID_FLAGS(func, tcp_stream_memory_free) | ||
33 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) | ||
34 | -BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale) | ||
35 | BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | ||
36 | |||
37 | static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { | ||
38 | diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c | ||
39 | index XXXXXXX..XXXXXXX 100644 | ||
40 | --- a/net/mptcp/protocol.c | ||
41 | +++ b/net/mptcp/protocol.c | ||
42 | @@ -XXX,XX +XXX,XX @@ DEFINE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions); | ||
43 | static struct net_device mptcp_napi_dev; | ||
44 | |||
45 | /* Returns end sequence number of the receiver's advertised window */ | ||
46 | -u64 mptcp_wnd_end(const struct mptcp_sock *msk) | ||
47 | +static u64 mptcp_wnd_end(const struct mptcp_sock *msk) | ||
48 | { | ||
49 | return READ_ONCE(msk->wnd_end); | ||
50 | } | ||
51 | @@ -XXX,XX +XXX,XX @@ static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subfl | ||
52 | inet_csk(ssk)->icsk_timeout - jiffies : 0; | ||
53 | } | ||
54 | |||
55 | -void mptcp_set_timeout(struct sock *sk) | ||
56 | +static void mptcp_set_timeout(struct sock *sk) | ||
57 | { | ||
58 | struct mptcp_subflow_context *subflow; | ||
59 | long tout = 0; | ||
60 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | ||
61 | index XXXXXXX..XXXXXXX 100644 | ||
62 | --- a/net/mptcp/protocol.h | ||
63 | +++ b/net/mptcp/protocol.h | ||
64 | @@ -XXX,XX +XXX,XX @@ void __mptcp_subflow_send_ack(struct sock *ssk); | ||
65 | void mptcp_subflow_reset(struct sock *ssk); | ||
66 | void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk); | ||
67 | void mptcp_sock_graft(struct sock *sk, struct socket *parent); | ||
68 | -u64 mptcp_wnd_end(const struct mptcp_sock *msk); | ||
69 | -void mptcp_set_timeout(struct sock *sk); | ||
70 | -bool bpf_mptcp_subflow_queues_empty(struct sock *sk); | ||
71 | struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); | ||
72 | bool __mptcp_close(struct sock *sk, long timeout); | ||
73 | void mptcp_cancel_work(struct sock *sk); | ||
74 | -- | ||
75 | 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 | ||
4 | |||
5 | "bpf: Export mptcp packet scheduler helpers" | ||
6 | |||
7 | Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set. | 3 | Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set. |
8 | Merge "bpf: Export more bpf_burst related functions" into this patch. | 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(). | ||
9 | 7 | ||
10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
11 | --- | 9 | --- |
12 | net/mptcp/bpf.c | 11 ++++++++++- | 10 | net/mptcp/bpf.c | 38 ++++++++++++++++++++++++-------------- |
13 | net/mptcp/protocol.c | 4 ++-- | 11 | 1 file changed, 24 insertions(+), 14 deletions(-) |
14 | net/mptcp/protocol.h | 2 ++ | ||
15 | 3 files changed, 14 insertions(+), 3 deletions(-) | ||
16 | 12 | ||
17 | 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 |
18 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
19 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
20 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
21 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk) | 17 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
22 | WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); | 18 | return NULL; |
23 | } | 19 | } |
24 | 20 | ||
25 | +__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | 21 | +__bpf_kfunc static struct sock * |
22 | +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | ||
26 | +{ | 23 | +{ |
27 | + return tcp_rtx_queue_empty(sk); | 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; | ||
28 | +} | 44 | +} |
29 | + | 45 | + |
30 | __bpf_kfunc_end_defs(); | 46 | __bpf_kfunc_end_defs(); |
31 | 47 | ||
32 | BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) | 48 | BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) |
33 | @@ -XXX,XX +XXX,XX @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | 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, | ||
34 | }; | 79 | }; |
35 | 80 | ||
36 | BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) | 81 | static int __init bpf_mptcp_kfunc_init(void) |
37 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) | 82 | @@ -XXX,XX +XXX,XX @@ static int __init bpf_mptcp_kfunc_init(void) |
38 | +BTF_ID_FLAGS(func, mptcp_set_timeout) | 83 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT, |
39 | +BTF_ID_FLAGS(func, mptcp_wnd_end) | 84 | &bpf_mptcp_common_kfunc_set); |
40 | +BTF_ID_FLAGS(func, tcp_stream_memory_free) | 85 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, |
41 | +BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) | 86 | - &bpf_mptcp_sched_kfunc_set); |
42 | +BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale) | 87 | + &bpf_mptcp_common_kfunc_set); |
43 | BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | 88 | #ifdef CONFIG_BPF_JIT |
44 | 89 | ret = ret ?: register_bpf_struct_ops(&bpf_mptcp_sched_ops, mptcp_sched_ops); | |
45 | static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { | 90 | #endif |
46 | diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c | ||
47 | index XXXXXXX..XXXXXXX 100644 | ||
48 | --- a/net/mptcp/protocol.c | ||
49 | +++ b/net/mptcp/protocol.c | ||
50 | @@ -XXX,XX +XXX,XX @@ DEFINE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions); | ||
51 | static struct net_device mptcp_napi_dev; | ||
52 | |||
53 | /* Returns end sequence number of the receiver's advertised window */ | ||
54 | -static u64 mptcp_wnd_end(const struct mptcp_sock *msk) | ||
55 | +u64 mptcp_wnd_end(const struct mptcp_sock *msk) | ||
56 | { | ||
57 | return READ_ONCE(msk->wnd_end); | ||
58 | } | ||
59 | @@ -XXX,XX +XXX,XX @@ static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subfl | ||
60 | inet_csk(ssk)->icsk_timeout - jiffies : 0; | ||
61 | } | ||
62 | |||
63 | -static void mptcp_set_timeout(struct sock *sk) | ||
64 | +void mptcp_set_timeout(struct sock *sk) | ||
65 | { | ||
66 | struct mptcp_subflow_context *subflow; | ||
67 | long tout = 0; | ||
68 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | ||
69 | index XXXXXXX..XXXXXXX 100644 | ||
70 | --- a/net/mptcp/protocol.h | ||
71 | +++ b/net/mptcp/protocol.h | ||
72 | @@ -XXX,XX +XXX,XX @@ void __mptcp_subflow_send_ack(struct sock *ssk); | ||
73 | void mptcp_subflow_reset(struct sock *ssk); | ||
74 | void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk); | ||
75 | void mptcp_sock_graft(struct sock *sk, struct socket *parent); | ||
76 | +u64 mptcp_wnd_end(const struct mptcp_sock *msk); | ||
77 | +void mptcp_set_timeout(struct sock *sk); | ||
78 | struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); | ||
79 | bool __mptcp_close(struct sock *sk, long timeout); | ||
80 | void mptcp_cancel_work(struct sock *sk); | ||
81 | -- | 91 | -- |
82 | 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 | 3 --- | 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, 7 insertions(+), 4 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 @@ bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym; | 16 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym; |
16 | extern struct sock * | 17 | extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, |
17 | bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __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; |
21 | - | 22 | - |
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 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 24 ++++++++----------- | 7 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++++++---------- |
8 | 1 file changed, 10 insertions(+), 14 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 | -- | 67 | -- |
64 | 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 | 4 | Drop bpf_subflow_send_info, use subflow_send_info instead. | |
5 | Drop mptcp_subflow_active declaration. | ||
6 | 5 | ||
7 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
8 | --- | 7 | --- |
9 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++++---------- | 8 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
10 | 1 file changed, 39 insertions(+), 39 deletions(-) | 9 | 1 file changed, 26 insertions(+), 52 deletions(-) |
11 | 10 | ||
12 | 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 |
13 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 13 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
15 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 14 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
16 | @@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL"; | 15 | @@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL"; |
17 | 16 | ||
18 | #define min(a, b) ((a) < (b) ? (a) : (b)) | 17 | #define min(a, b) ((a) < (b) ? (a) : (b)) |
19 | 18 | ||
20 | +#define SSK_MODE_ACTIVE 0 | 19 | -struct bpf_subflow_send_info { |
21 | +#define SSK_MODE_BACKUP 1 | 20 | - __u8 subflow_id; |
22 | +#define SSK_MODE_MAX 2 | 21 | - __u64 linger_time; |
23 | + | 22 | -}; |
24 | struct bpf_subflow_send_info { | 23 | - |
25 | __u8 subflow_id; | 24 | extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym; |
26 | __u64 linger_time; | ||
27 | }; | ||
28 | |||
29 | -extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym; | ||
30 | extern void mptcp_set_timeout(struct sock *sk) __ksym; | 25 | extern void mptcp_set_timeout(struct sock *sk) __ksym; |
31 | extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym; | 26 | extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym; |
32 | extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __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; | ||
33 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; | 29 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; |
34 | 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; |
35 | 31 | ||
36 | -#define SSK_MODE_ACTIVE 0 | 32 | @@ -XXX,XX +XXX,XX @@ static __always_inline bool tcp_rtx_and_write_queues_empty(struct sock *sk) |
37 | -#define SSK_MODE_BACKUP 1 | 33 | return bpf_mptcp_subflow_queues_empty(sk) && tcp_write_queue_empty(sk); |
38 | -#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; | ||
39 | - | 40 | - |
40 | static __always_inline __u64 div_u64(__u64 dividend, __u32 divisor) | 41 | - return tcp_stream_memory_free(sk, wake); |
41 | { | 42 | -} |
42 | return dividend / divisor; | 43 | - |
43 | @@ -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) |
44 | return __sk_stream_memory_free(sk, 0); | 45 | -{ |
45 | } | 46 | - return __sk_stream_memory_free(sk, 0); |
46 | 47 | -} | |
47 | +static struct mptcp_subflow_context * | 48 | - |
48 | +mptcp_lookup_subflow_by_id(struct mptcp_sock *msk, unsigned int id) | ||
49 | +{ | ||
50 | + struct mptcp_subflow_context *subflow; | ||
51 | + | ||
52 | + bpf_for_each(mptcp_subflow, subflow, msk) { | ||
53 | + if (subflow->subflow_id == id) | ||
54 | + return subflow; | ||
55 | + } | ||
56 | + | ||
57 | + return NULL; | ||
58 | +} | ||
59 | + | ||
60 | SEC("struct_ops") | 49 | SEC("struct_ops") |
61 | void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk) | 50 | void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk) |
62 | { | 51 | { |
63 | @@ -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) | ||
64 | { | 55 | { |
65 | } | 56 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; |
66 | 57 | + struct subflow_send_info send_info[SSK_MODE_MAX]; | |
67 | -static int bpf_burst_get_send(struct mptcp_sock *msk, | ||
68 | - struct mptcp_sched_data *data) | ||
69 | +static int bpf_burst_get_send(struct mptcp_sock *msk) | ||
70 | { | ||
71 | struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; | ||
72 | struct mptcp_subflow_context *subflow; | 58 | struct mptcp_subflow_context *subflow; |
73 | @@ -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; | ||
74 | send_info[i].linger_time = -1; | 67 | send_info[i].linger_time = -1; |
75 | } | 68 | } |
76 | 69 | ||
77 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 70 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
78 | - bool backup; | 71 | - bool backup; |
79 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 72 | - |
80 | + bool backup = subflow->backup || subflow->request_bkup; | ||
81 | |||
82 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 73 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
83 | - if (!subflow) | 74 | - if (!subflow) |
84 | - break; | 75 | - break; |
85 | - | 76 | - |
86 | - backup = subflow->backup || subflow->request_bkup; | 77 | - backup = subflow->backup || subflow->request_bkup; |
87 | - | 78 | + bpf_for_each(mptcp_subflow, subflow, sk) { |
88 | - ssk = mptcp_subflow_tcp_sock(subflow); | 79 | + bool backup = subflow->backup || subflow->request_bkup; |
89 | + ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 80 | |
81 | ssk = mptcp_subflow_tcp_sock(subflow); | ||
90 | if (!mptcp_subflow_active(subflow)) | 82 | if (!mptcp_subflow_active(subflow)) |
91 | continue; | 83 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, |
92 | |||
93 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | ||
94 | 84 | ||
95 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); | 85 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); |
96 | if (linger_time < send_info[backup].linger_time) { | 86 | if (linger_time < send_info[backup].linger_time) { |
97 | - send_info[backup].subflow_id = i; | 87 | - send_info[backup].subflow_id = i; |
98 | + send_info[backup].subflow_id = subflow->subflow_id; | 88 | + send_info[backup].ssk = ssk; |
99 | send_info[backup].linger_time = linger_time; | 89 | send_info[backup].linger_time = linger_time; |
100 | } | 90 | } |
101 | } | 91 | } |
102 | @@ -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 */ | ||
103 | if (!nr_active) | 95 | if (!nr_active) |
104 | 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; | ||
105 | 98 | ||
106 | - 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); |
107 | + subflow = mptcp_lookup_subflow_by_id(msk, send_info[SSK_MODE_ACTIVE].subflow_id); | 100 | - if (!subflow) |
108 | if (!subflow) | 101 | + ssk = send_info[SSK_MODE_ACTIVE].ssk; |
102 | + if (!ssk || !bpf_sk_stream_memory_free(ssk)) | ||
109 | return -1; | 103 | return -1; |
110 | - ssk = mptcp_subflow_tcp_sock(subflow); | 104 | - ssk = mptcp_subflow_tcp_sock(subflow); |
111 | + ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 105 | - if (!ssk || !sk_stream_memory_free(ssk)) |
112 | if (!ssk || !sk_stream_memory_free(ssk)) | 106 | + |
107 | + subflow = bpf_mptcp_subflow_ctx(ssk); | ||
108 | + if (!subflow) | ||
113 | return -1; | 109 | return -1; |
114 | 110 | ||
115 | @@ -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); |
116 | return 0; | 112 | + ssk = bpf_core_cast(ssk, struct sock); |
117 | } | 113 | wmem = ssk->sk_wmem_queued; |
118 | 114 | if (!burst) | |
119 | -static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 115 | goto out; |
120 | - struct mptcp_sched_data *data) | 116 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
121 | +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) | ||
122 | { | 119 | { |
123 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; | 120 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; |
124 | + struct sock *backup = NULL, *pick = NULL; | 121 | + struct sock *backup = NULL, *pick = NULL; |
125 | struct mptcp_subflow_context *subflow; | 122 | struct mptcp_subflow_context *subflow; |
126 | int min_stale_count = INT_MAX; | 123 | int min_stale_count = INT_MAX; |
127 | - struct sock *ssk; | 124 | - struct sock *ssk; |
128 | 125 | ||
129 | - 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++) { |
130 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 127 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
131 | - if (!subflow) | 128 | - if (!subflow) |
132 | - break; | 129 | - break; |
133 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 130 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
134 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 131 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); |
135 | 132 | ||
136 | if (!mptcp_subflow_active(subflow)) | 133 | - if (!mptcp_subflow_active(subflow)) |
134 | + if (!ssk || !mptcp_subflow_active(subflow)) | ||
137 | continue; | 135 | continue; |
138 | 136 | ||
139 | - ssk = mptcp_subflow_tcp_sock(subflow); | 137 | - ssk = mptcp_subflow_tcp_sock(subflow); |
140 | /* still data outstanding at TCP level? skip this */ | 138 | /* still data outstanding at TCP level? skip this */ |
141 | if (!tcp_rtx_and_write_queues_empty(ssk)) { | 139 | if (!tcp_rtx_and_write_queues_empty(ssk)) { |
142 | mptcp_pm_subflow_chk_stale(msk, ssk); | 140 | mptcp_pm_subflow_chk_stale(msk, ssk); |
143 | @@ -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, |
144 | } | 142 | } |
145 | 143 | ||
146 | if (subflow->backup || subflow->request_bkup) { | 144 | if (subflow->backup || subflow->request_bkup) { |
147 | - if (backup == MPTCP_SUBFLOWS_MAX) | 145 | - if (backup == MPTCP_SUBFLOWS_MAX) |
148 | - backup = i; | 146 | - backup = i; |
... | ... | ||
171 | + return -1; | 169 | + return -1; |
172 | + subflow = bpf_mptcp_subflow_ctx(pick); | 170 | + subflow = bpf_mptcp_subflow_ctx(pick); |
173 | if (!subflow) | 171 | if (!subflow) |
174 | return -1; | 172 | return -1; |
175 | mptcp_subflow_set_scheduled(subflow, true); | 173 | mptcp_subflow_set_scheduled(subflow, true); |
176 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_subflow, struct mptcp_sock *msk, | ||
177 | struct mptcp_sched_data *data) | ||
178 | { | ||
179 | if (data->reinject) | ||
180 | - return bpf_burst_get_retrans(msk, data); | ||
181 | - return bpf_burst_get_send(msk, data); | ||
182 | + return bpf_burst_get_retrans(msk); | ||
183 | + return bpf_burst_get_send(msk); | ||
184 | } | ||
185 | |||
186 | SEC(".struct_ops") | ||
187 | -- | 174 | -- |
188 | 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 |
Deleted patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
2 | 1 | ||
3 | Drop ss_search() and has_bytes_sent(), add a new bpf program to check | ||
4 | the bytes_sent. | ||
5 | |||
6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
7 | --- | ||
8 | .../testing/selftests/bpf/prog_tests/mptcp.c | 48 ++++++++++--------- | ||
9 | .../selftests/bpf/progs/mptcp_bpf_bytes.c | 39 +++++++++++++++ | ||
10 | 2 files changed, 65 insertions(+), 22 deletions(-) | ||
11 | create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c | ||
12 | |||
13 | diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c | ||
16 | +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c | ||
17 | @@ -XXX,XX +XXX,XX @@ | ||
18 | #include "mptcpify.skel.h" | ||
19 | #include "mptcp_subflow.skel.h" | ||
20 | #include "mptcp_bpf_iters_subflow.skel.h" | ||
21 | +#include "mptcp_bpf_bytes.skel.h" | ||
22 | #include "mptcp_bpf_first.skel.h" | ||
23 | #include "mptcp_bpf_bkup.skel.h" | ||
24 | #include "mptcp_bpf_rr.skel.h" | ||
25 | @@ -XXX,XX +XXX,XX @@ static struct nstoken *sched_init(char *flags, char *sched) | ||
26 | return NULL; | ||
27 | } | ||
28 | |||
29 | -static int ss_search(char *src, char *dst, char *port, char *keyword) | ||
30 | -{ | ||
31 | - return SYS_NOFAIL("ip netns exec %s ss -enita src %s dst %s %s %d | grep -q '%s'", | ||
32 | - NS_TEST, src, dst, port, PORT_1, keyword); | ||
33 | -} | ||
34 | - | ||
35 | -static int has_bytes_sent(char *dst) | ||
36 | -{ | ||
37 | - return ss_search(ADDR_1, dst, "sport", "bytes_sent:"); | ||
38 | -} | ||
39 | - | ||
40 | static void send_data_and_verify(char *sched, bool addr1, bool addr2) | ||
41 | { | ||
42 | + int server_fd, client_fd, err; | ||
43 | + struct mptcp_bpf_bytes *skel; | ||
44 | struct timespec start, end; | ||
45 | - int server_fd, client_fd; | ||
46 | unsigned int delta_ms; | ||
47 | |||
48 | + skel = mptcp_bpf_bytes__open_and_load(); | ||
49 | + if (!ASSERT_OK_PTR(skel, "open_and_load: bytes")) | ||
50 | + return; | ||
51 | + | ||
52 | + skel->bss->pid = getpid(); | ||
53 | + | ||
54 | + err = mptcp_bpf_bytes__attach(skel); | ||
55 | + if (!ASSERT_OK(err, "skel_attach: bytes")) | ||
56 | + goto skel_destroy; | ||
57 | + | ||
58 | server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0); | ||
59 | if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) | ||
60 | - return; | ||
61 | + goto skel_destroy; | ||
62 | |||
63 | client_fd = connect_to_fd(server_fd, 0); | ||
64 | if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) | ||
65 | - goto fail; | ||
66 | + goto close_server; | ||
67 | |||
68 | if (clock_gettime(CLOCK_MONOTONIC, &start) < 0) | ||
69 | - goto fail; | ||
70 | + goto close_client; | ||
71 | |||
72 | if (!ASSERT_OK(send_recv_data(server_fd, client_fd, total_bytes), | ||
73 | "send_recv_data")) | ||
74 | - goto fail; | ||
75 | + goto close_client; | ||
76 | |||
77 | if (clock_gettime(CLOCK_MONOTONIC, &end) < 0) | ||
78 | - goto fail; | ||
79 | + goto close_client; | ||
80 | |||
81 | delta_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000; | ||
82 | printf("%s: %u ms\n", sched, delta_ms); | ||
83 | |||
84 | if (addr1) | ||
85 | - CHECK(has_bytes_sent(ADDR_1), sched, "should have bytes_sent on addr1\n"); | ||
86 | + ASSERT_GT(skel->bss->bytes_sent_1, 0, "should have bytes_sent on addr1"); | ||
87 | else | ||
88 | - CHECK(!has_bytes_sent(ADDR_1), sched, "shouldn't have bytes_sent on addr1\n"); | ||
89 | + ASSERT_EQ(skel->bss->bytes_sent_1, 0, "shouldn't have bytes_sent on addr1"); | ||
90 | if (addr2) | ||
91 | - CHECK(has_bytes_sent(ADDR_2), sched, "should have bytes_sent on addr2\n"); | ||
92 | + ASSERT_GT(skel->bss->bytes_sent_2, 0, "should have bytes_sent on addr2"); | ||
93 | else | ||
94 | - CHECK(!has_bytes_sent(ADDR_2), sched, "shouldn't have bytes_sent on addr2\n"); | ||
95 | + ASSERT_EQ(skel->bss->bytes_sent_2, 0, "shouldn't have bytes_sent on addr2"); | ||
96 | |||
97 | +close_client: | ||
98 | close(client_fd); | ||
99 | -fail: | ||
100 | +close_server: | ||
101 | close(server_fd); | ||
102 | +skel_destroy: | ||
103 | + mptcp_bpf_bytes__destroy(skel); | ||
104 | } | ||
105 | |||
106 | static void test_default(void) | ||
107 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c | ||
108 | new file mode 100644 | ||
109 | index XXXXXXX..XXXXXXX | ||
110 | --- /dev/null | ||
111 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c | ||
112 | @@ -XXX,XX +XXX,XX @@ | ||
113 | +// SPDX-License-Identifier: GPL-2.0 | ||
114 | +/* Copyright (c) 2024, Kylin Software */ | ||
115 | + | ||
116 | +/* vmlinux.h, bpf_helpers.h and other 'define' */ | ||
117 | +#include "bpf_tracing_net.h" | ||
118 | +#include "mptcp_bpf.h" | ||
119 | + | ||
120 | +char _license[] SEC("license") = "GPL"; | ||
121 | +u64 bytes_sent_1 = 0; | ||
122 | +u64 bytes_sent_2 = 0; | ||
123 | +int pid; | ||
124 | + | ||
125 | +SEC("fexit/mptcp_sched_get_send") | ||
126 | +int BPF_PROG(trace_mptcp_sched_get_send, struct mptcp_sock *msk) | ||
127 | +{ | ||
128 | + struct mptcp_subflow_context *subflow; | ||
129 | + | ||
130 | + if (bpf_get_current_pid_tgid() >> 32 != pid) | ||
131 | + return 0; | ||
132 | + | ||
133 | + if (!msk->pm.server_side) | ||
134 | + return 0; | ||
135 | + | ||
136 | + mptcp_for_each_subflow(msk, subflow) { | ||
137 | + struct tcp_sock *tp; | ||
138 | + struct sock *ssk; | ||
139 | + | ||
140 | + subflow = bpf_core_cast(subflow, struct mptcp_subflow_context); | ||
141 | + ssk = mptcp_subflow_tcp_sock(subflow); | ||
142 | + tp = bpf_core_cast(ssk, struct tcp_sock); | ||
143 | + | ||
144 | + if (subflow->subflow_id == 1) | ||
145 | + bytes_sent_1 = tp->bytes_sent; | ||
146 | + else if (subflow->subflow_id == 2) | ||
147 | + bytes_sent_2 = tp->bytes_sent; | ||
148 | + } | ||
149 | + | ||
150 | + return 0; | ||
151 | +} | ||
152 | -- | ||
153 | 2.43.0 | diff view generated by jsdifflib |