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. | ||
2 | 19 | ||
3 | v11: | 20 | v11: |
4 | If another squash-to patchset (Squash to "Add mptcp_subflow bpf_iter | 21 | If another squash-to patchset (Squash to "Add mptcp_subflow bpf_iter |
5 | support") under review is merged before this set, v10 will fail to run. | 22 | support") under review is merged before this set, v10 will fail to run. |
6 | v11 fixes this issue and can run regardless of whether it is merged | 23 | v11 fixes this issue and can run regardless of whether it is merged |
... | ... | ||
53 | 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 |
54 | subflows array "contexts" in struct mptcp_sched_data. This set | 71 | subflows array "contexts" in struct mptcp_sched_data. This set |
55 | 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 |
56 | schedules: | 73 | schedules: |
57 | 74 | ||
58 | bpf_for_each(mptcp_subflow, subflow, msk) { | 75 | bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
59 | ... ... | 76 | ... ... |
60 | mptcp_subflow_set_scheduled(subflow, true); | 77 | mptcp_subflow_set_scheduled(subflow, true); |
61 | } | 78 | } |
62 | 79 | ||
63 | Geliang Tang (9): | 80 | Geliang Tang (9): |
64 | bpf: Add bpf_mptcp_send_info_to_ssk | 81 | Squash to "bpf: Register mptcp common kfunc set" |
82 | Revert "mptcp: add sched_data helpers" | ||
83 | Squash to "bpf: Export mptcp packet scheduler helpers" | ||
84 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | ||
65 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" | 85 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" |
66 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" | 86 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" |
67 | Squash to "selftests/bpf: Add bpf_red scheduler & test" | 87 | Squash to "selftests/bpf: Add bpf_red scheduler & test" |
68 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 88 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
69 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | ||
70 | Revert "mptcp: add sched_data helpers" | ||
71 | Squash to "bpf: Export mptcp packet scheduler helpers" | ||
72 | mptcp: drop subflow contexts in mptcp_sched_data | 89 | mptcp: drop subflow contexts in mptcp_sched_data |
73 | 90 | ||
74 | include/net/mptcp.h | 2 - | 91 | include/net/mptcp.h | 3 - |
75 | include/uapi/linux/bpf.h | 7 +++ | 92 | net/mptcp/bpf.c | 52 +++++++------ |
76 | net/mptcp/bpf.c | 47 ++++++++-------- | 93 | net/mptcp/protocol.h | 2 - |
77 | net/mptcp/protocol.c | 5 -- | 94 | net/mptcp/sched.c | 22 ------ |
78 | net/mptcp/protocol.h | 7 ++- | 95 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - |
79 | net/mptcp/sched.c | 22 -------- | 96 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +--- |
80 | tools/include/uapi/linux/bpf.h | 7 +++ | 97 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
81 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 -- | 98 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +- |
82 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 ++---- | 99 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 +- |
83 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 54 ++++++++----------- | 100 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 ++++---- |
84 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 ++- | 101 | 10 files changed, 80 insertions(+), 143 deletions(-) |
85 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 ++- | ||
86 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++------ | ||
87 | 13 files changed, 93 insertions(+), 124 deletions(-) | ||
88 | 102 | ||
89 | -- | 103 | -- |
90 | 2.45.2 | 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 | Burst scheduler needs to allocate an array of struct subflow_send_info | 3 | Instead of adding a new BPF function bpf_mptcp_send_info_to_ssk() in |
4 | on the stack and then select a subflow to send data. In order to implement | 4 | v12, this patch uses a much more simpler approach, which using '__ign' |
5 | burst scheduler in BPF, this patch adds a new bpf_mptcp_send_info_to_ssk() | 5 | suffix for the argument of bpf_mptcp_subflow_ctx() to let BPF to |
6 | helper to get ssk from subflow_send_info and sets its parameter type as | 6 | ignore the type check of this argument. |
7 | ARG_PTR_TO_STACK. | ||
8 | 7 | ||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
10 | --- | 9 | --- |
11 | include/uapi/linux/bpf.h | 7 +++++++ | 10 | net/mptcp/bpf.c | 8 ++++---- |
12 | net/mptcp/bpf.c | 22 ++++++++++++++++++++++ | 11 | 1 file changed, 4 insertions(+), 4 deletions(-) |
13 | net/mptcp/protocol.c | 5 ----- | ||
14 | net/mptcp/protocol.h | 5 +++++ | ||
15 | tools/include/uapi/linux/bpf.h | 7 +++++++ | ||
16 | 5 files changed, 41 insertions(+), 5 deletions(-) | ||
17 | 12 | ||
18 | diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h | ||
19 | index XXXXXXX..XXXXXXX 100644 | ||
20 | --- a/include/uapi/linux/bpf.h | ||
21 | +++ b/include/uapi/linux/bpf.h | ||
22 | @@ -XXX,XX +XXX,XX @@ union bpf_attr { | ||
23 | * 0 on success. | ||
24 | * | ||
25 | * **-ENOENT** if the bpf_local_storage cannot be found. | ||
26 | + * | ||
27 | + * void *bpf_mptcp_send_info_to_ssk(void *info) | ||
28 | + * Description | ||
29 | + * Dynamically cast a *info* pointer to a *sock* pointer. | ||
30 | + * Return | ||
31 | + * *info* if casting is valid, or **NULL** otherwise. | ||
32 | */ | ||
33 | #define ___BPF_FUNC_MAPPER(FN, ctx...) \ | ||
34 | FN(unspec, 0, ##ctx) \ | ||
35 | @@ -XXX,XX +XXX,XX @@ union bpf_attr { | ||
36 | FN(user_ringbuf_drain, 209, ##ctx) \ | ||
37 | FN(cgrp_storage_get, 210, ##ctx) \ | ||
38 | FN(cgrp_storage_delete, 211, ##ctx) \ | ||
39 | + FN(mptcp_send_info_to_ssk, 212, ##ctx) \ | ||
40 | /* */ | ||
41 | |||
42 | /* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't | ||
43 | 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 |
44 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
45 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
46 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
47 | @@ -XXX,XX +XXX,XX @@ static struct bpf_struct_ops bpf_mptcp_sched_ops; | 17 | @@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern { |
48 | static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly; | 18 | __bpf_kfunc_start_defs(); |
49 | static u32 mptcp_sock_id, mptcp_subflow_id; | 19 | |
50 | 20 | __bpf_kfunc static struct mptcp_subflow_context * | |
51 | +BPF_CALL_1(bpf_mptcp_send_info_to_ssk, struct subflow_send_info *, info) | 21 | -bpf_mptcp_subflow_ctx(const struct sock *sk) |
52 | +{ | 22 | +bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
53 | + BTF_TYPE_EMIT(struct sock); | ||
54 | + | ||
55 | + if (info && info->ssk && sk_fullsock(info->ssk) && | ||
56 | + info->ssk->sk_protocol == IPPROTO_TCP && | ||
57 | + sk_is_mptcp(info->ssk)) | ||
58 | + return (unsigned long)info->ssk; | ||
59 | + | ||
60 | + return (unsigned long)NULL; | ||
61 | +} | ||
62 | + | ||
63 | +static const struct bpf_func_proto bpf_mptcp_send_info_to_ssk_proto = { | ||
64 | + .func = bpf_mptcp_send_info_to_ssk, | ||
65 | + .gpl_only = false, | ||
66 | + .ret_type = RET_PTR_TO_BTF_ID_OR_NULL, | ||
67 | + .arg1_type = ARG_PTR_TO_STACK, | ||
68 | + .ret_btf_id = &btf_sock_ids[BTF_SOCK_TYPE_SOCK], | ||
69 | +}; | ||
70 | + | ||
71 | static const struct bpf_func_proto * | ||
72 | bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id, | ||
73 | const struct bpf_prog *prog) | ||
74 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id, | ||
75 | return &bpf_skc_to_tcp6_sock_proto; | ||
76 | case BPF_FUNC_skc_to_tcp_sock: | ||
77 | return &bpf_skc_to_tcp_sock_proto; | ||
78 | + case BPF_FUNC_mptcp_send_info_to_ssk: | ||
79 | + return &bpf_mptcp_send_info_to_ssk_proto; | ||
80 | default: | ||
81 | return bpf_base_func_proto(func_id, prog); | ||
82 | } | ||
83 | diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c | ||
84 | index XXXXXXX..XXXXXXX 100644 | ||
85 | --- a/net/mptcp/protocol.c | ||
86 | +++ b/net/mptcp/protocol.c | ||
87 | @@ -XXX,XX +XXX,XX @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, | ||
88 | sizeof(struct ipv6hdr) - \ | ||
89 | sizeof(struct frag_hdr)) | ||
90 | |||
91 | -struct subflow_send_info { | ||
92 | - struct sock *ssk; | ||
93 | - u64 linger_time; | ||
94 | -}; | ||
95 | - | ||
96 | void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow) | ||
97 | { | 23 | { |
98 | if (!subflow->stale) | 24 | - if (sk && sk_fullsock(sk) && |
99 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | 25 | - sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) |
100 | index XXXXXXX..XXXXXXX 100644 | 26 | - return mptcp_subflow_ctx(sk); |
101 | --- a/net/mptcp/protocol.h | 27 | + if (sk__ign && sk_fullsock(sk__ign) && |
102 | +++ b/net/mptcp/protocol.h | 28 | + sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign)) |
103 | @@ -XXX,XX +XXX,XX @@ mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow) | 29 | + return mptcp_subflow_ctx(sk__ign); |
104 | WRITE_ONCE(subflow->local_id, -1); | 30 | |
31 | return NULL; | ||
105 | } | 32 | } |
106 | |||
107 | +struct subflow_send_info { | ||
108 | + struct sock *ssk; | ||
109 | + u64 linger_time; | ||
110 | +}; | ||
111 | + | ||
112 | /* Convert reset reasons in MPTCP to enum sk_rst_reason type */ | ||
113 | static inline enum sk_rst_reason | ||
114 | sk_rst_convert_mptcp_reason(u32 reason) | ||
115 | diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h | ||
116 | index XXXXXXX..XXXXXXX 100644 | ||
117 | --- a/tools/include/uapi/linux/bpf.h | ||
118 | +++ b/tools/include/uapi/linux/bpf.h | ||
119 | @@ -XXX,XX +XXX,XX @@ union bpf_attr { | ||
120 | * 0 on success. | ||
121 | * | ||
122 | * **-ENOENT** if the bpf_local_storage cannot be found. | ||
123 | + * | ||
124 | + * void *bpf_mptcp_send_info_to_ssk(void *info) | ||
125 | + * Description | ||
126 | + * Dynamically cast a *info* pointer to a *sock* pointer. | ||
127 | + * Return | ||
128 | + * *info* if casting is valid, or **NULL** otherwise. | ||
129 | */ | ||
130 | #define ___BPF_FUNC_MAPPER(FN, ctx...) \ | ||
131 | FN(unspec, 0, ##ctx) \ | ||
132 | @@ -XXX,XX +XXX,XX @@ union bpf_attr { | ||
133 | FN(user_ringbuf_drain, 209, ##ctx) \ | ||
134 | FN(cgrp_storage_get, 210, ##ctx) \ | ||
135 | FN(cgrp_storage_delete, 211, ##ctx) \ | ||
136 | + FN(mptcp_send_info_to_ssk, 212, ##ctx) \ | ||
137 | /* */ | ||
138 | |||
139 | /* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't | ||
140 | -- | 33 | -- |
141 | 2.45.2 | 34 | 2.43.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
12 | 12 | ||
13 | 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 |
14 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
15 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
16 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
17 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc static 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 | WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); | 18 | { |
19 | } | 19 | } |
20 | 20 | ||
21 | -__bpf_kfunc struct mptcp_subflow_context * | 21 | -__bpf_kfunc struct mptcp_subflow_context * |
22 | -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) |
23 | -{ | 23 | -{ |
... | ... | ||
72 | - | 72 | - |
73 | int mptcp_sched_get_send(struct mptcp_sock *msk) | 73 | int mptcp_sched_get_send(struct mptcp_sock *msk) |
74 | { | 74 | { |
75 | struct mptcp_subflow_context *subflow; | 75 | struct mptcp_subflow_context *subflow; |
76 | @@ -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) |
77 | data.reinject = false; | 77 | |
78 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 78 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
79 | return mptcp_sched_default_get_subflow(msk, &data); | 79 | return mptcp_sched_default_get_send(msk, &data); |
80 | - mptcp_sched_data_set_contexts(msk, &data); | 80 | - mptcp_sched_data_set_contexts(msk, &data); |
81 | return msk->sched->get_subflow(msk, &data); | 81 | return msk->sched->get_send(msk, &data); |
82 | } | 82 | } |
83 | 83 | ||
84 | @@ -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) |
85 | data.reinject = true; | ||
86 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 85 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
87 | return mptcp_sched_default_get_subflow(msk, &data); | 86 | return mptcp_sched_default_get_retrans(msk, &data); |
87 | |||
88 | - mptcp_sched_data_set_contexts(msk, &data); | 88 | - mptcp_sched_data_set_contexts(msk, &data); |
89 | return msk->sched->get_subflow(msk, &data); | 89 | if (msk->sched->get_retrans) |
90 | } | 90 | return msk->sched->get_retrans(msk, &data); |
91 | return msk->sched->get_send(msk, &data); | ||
91 | -- | 92 | -- |
92 | 2.45.2 | 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 | Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set. | 3 | Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set. |
4 | Drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead. | 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(). | ||
5 | 7 | ||
6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
7 | --- | 9 | --- |
8 | net/mptcp/bpf.c | 17 ++++------------- | 10 | net/mptcp/bpf.c | 38 ++++++++++++++++++++++++-------------- |
9 | 1 file changed, 4 insertions(+), 13 deletions(-) | 11 | 1 file changed, 24 insertions(+), 14 deletions(-) |
10 | 12 | ||
11 | 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 |
12 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/net/mptcp/bpf.c | 15 | --- a/net/mptcp/bpf.c |
14 | +++ b/net/mptcp/bpf.c | 16 | +++ b/net/mptcp/bpf.c |
15 | @@ -XXX,XX +XXX,XX @@ BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) | 17 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
18 | return NULL; | ||
19 | } | ||
20 | |||
21 | +__bpf_kfunc static struct sock * | ||
22 | +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | ||
23 | +{ | ||
24 | + if (!subflow) | ||
25 | + return NULL; | ||
26 | + | ||
27 | + return mptcp_subflow_tcp_sock(subflow); | ||
28 | +} | ||
29 | + | ||
30 | __bpf_kfunc static int | ||
31 | bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it, | ||
32 | struct sock *sk) | ||
33 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | ||
34 | return tcp_rtx_queue_empty(sk); | ||
35 | } | ||
36 | |||
37 | +__bpf_kfunc static bool bpf_sk_stream_memory_free(const struct sock *sk__ign) | ||
38 | +{ | ||
39 | + if (sk__ign && sk_fullsock(sk__ign) && | ||
40 | + sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign)) | ||
41 | + return sk_stream_memory_free(sk__ign); | ||
42 | + | ||
43 | + return NULL; | ||
44 | +} | ||
45 | + | ||
46 | __bpf_kfunc_end_defs(); | ||
47 | |||
48 | BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) | ||
49 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL) | ||
50 | +BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock, KF_RET_NULL) | ||
51 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS) | ||
52 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) | ||
16 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) | 53 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) |
17 | BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL) | ||
18 | BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE) | ||
19 | -BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | 54 | -BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) |
20 | - | 55 | - |
21 | -static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | 56 | -static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { |
22 | - .owner = THIS_MODULE, | 57 | - .owner = THIS_MODULE, |
23 | - .set = &bpf_mptcp_common_kfunc_ids, | 58 | - .set = &bpf_mptcp_common_kfunc_ids, |
... | ... | ||
27 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) | 62 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) |
28 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) | 63 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) |
29 | BTF_ID_FLAGS(func, mptcp_subflow_active) | 64 | BTF_ID_FLAGS(func, mptcp_subflow_active) |
30 | BTF_ID_FLAGS(func, mptcp_set_timeout) | 65 | BTF_ID_FLAGS(func, mptcp_set_timeout) |
31 | BTF_ID_FLAGS(func, mptcp_wnd_end) | 66 | BTF_ID_FLAGS(func, mptcp_wnd_end) |
32 | 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) | ||
33 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) | 69 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) |
34 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale) | 70 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) |
35 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | 71 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) |
36 | +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | 72 | +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) |
37 | 73 | ||
38 | -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 = { |
39 | +static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | 75 | +static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { |
... | ... | ||
42 | + .set = &bpf_mptcp_common_kfunc_ids, | 78 | + .set = &bpf_mptcp_common_kfunc_ids, |
43 | }; | 79 | }; |
44 | 80 | ||
45 | static int __init bpf_mptcp_kfunc_init(void) | 81 | static int __init bpf_mptcp_kfunc_init(void) |
46 | @@ -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) |
47 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, | 83 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT, |
48 | &bpf_mptcp_common_kfunc_set); | 84 | &bpf_mptcp_common_kfunc_set); |
49 | 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, |
50 | - &bpf_mptcp_sched_kfunc_set); | 86 | - &bpf_mptcp_sched_kfunc_set); |
51 | + &bpf_mptcp_common_kfunc_set); | 87 | + &bpf_mptcp_common_kfunc_set); |
52 | #ifdef CONFIG_BPF_JIT | 88 | #ifdef CONFIG_BPF_JIT |
53 | 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); |
54 | #endif | 90 | #endif |
55 | -- | 91 | -- |
56 | 2.45.2 | 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 | |||
5 | Drop bpf_mptcp_subflow_ctx_by_pos declaration. | 4 | Drop bpf_mptcp_subflow_ctx_by_pos declaration. |
6 | 5 | ||
7 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
8 | --- | 7 | --- |
9 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --- | 8 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --- |
... | ... | ||
25 | 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 |
26 | index XXXXXXX..XXXXXXX 100644 | 25 | index XXXXXXX..XXXXXXX 100644 |
27 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 26 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
28 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 27 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
29 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") | 28 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
30 | int BPF_PROG(bpf_first_get_subflow, struct mptcp_sock *msk, | 29 | int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk, |
31 | struct mptcp_sched_data *data) | 30 | struct mptcp_sched_data *data) |
32 | { | 31 | { |
33 | - 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); |
34 | + struct mptcp_subflow_context *subflow; | 33 | + struct mptcp_subflow_context *subflow; |
35 | + | 34 | + |
... | ... | ||
40 | + mptcp_subflow_set_scheduled(subflow, true); | 39 | + mptcp_subflow_set_scheduled(subflow, true); |
41 | return 0; | 40 | return 0; |
42 | } | 41 | } |
43 | 42 | ||
44 | -- | 43 | -- |
45 | 2.45.2 | 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; |
... | ... | ||
40 | - } | 40 | - } |
41 | return 0; | 41 | return 0; |
42 | } | 42 | } |
43 | 43 | ||
44 | -- | 44 | -- |
45 | 2.45.2 | 45 | 2.43.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
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; |
... | ... | ||
39 | + goto out; | 39 | + goto out; |
40 | 40 | ||
41 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { | 41 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { |
42 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || | 42 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || |
43 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) | 43 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) |
44 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 44 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
45 | + if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) { | 45 | + if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) { |
46 | + subflow = bpf_iter_mptcp_subflow_next(&___it); | 46 | + subflow = bpf_iter_mptcp_subflow_next(&___it); |
47 | + if (!subflow) | 47 | + if (!subflow) |
48 | break; | 48 | break; |
49 | 49 | ||
... | ... | ||
63 | + ptr->last_snd = mptcp_subflow_tcp_sock(next); | 63 | + ptr->last_snd = mptcp_subflow_tcp_sock(next); |
64 | return 0; | 64 | return 0; |
65 | } | 65 | } |
66 | 66 | ||
67 | -- | 67 | -- |
68 | 2.45.2 | 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.45.2 | 31 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | |||
5 | Use bpf_mptcp_send_info_to_ssk() helper. | ||
6 | |||
7 | Drop bpf_subflow_send_info, use subflow_send_info instead. | 4 | Drop bpf_subflow_send_info, use subflow_send_info instead. |
8 | 5 | ||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
10 | --- | 7 | --- |
11 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 54 ++++++++----------- | 8 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
12 | 1 file changed, 21 insertions(+), 33 deletions(-) | 9 | 1 file changed, 26 insertions(+), 52 deletions(-) |
13 | 10 | ||
14 | 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 |
15 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 13 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
17 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 14 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
... | ... | ||
25 | -}; | 22 | -}; |
26 | - | 23 | - |
27 | extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym; | 24 | extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym; |
28 | extern void mptcp_set_timeout(struct sock *sk) __ksym; | 25 | extern void mptcp_set_timeout(struct sock *sk) __ksym; |
29 | extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym; | 26 | extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym; |
30 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk) | 27 | -extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym; |
31 | static int bpf_burst_get_send(struct mptcp_sock *msk, | 28 | +extern bool bpf_sk_stream_memory_free(const struct sock *sk) __ksym; |
32 | struct mptcp_sched_data *data) | 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) | ||
51 | { | ||
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) | ||
33 | { | 55 | { |
34 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; | 56 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; |
35 | + struct subflow_send_info send_info[SSK_MODE_MAX]; | 57 | + struct subflow_send_info send_info[SSK_MODE_MAX]; |
36 | struct mptcp_subflow_context *subflow; | 58 | struct mptcp_subflow_context *subflow; |
37 | struct sock *sk = (struct sock *)msk; | 59 | struct sock *sk = (struct sock *)msk; |
38 | __u32 pace, burst, wmem; | 60 | __u32 pace, burst, wmem; |
39 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 61 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, |
40 | 62 | ||
41 | /* pick the subflow with the lower wmem/wspace ratio */ | 63 | /* pick the subflow with the lower wmem/wspace ratio */ |
42 | for (i = 0; i < SSK_MODE_MAX; ++i) { | 64 | for (i = 0; i < SSK_MODE_MAX; ++i) { |
43 | - send_info[i].subflow_id = MPTCP_SUBFLOWS_MAX; | 65 | - send_info[i].subflow_id = MPTCP_SUBFLOWS_MAX; |
44 | + send_info[i].ssk = NULL; | 66 | + send_info[i].ssk = NULL; |
45 | send_info[i].linger_time = -1; | 67 | send_info[i].linger_time = -1; |
46 | } | 68 | } |
47 | 69 | ||
48 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 70 | - for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
49 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 71 | - bool backup; |
50 | bool backup; | 72 | - |
51 | |||
52 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 73 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
53 | - if (!subflow) | 74 | - if (!subflow) |
54 | - break; | 75 | - break; |
55 | - | 76 | - |
56 | backup = subflow->backup || subflow->request_bkup; | 77 | - backup = subflow->backup || subflow->request_bkup; |
78 | + bpf_for_each(mptcp_subflow, subflow, sk) { | ||
79 | + bool backup = subflow->backup || subflow->request_bkup; | ||
57 | 80 | ||
58 | ssk = mptcp_subflow_tcp_sock(subflow); | 81 | ssk = mptcp_subflow_tcp_sock(subflow); |
59 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 82 | if (!mptcp_subflow_active(subflow)) |
83 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | ||
60 | 84 | ||
61 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); | 85 | linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace); |
62 | if (linger_time < send_info[backup].linger_time) { | 86 | if (linger_time < send_info[backup].linger_time) { |
63 | - send_info[backup].subflow_id = i; | 87 | - send_info[backup].subflow_id = i; |
64 | + send_info[backup].ssk = ssk; | 88 | + send_info[backup].ssk = ssk; |
65 | send_info[backup].linger_time = linger_time; | 89 | send_info[backup].linger_time = linger_time; |
66 | } | 90 | } |
67 | } | 91 | } |
68 | @@ -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, |
69 | 93 | ||
70 | /* pick the best backup if no other subflow is active */ | 94 | /* pick the best backup if no other subflow is active */ |
71 | if (!nr_active) | 95 | if (!nr_active) |
72 | - 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; |
73 | + send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk; | 97 | + send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk; |
74 | 98 | ||
75 | - 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); |
76 | - if (!subflow) | 100 | - if (!subflow) |
77 | - return -1; | 101 | + ssk = send_info[SSK_MODE_ACTIVE].ssk; |
102 | + if (!ssk || !bpf_sk_stream_memory_free(ssk)) | ||
103 | return -1; | ||
78 | - ssk = mptcp_subflow_tcp_sock(subflow); | 104 | - ssk = mptcp_subflow_tcp_sock(subflow); |
79 | + ssk = bpf_mptcp_send_info_to_ssk(&send_info[SSK_MODE_ACTIVE]); | 105 | - if (!ssk || !sk_stream_memory_free(ssk)) |
80 | if (!ssk || !sk_stream_memory_free(ssk)) | 106 | + |
81 | return -1; | ||
82 | |||
83 | + subflow = bpf_mptcp_subflow_ctx(ssk); | 107 | + subflow = bpf_mptcp_subflow_ctx(ssk); |
84 | + if (!subflow) | 108 | + if (!subflow) |
85 | + return -1; | 109 | return -1; |
86 | + | 110 | |
87 | burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); | 111 | burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); |
112 | + ssk = bpf_core_cast(ssk, struct sock); | ||
88 | wmem = ssk->sk_wmem_queued; | 113 | wmem = ssk->sk_wmem_queued; |
89 | if (!burst) | 114 | if (!burst) |
90 | @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, | 115 | goto out; |
91 | static int bpf_burst_get_retrans(struct mptcp_sock *msk, | 116 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
92 | struct mptcp_sched_data *data) | 117 | int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, |
118 | struct mptcp_sched_data *data) | ||
93 | { | 119 | { |
94 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; | 120 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; |
95 | + struct sock *backup = NULL, *pick = NULL; | 121 | + struct sock *backup = NULL, *pick = NULL; |
96 | struct mptcp_subflow_context *subflow; | 122 | struct mptcp_subflow_context *subflow; |
97 | int min_stale_count = INT_MAX; | 123 | int min_stale_count = INT_MAX; |
98 | struct sock *ssk; | 124 | - struct sock *ssk; |
99 | 125 | ||
100 | - 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++) { |
101 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 127 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
102 | - if (!subflow) | 128 | - if (!subflow) |
103 | - break; | 129 | - break; |
104 | - | 130 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
105 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 131 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); |
106 | if (!mptcp_subflow_active(subflow)) | 132 | |
133 | - if (!mptcp_subflow_active(subflow)) | ||
134 | + if (!ssk || !mptcp_subflow_active(subflow)) | ||
107 | continue; | 135 | continue; |
108 | 136 | ||
109 | @@ -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, | ||
110 | } | 142 | } |
111 | 143 | ||
112 | if (subflow->backup || subflow->request_bkup) { | 144 | if (subflow->backup || subflow->request_bkup) { |
113 | - if (backup == MPTCP_SUBFLOWS_MAX) | 145 | - if (backup == MPTCP_SUBFLOWS_MAX) |
114 | - backup = i; | 146 | - backup = i; |
... | ... | ||
138 | + subflow = bpf_mptcp_subflow_ctx(pick); | 170 | + subflow = bpf_mptcp_subflow_ctx(pick); |
139 | if (!subflow) | 171 | if (!subflow) |
140 | return -1; | 172 | return -1; |
141 | mptcp_subflow_set_scheduled(subflow, true); | 173 | mptcp_subflow_set_scheduled(subflow, true); |
142 | -- | 174 | -- |
143 | 2.45.2 | 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.45.2 | 32 | 2.43.0 | diff view generated by jsdifflib |