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> | ||
2 | 15 | ||
3 | v12: | 16 | v12: |
4 | - drop struct mptcp_sched_data. | 17 | - drop struct mptcp_sched_data. |
5 | - rebased on "split get_subflow interface into two" v2. | 18 | - rebased on "split get_subflow interface into two" v2. |
6 | |||
7 | Based-on: <cover.1734942318.git.tanggeliang@kylinos.cn> | ||
8 | 19 | ||
9 | v11: | 20 | v11: |
10 | 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 |
11 | 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. |
12 | 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 |
... | ... | ||
59 | 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 |
60 | subflows array "contexts" in struct mptcp_sched_data. This set | 71 | subflows array "contexts" in struct mptcp_sched_data. This set |
61 | 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 |
62 | schedules: | 73 | schedules: |
63 | 74 | ||
64 | bpf_for_each(mptcp_subflow, subflow, msk) { | 75 | bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
65 | ... ... | 76 | ... ... |
66 | mptcp_subflow_set_scheduled(subflow, true); | 77 | mptcp_subflow_set_scheduled(subflow, true); |
67 | } | 78 | } |
68 | 79 | ||
69 | Geliang Tang (10): | 80 | Geliang Tang (9): |
70 | bpf: Add bpf_mptcp_send_info_to_ssk | 81 | Squash to "bpf: Register mptcp common kfunc set" |
71 | Revert "mptcp: add sched_data helpers" | 82 | Revert "mptcp: add sched_data helpers" |
72 | mptcp: drop struct mptcp_sched_data | ||
73 | Squash to "bpf: Add bpf_mptcp_sched_ops" | ||
74 | Squash to "bpf: Export mptcp packet scheduler helpers" | 83 | Squash to "bpf: Export mptcp packet scheduler helpers" |
75 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | 84 | Squash to "selftests/bpf: Add bpf_first scheduler & test" |
76 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" | 85 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" |
77 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" | 86 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" |
78 | Squash to "selftests/bpf: Add bpf_red scheduler & test" | 87 | Squash to "selftests/bpf: Add bpf_red scheduler & test" |
79 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 88 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
89 | mptcp: drop subflow contexts in mptcp_sched_data | ||
80 | 90 | ||
81 | include/net/mptcp.h | 13 +--- | 91 | include/net/mptcp.h | 3 - |
82 | include/uapi/linux/bpf.h | 7 ++ | 92 | net/mptcp/bpf.c | 52 +++++++------ |
83 | net/mptcp/bpf.c | 55 +++++++++------ | 93 | net/mptcp/protocol.h | 2 - |
84 | net/mptcp/protocol.c | 5 -- | 94 | net/mptcp/sched.c | 22 ------ |
85 | net/mptcp/protocol.h | 7 +- | ||
86 | net/mptcp/sched.c | 40 ++--------- | ||
87 | tools/include/uapi/linux/bpf.h | 7 ++ | ||
88 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - | 95 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 - |
89 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 19 ++---- | 96 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +--- |
90 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 68 +++++++------------ | 97 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
91 | .../selftests/bpf/progs/mptcp_bpf_first.c | 11 ++- | 98 | .../selftests/bpf/progs/mptcp_bpf_first.c | 8 +- |
92 | .../selftests/bpf/progs/mptcp_bpf_red.c | 11 ++- | 99 | .../selftests/bpf/progs/mptcp_bpf_red.c | 8 +- |
93 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 34 ++++------ | 100 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 ++++---- |
94 | 13 files changed, 119 insertions(+), 161 deletions(-) | 101 | 10 files changed, 80 insertions(+), 143 deletions(-) |
95 | 102 | ||
96 | -- | 103 | -- |
97 | 2.45.2 | 104 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
2 | 1 | ||
3 | Burst scheduler needs to allocate an array of struct subflow_send_info | ||
4 | on the stack and then select a subflow to send data. In order to implement | ||
5 | burst scheduler in BPF, this patch adds a new bpf_mptcp_send_info_to_ssk() | ||
6 | helper to get ssk from subflow_send_info and sets its parameter type as | ||
7 | ARG_PTR_TO_STACK. | ||
8 | |||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
10 | --- | ||
11 | include/uapi/linux/bpf.h | 7 +++++++ | ||
12 | net/mptcp/bpf.c | 22 ++++++++++++++++++++++ | ||
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 | |||
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 | ||
44 | index XXXXXXX..XXXXXXX 100644 | ||
45 | --- a/net/mptcp/bpf.c | ||
46 | +++ b/net/mptcp/bpf.c | ||
47 | @@ -XXX,XX +XXX,XX @@ static struct bpf_struct_ops bpf_mptcp_sched_ops; | ||
48 | static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly; | ||
49 | static u32 mptcp_sock_id, mptcp_subflow_id; | ||
50 | |||
51 | +BPF_CALL_1(bpf_mptcp_send_info_to_ssk, struct subflow_send_info *, info) | ||
52 | +{ | ||
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 | { | ||
98 | if (!subflow->stale) | ||
99 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | ||
100 | index XXXXXXX..XXXXXXX 100644 | ||
101 | --- a/net/mptcp/protocol.h | ||
102 | +++ b/net/mptcp/protocol.h | ||
103 | @@ -XXX,XX +XXX,XX @@ mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow) | ||
104 | WRITE_ONCE(subflow->local_id, -1); | ||
105 | } | ||
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 | -- | ||
141 | 2.45.2 | 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 struct mptcp_sched_data. | ||
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 | 6 ++---- | 10 | net/mptcp/bpf.c | 8 ++++---- |
12 | 1 file changed, 2 insertions(+), 4 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 @@ static int bpf_mptcp_sched_init(struct btf *btf) | 17 | @@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern { |
19 | return 0; | 18 | __bpf_kfunc_start_defs(); |
20 | } | 19 | |
21 | 20 | __bpf_kfunc static struct mptcp_subflow_context * | |
22 | -static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk, | 21 | -bpf_mptcp_subflow_ctx(const struct sock *sk) |
23 | - struct mptcp_sched_data *data) | 22 | +bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
24 | +static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk) | ||
25 | { | 23 | { |
26 | return 0; | 24 | - if (sk && sk_fullsock(sk) && |
27 | } | 25 | - sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) |
28 | 26 | - return mptcp_subflow_ctx(sk); | |
29 | -static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk, | 27 | + if (sk__ign && sk_fullsock(sk__ign) && |
30 | - struct mptcp_sched_data *data) | 28 | + sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign)) |
31 | +static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk) | 29 | + return mptcp_subflow_ctx(sk__ign); |
32 | { | 30 | |
33 | return 0; | 31 | return NULL; |
34 | } | 32 | } |
35 | -- | 33 | -- |
36 | 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 | -{ |
... | ... | ||
80 | - mptcp_sched_data_set_contexts(msk, &data); | 80 | - mptcp_sched_data_set_contexts(msk, &data); |
81 | return msk->sched->get_send(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 | |||
86 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 85 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
87 | return mptcp_sched_default_get_retrans(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 | if (!msk->sched->get_retrans) | 89 | if (msk->sched->get_retrans) |
90 | return msk->sched->get_send(msk, &data); | 90 | return msk->sched->get_retrans(msk, &data); |
91 | return msk->sched->get_retrans(msk, &data); | 91 | return msk->sched->get_send(msk, &data); |
92 | -- | 92 | -- |
93 | 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 | 27 ++++++++++++++------------- | 10 | net/mptcp/bpf.c | 38 ++++++++++++++++++++++++-------------- |
9 | 1 file changed, 14 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 @@ __bpf_kfunc static void bpf_mptcp_sock_release(struct mptcp_sock *msk) | 17 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign) |
16 | WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); | 18 | return NULL; |
17 | } | 19 | } |
18 | 20 | ||
19 | +__bpf_kfunc static struct sock * | 21 | +__bpf_kfunc static struct sock * |
20 | +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | 22 | +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) |
21 | +{ | 23 | +{ |
22 | + if (!subflow) | 24 | + if (!subflow) |
23 | + return NULL; | 25 | + return NULL; |
24 | + | 26 | + |
25 | + return mptcp_subflow_tcp_sock(subflow); | 27 | + return mptcp_subflow_tcp_sock(subflow); |
26 | +} | 28 | +} |
27 | + | 29 | + |
28 | __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) | 30 | __bpf_kfunc static int |
29 | { | 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) | ||
30 | return tcp_rtx_queue_empty(sk); | 34 | return tcp_rtx_queue_empty(sk); |
31 | @@ -XXX,XX +XXX,XX @@ BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) | 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) | ||
32 | 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) |
33 | BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL) | ||
34 | BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE) | ||
35 | -BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | 54 | -BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) |
36 | - | 55 | - |
37 | -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 = { |
38 | - .owner = THIS_MODULE, | 57 | - .owner = THIS_MODULE, |
39 | - .set = &bpf_mptcp_common_kfunc_ids, | 58 | - .set = &bpf_mptcp_common_kfunc_ids, |
... | ... | ||
43 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) | 62 | BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) |
44 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) | 63 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) |
45 | BTF_ID_FLAGS(func, mptcp_subflow_active) | 64 | BTF_ID_FLAGS(func, mptcp_subflow_active) |
46 | BTF_ID_FLAGS(func, mptcp_set_timeout) | 65 | BTF_ID_FLAGS(func, mptcp_set_timeout) |
47 | BTF_ID_FLAGS(func, mptcp_wnd_end) | 66 | BTF_ID_FLAGS(func, mptcp_wnd_end) |
48 | 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) | ||
49 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) | 69 | BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty) |
50 | +BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock, KF_RET_NULL) | ||
51 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) | 70 | BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) |
52 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | 71 | -BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) |
53 | +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | 72 | +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) |
54 | 73 | ||
55 | -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 = { |
... | ... | ||
68 | + &bpf_mptcp_common_kfunc_set); | 87 | + &bpf_mptcp_common_kfunc_set); |
69 | #ifdef CONFIG_BPF_JIT | 88 | #ifdef CONFIG_BPF_JIT |
70 | 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); |
71 | #endif | 90 | #endif |
72 | -- | 91 | -- |
73 | 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 --- |
10 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 11 ++++++++--- | 9 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++- |
11 | 2 files changed, 8 insertions(+), 6 deletions(-) | 10 | 2 files changed, 7 insertions(+), 4 deletions(-) |
12 | 11 | ||
13 | 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 |
14 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
15 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 14 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
16 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 15 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
... | ... | ||
24 | #endif | 23 | #endif |
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 @@ void BPF_PROG(mptcp_sched_first_release, struct mptcp_sock *msk) | 28 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
30 | } | 29 | int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk, |
31 | 30 | struct mptcp_sched_data *data) | |
32 | SEC("struct_ops") | ||
33 | -int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk, | ||
34 | - struct mptcp_sched_data *data) | ||
35 | +int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk) | ||
36 | { | 31 | { |
37 | - 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); |
38 | + struct mptcp_subflow_context *subflow; | 33 | + struct mptcp_subflow_context *subflow; |
39 | + | 34 | + |
40 | + subflow = bpf_mptcp_subflow_ctx(msk->first); | 35 | + subflow = bpf_mptcp_subflow_ctx(msk->first); |
... | ... | ||
44 | + mptcp_subflow_set_scheduled(subflow, true); | 39 | + mptcp_subflow_set_scheduled(subflow, true); |
45 | return 0; | 40 | return 0; |
46 | } | 41 | } |
47 | 42 | ||
48 | -- | 43 | -- |
49 | 2.45.2 | 44 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | 4 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 6 | --- |
7 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 19 ++++--------------- | 7 | .../testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +++------------- |
8 | 1 file changed, 4 insertions(+), 15 deletions(-) | 8 | 1 file changed, 3 insertions(+), 13 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c |
14 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_bkup_release, struct mptcp_sock *msk) | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | } | 15 | int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk, |
16 | 16 | struct mptcp_sched_data *data) | |
17 | SEC("struct_ops") | ||
18 | -int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk, | ||
19 | - struct mptcp_sched_data *data) | ||
20 | +int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk) | ||
21 | { | 17 | { |
22 | - int nr = -1; | 18 | - int nr = -1; |
23 | - | 19 | - |
24 | - 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++) { |
25 | - struct mptcp_subflow_context *subflow; | 21 | - struct mptcp_subflow_context *subflow; |
26 | - | 22 | - |
27 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 23 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
28 | - if (!subflow) | 24 | - if (!subflow) |
29 | - break; | 25 | - break; |
30 | + struct mptcp_subflow_context *subflow; | 26 | + struct mptcp_subflow_context *subflow; |
31 | 27 | ||
32 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 28 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
33 | if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) || | 29 | if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) || |
34 | !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) { | 30 | !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) { |
35 | - nr = i; | 31 | - nr = i; |
36 | + mptcp_subflow_set_scheduled(subflow, true); | 32 | + mptcp_subflow_set_scheduled(subflow, true); |
37 | break; | 33 | break; |
... | ... | ||
44 | - } | 40 | - } |
45 | return 0; | 41 | return 0; |
46 | } | 42 | } |
47 | 43 | ||
48 | -- | 44 | -- |
49 | 2.45.2 | 45 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | 4 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 6 | --- |
7 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 34 ++++++++----------- | 7 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++++++---------- |
8 | 1 file changed, 15 insertions(+), 19 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 @@ void BPF_PROG(mptcp_sched_rr_release, struct mptcp_sock *msk) | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | } | 15 | int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk, |
16 | 16 | struct mptcp_sched_data *data) | |
17 | SEC("struct_ops") | ||
18 | -int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk, | ||
19 | - struct mptcp_sched_data *data) | ||
20 | +int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk) | ||
21 | { | 17 | { |
22 | - struct mptcp_subflow_context *subflow; | 18 | - struct mptcp_subflow_context *subflow; |
23 | + struct mptcp_subflow_context *subflow, *next; | 19 | + struct mptcp_subflow_context *subflow, *next; |
24 | struct mptcp_rr_storage *ptr; | 20 | struct mptcp_rr_storage *ptr; |
25 | - struct sock *last_snd = NULL; | 21 | - struct sock *last_snd = NULL; |
... | ... | ||
43 | + goto out; | 39 | + goto out; |
44 | 40 | ||
45 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { | 41 | - if (mptcp_subflow_tcp_sock(subflow) == last_snd) { |
46 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || | 42 | - if (i + 1 == MPTCP_SUBFLOWS_MAX || |
47 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) | 43 | - !bpf_mptcp_subflow_ctx_by_pos(data, i + 1)) |
48 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 44 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
49 | + if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) { | 45 | + if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) { |
50 | + subflow = bpf_iter_mptcp_subflow_next(&___it); | 46 | + subflow = bpf_iter_mptcp_subflow_next(&___it); |
51 | + if (!subflow) | 47 | + if (!subflow) |
52 | break; | 48 | break; |
53 | 49 | ||
... | ... | ||
67 | + ptr->last_snd = mptcp_subflow_tcp_sock(next); | 63 | + ptr->last_snd = mptcp_subflow_tcp_sock(next); |
68 | return 0; | 64 | return 0; |
69 | } | 65 | } |
70 | 66 | ||
71 | -- | 67 | -- |
72 | 2.45.2 | 68 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Use the newly added bpf_for_each() helper to walk the conn_list. | 3 | Use the newly added bpf_for_each() helper to walk the conn_list. |
4 | 4 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 6 | --- |
7 | tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 11 ++++------- | 7 | tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 8 +++----- |
8 | 1 file changed, 4 insertions(+), 7 deletions(-) | 8 | 1 file changed, 3 insertions(+), 5 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c |
14 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_red_release, struct mptcp_sock *msk) | 14 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
15 | } | 15 | int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk, |
16 | 16 | struct mptcp_sched_data *data) | |
17 | SEC("struct_ops") | ||
18 | -int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk, | ||
19 | - struct mptcp_sched_data *data) | ||
20 | +int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk) | ||
21 | { | 17 | { |
22 | - 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++) { |
23 | - if (!bpf_mptcp_subflow_ctx_by_pos(data, i)) | 19 | - if (!bpf_mptcp_subflow_ctx_by_pos(data, i)) |
24 | - break; | 20 | - break; |
25 | + struct mptcp_subflow_context *subflow; | 21 | + struct mptcp_subflow_context *subflow; |
26 | 22 | ||
27 | - 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); |
28 | - } | 24 | - } |
29 | + bpf_for_each(mptcp_subflow, subflow, msk) | 25 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) |
30 | + mptcp_subflow_set_scheduled(subflow, true); | 26 | + mptcp_subflow_set_scheduled(subflow, true); |
31 | 27 | ||
32 | return 0; | 28 | return 0; |
33 | } | 29 | } |
34 | -- | 30 | -- |
35 | 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 | 68 +++++++------------ | 8 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------ |
12 | 1 file changed, 26 insertions(+), 42 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; |
28 | +extern bool bpf_sk_stream_memory_free(const struct sock *sk) __ksym; | ||
29 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; | ||
30 | extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym; | ||
31 | |||
32 | @@ -XXX,XX +XXX,XX @@ static __always_inline bool tcp_rtx_and_write_queues_empty(struct sock *sk) | ||
33 | return bpf_mptcp_subflow_queues_empty(sk) && tcp_write_queue_empty(sk); | ||
31 | } | 34 | } |
32 | 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 | - | ||
33 | SEC("struct_ops") | 49 | SEC("struct_ops") |
34 | -int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | 50 | void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk) |
35 | - struct mptcp_sched_data *data) | 51 | { |
36 | +int BPF_PROG(bpf_burst_get_send, 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) | ||
37 | { | 55 | { |
38 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; | 56 | - struct bpf_subflow_send_info send_info[SSK_MODE_MAX]; |
39 | + struct subflow_send_info send_info[SSK_MODE_MAX]; | 57 | + struct subflow_send_info send_info[SSK_MODE_MAX]; |
40 | struct mptcp_subflow_context *subflow; | 58 | struct mptcp_subflow_context *subflow; |
41 | struct sock *sk = (struct sock *)msk; | 59 | struct sock *sk = (struct sock *)msk; |
... | ... | ||
55 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 73 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
56 | - if (!subflow) | 74 | - if (!subflow) |
57 | - break; | 75 | - break; |
58 | - | 76 | - |
59 | - backup = subflow->backup || subflow->request_bkup; | 77 | - backup = subflow->backup || subflow->request_bkup; |
60 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 78 | + bpf_for_each(mptcp_subflow, subflow, sk) { |
61 | + bool backup = subflow->backup || subflow->request_bkup; | 79 | + bool backup = subflow->backup || subflow->request_bkup; |
62 | 80 | ||
63 | ssk = mptcp_subflow_tcp_sock(subflow); | 81 | ssk = mptcp_subflow_tcp_sock(subflow); |
64 | if (!mptcp_subflow_active(subflow)) | 82 | if (!mptcp_subflow_active(subflow)) |
65 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | 83 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, |
... | ... | ||
78 | - 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; |
79 | + 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; |
80 | 98 | ||
81 | - 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); |
82 | - if (!subflow) | 100 | - if (!subflow) |
83 | - return -1; | 101 | + ssk = send_info[SSK_MODE_ACTIVE].ssk; |
102 | + if (!ssk || !bpf_sk_stream_memory_free(ssk)) | ||
103 | return -1; | ||
84 | - ssk = mptcp_subflow_tcp_sock(subflow); | 104 | - ssk = mptcp_subflow_tcp_sock(subflow); |
85 | + ssk = bpf_mptcp_send_info_to_ssk(&send_info[SSK_MODE_ACTIVE]); | 105 | - if (!ssk || !sk_stream_memory_free(ssk)) |
86 | if (!ssk || !sk_stream_memory_free(ssk)) | 106 | + |
87 | return -1; | ||
88 | |||
89 | + subflow = bpf_mptcp_subflow_ctx(ssk); | 107 | + subflow = bpf_mptcp_subflow_ctx(ssk); |
90 | + if (!subflow) | 108 | + if (!subflow) |
91 | + return -1; | 109 | return -1; |
92 | + | 110 | |
93 | 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); | ||
94 | wmem = ssk->sk_wmem_queued; | 113 | wmem = ssk->sk_wmem_queued; |
95 | if (!burst) | 114 | if (!burst) |
96 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk, | 115 | goto out; |
97 | } | 116 | @@ -XXX,XX +XXX,XX @@ SEC("struct_ops") |
98 | 117 | int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, | |
99 | SEC("struct_ops") | 118 | struct mptcp_sched_data *data) |
100 | -int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk, | ||
101 | - struct mptcp_sched_data *data) | ||
102 | +int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk) | ||
103 | { | 119 | { |
104 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; | 120 | - int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id; |
105 | + struct sock *backup = NULL, *pick = NULL; | 121 | + struct sock *backup = NULL, *pick = NULL; |
106 | struct mptcp_subflow_context *subflow; | 122 | struct mptcp_subflow_context *subflow; |
107 | int min_stale_count = INT_MAX; | 123 | int min_stale_count = INT_MAX; |
108 | - struct sock *ssk; | 124 | - struct sock *ssk; |
109 | 125 | ||
110 | - 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++) { |
111 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); | 127 | - subflow = bpf_mptcp_subflow_ctx_by_pos(data, i); |
112 | - if (!subflow) | 128 | - if (!subflow) |
113 | - break; | 129 | - break; |
114 | + bpf_for_each(mptcp_subflow, subflow, msk) { | 130 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { |
115 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); | 131 | + struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow); |
116 | 132 | ||
117 | - if (!mptcp_subflow_active(subflow)) | 133 | - if (!mptcp_subflow_active(subflow)) |
118 | + if (!ssk || !mptcp_subflow_active(subflow)) | 134 | + if (!ssk || !mptcp_subflow_active(subflow)) |
119 | continue; | 135 | continue; |
... | ... | ||
154 | + subflow = bpf_mptcp_subflow_ctx(pick); | 170 | + subflow = bpf_mptcp_subflow_ctx(pick); |
155 | if (!subflow) | 171 | if (!subflow) |
156 | return -1; | 172 | return -1; |
157 | mptcp_subflow_set_scheduled(subflow, true); | 173 | mptcp_subflow_set_scheduled(subflow, true); |
158 | -- | 174 | -- |
159 | 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. Then | 8 | "contexts" in struct mptcp_sched_data. |
9 | the entire struct mptcp_sched_data can be dropped. | ||
10 | 9 | ||
11 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
12 | --- | 11 | --- |
13 | include/net/mptcp.h | 13 ++----------- | 12 | include/net/mptcp.h | 3 --- |
14 | net/mptcp/sched.c | 18 +++++++----------- | 13 | 1 file changed, 3 deletions(-) |
15 | 2 files changed, 9 insertions(+), 22 deletions(-) | ||
16 | 14 | ||
17 | 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 |
18 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
19 | --- a/include/net/mptcp.h | 17 | --- a/include/net/mptcp.h |
20 | +++ b/include/net/mptcp.h | 18 | +++ b/include/net/mptcp.h |
21 | @@ -XXX,XX +XXX,XX @@ struct mptcp_out_options { | 19 | @@ -XXX,XX +XXX,XX @@ struct mptcp_out_options { |
22 | #define MPTCP_SCHED_MAX 128 | 20 | #define MPTCP_SCHED_MAX 128 |
23 | #define MPTCP_SCHED_BUF_MAX (MPTCP_SCHED_NAME_MAX * MPTCP_SCHED_MAX) | 21 | #define MPTCP_SCHED_BUF_MAX (MPTCP_SCHED_NAME_MAX * MPTCP_SCHED_MAX) |
24 | 22 | ||
25 | -#define MPTCP_SUBFLOWS_MAX 8 | 23 | -#define MPTCP_SUBFLOWS_MAX 8 |
26 | - | 24 | - |
27 | -struct mptcp_sched_data { | 25 | struct mptcp_sched_data { |
28 | - u8 subflows; | 26 | u8 subflows; |
29 | - struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX]; | 27 | - struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX]; |
30 | -}; | 28 | }; |
31 | - | 29 | |
32 | struct mptcp_sched_ops { | 30 | struct mptcp_sched_ops { |
33 | - int (*get_send)(struct mptcp_sock *msk, | ||
34 | - struct mptcp_sched_data *data); | ||
35 | - int (*get_retrans)(struct mptcp_sock *msk, | ||
36 | - struct mptcp_sched_data *data); | ||
37 | + int (*get_send)(struct mptcp_sock *msk); | ||
38 | + int (*get_retrans)(struct mptcp_sock *msk); | ||
39 | |||
40 | char name[MPTCP_SCHED_NAME_MAX]; | ||
41 | struct module *owner; | ||
42 | diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c | ||
43 | index XXXXXXX..XXXXXXX 100644 | ||
44 | --- a/net/mptcp/sched.c | ||
45 | +++ b/net/mptcp/sched.c | ||
46 | @@ -XXX,XX +XXX,XX @@ | ||
47 | static DEFINE_SPINLOCK(mptcp_sched_list_lock); | ||
48 | static LIST_HEAD(mptcp_sched_list); | ||
49 | |||
50 | -static int mptcp_sched_default_get_send(struct mptcp_sock *msk, | ||
51 | - struct mptcp_sched_data *data) | ||
52 | +static int mptcp_sched_default_get_send(struct mptcp_sock *msk) | ||
53 | { | ||
54 | struct sock *ssk; | ||
55 | |||
56 | @@ -XXX,XX +XXX,XX @@ static int mptcp_sched_default_get_send(struct mptcp_sock *msk, | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | -static int mptcp_sched_default_get_retrans(struct mptcp_sock *msk, | ||
61 | - struct mptcp_sched_data *data) | ||
62 | +static int mptcp_sched_default_get_retrans(struct mptcp_sock *msk) | ||
63 | { | ||
64 | struct sock *ssk; | ||
65 | |||
66 | @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, | ||
67 | int mptcp_sched_get_send(struct mptcp_sock *msk) | ||
68 | { | ||
69 | struct mptcp_subflow_context *subflow; | ||
70 | - struct mptcp_sched_data data; | ||
71 | |||
72 | msk_owned_by_me(msk); | ||
73 | |||
74 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_send(struct mptcp_sock *msk) | ||
75 | } | ||
76 | |||
77 | if (msk->sched == &mptcp_sched_default || !msk->sched) | ||
78 | - return mptcp_sched_default_get_send(msk, &data); | ||
79 | - return msk->sched->get_send(msk, &data); | ||
80 | + return mptcp_sched_default_get_send(msk); | ||
81 | + return msk->sched->get_send(msk); | ||
82 | } | ||
83 | |||
84 | int mptcp_sched_get_retrans(struct mptcp_sock *msk) | ||
85 | { | ||
86 | struct mptcp_subflow_context *subflow; | ||
87 | - struct mptcp_sched_data data; | ||
88 | |||
89 | msk_owned_by_me(msk); | ||
90 | |||
91 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk) | ||
92 | } | ||
93 | |||
94 | if (msk->sched == &mptcp_sched_default || !msk->sched) | ||
95 | - return mptcp_sched_default_get_retrans(msk, &data); | ||
96 | + return mptcp_sched_default_get_retrans(msk); | ||
97 | if (!msk->sched->get_retrans) | ||
98 | - return msk->sched->get_send(msk, &data); | ||
99 | - return msk->sched->get_retrans(msk, &data); | ||
100 | + return msk->sched->get_send(msk); | ||
101 | + return msk->sched->get_retrans(msk); | ||
102 | } | ||
103 | -- | 31 | -- |
104 | 2.45.2 | 32 | 2.43.0 | diff view generated by jsdifflib |