1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | |||
3 | v2: | ||
4 | - use get_send for retransmit scheduling if get_retrans is NULL as Mat | ||
5 | suggested (thanks) | ||
2 | 6 | ||
3 | I got the following error when running bpf burst sched selftests in auto-btf-debug mode: | 7 | I got the following error when running bpf burst sched selftests in auto-btf-debug mode: |
4 | 8 | ||
5 | [ 167.258293][ T49] BUG: sleeping function called from invalid context at net/core/sock.c:3652 | 9 | [ 167.258293][ T49] BUG: sleeping function called from invalid context at net/core/sock.c:3652 |
6 | [ 167.258981][ T49] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 49, name: kworker/0:2 | 10 | [ 167.258981][ T49] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 49, name: kworker/0:2 |
... | ... | ||
86 | 90 | ||
87 | So this patch has to split get_subflow() interface of packet scheduer into | 91 | So this patch has to split get_subflow() interface of packet scheduer into |
88 | two interfaces: get_send() and get_retrans(). Then we can set get_retrans() | 92 | two interfaces: get_send() and get_retrans(). Then we can set get_retrans() |
89 | interface alone with BPF_F_SLEEPABLE flag. | 93 | interface alone with BPF_F_SLEEPABLE flag. |
90 | 94 | ||
91 | Thanks to Barry for helping me solve this issue. | ||
92 | Cc: Barry Song <baohua@kernel.org> | ||
93 | |||
94 | Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/529 | 95 | Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/529 |
95 | 96 | ||
96 | Geliang Tang (8): | 97 | Geliang Tang (9): |
97 | mptcp: split get_subflow interface into two | 98 | mptcp: split get_subflow interface into two |
99 | Squash to "bpf: Add bpf_mptcp_sched_ops" | ||
98 | Squash to "selftests/bpf: Add bpf_first scheduler & test" | 100 | Squash to "selftests/bpf: Add bpf_first scheduler & test" |
99 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" | 101 | Squash to "selftests/bpf: Add bpf_bkup scheduler & test" |
100 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" | 102 | Squash to "selftests/bpf: Add bpf_rr scheduler & test" |
101 | Squash to "selftests/bpf: Add bpf_red scheduler & test" | 103 | Squash to "selftests/bpf: Add bpf_red scheduler & test" |
102 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 104 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
103 | Squash to "bpf: Export mptcp packet scheduler helpers" | 105 | Squash to "bpf: Export mptcp packet scheduler helpers" |
104 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" | 106 | Squash to "selftests/bpf: Add bpf_burst scheduler & test" |
105 | 107 | ||
106 | include/net/mptcp.h | 5 +-- | 108 | include/net/mptcp.h | 5 +-- |
107 | net/mptcp/bpf.c | 13 ++++++-- | 109 | net/mptcp/bpf.c | 13 +++++-- |
108 | net/mptcp/sched.c | 33 ++++++++++++------- | 110 | net/mptcp/sched.c | 35 +++++++++++++------ |
109 | .../testing/selftests/bpf/prog_tests/mptcp.c | 14 ++++++-- | 111 | .../testing/selftests/bpf/prog_tests/mptcp.c | 14 ++++++-- |
110 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 24 +++++++++++--- | 112 | .../selftests/bpf/progs/mptcp_bpf_bkup.c | 4 +-- |
111 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 32 ++++++++---------- | 113 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 22 +++++------- |
112 | .../selftests/bpf/progs/mptcp_bpf_first.c | 24 +++++++++++--- | 114 | .../selftests/bpf/progs/mptcp_bpf_first.c | 4 +-- |
113 | .../selftests/bpf/progs/mptcp_bpf_red.c | 24 +++++++++++--- | 115 | .../selftests/bpf/progs/mptcp_bpf_red.c | 4 +-- |
114 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 24 +++++++++++--- | 116 | .../selftests/bpf/progs/mptcp_bpf_rr.c | 4 +-- |
115 | 9 files changed, 136 insertions(+), 57 deletions(-) | 117 | 9 files changed, 65 insertions(+), 40 deletions(-) |
116 | 118 | ||
117 | -- | 119 | -- |
118 | 2.43.0 | 120 | 2.45.2 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
12 | interface alone with BPF_F_SLEEPABLE flag. | 12 | interface alone with BPF_F_SLEEPABLE flag. |
13 | 13 | ||
14 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 14 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
15 | --- | 15 | --- |
16 | include/net/mptcp.h | 5 +++-- | 16 | include/net/mptcp.h | 5 +++-- |
17 | net/mptcp/bpf.c | 11 +++++++++-- | 17 | net/mptcp/sched.c | 35 ++++++++++++++++++++++++----------- |
18 | net/mptcp/sched.c | 33 ++++++++++++++++++++++----------- | 18 | 2 files changed, 27 insertions(+), 13 deletions(-) |
19 | 3 files changed, 34 insertions(+), 15 deletions(-) | ||
20 | 19 | ||
21 | diff --git a/include/net/mptcp.h b/include/net/mptcp.h | 20 | diff --git a/include/net/mptcp.h b/include/net/mptcp.h |
22 | index XXXXXXX..XXXXXXX 100644 | 21 | index XXXXXXX..XXXXXXX 100644 |
23 | --- a/include/net/mptcp.h | 22 | --- a/include/net/mptcp.h |
24 | +++ b/include/net/mptcp.h | 23 | +++ b/include/net/mptcp.h |
... | ... | ||
37 | + struct mptcp_sched_data *data); | 36 | + struct mptcp_sched_data *data); |
38 | + int (*get_retrans)(struct mptcp_sock *msk, | 37 | + int (*get_retrans)(struct mptcp_sock *msk, |
39 | struct mptcp_sched_data *data); | 38 | struct mptcp_sched_data *data); |
40 | 39 | ||
41 | char name[MPTCP_SCHED_NAME_MAX]; | 40 | char name[MPTCP_SCHED_NAME_MAX]; |
42 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | ||
43 | index XXXXXXX..XXXXXXX 100644 | ||
44 | --- a/net/mptcp/bpf.c | ||
45 | +++ b/net/mptcp/bpf.c | ||
46 | @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_init(struct btf *btf) | ||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | -static int __bpf_mptcp_sched_get_subflow(struct mptcp_sock *msk, | ||
51 | +static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk, | ||
52 | + struct mptcp_sched_data *data) | ||
53 | +{ | ||
54 | + return 0; | ||
55 | +} | ||
56 | + | ||
57 | +static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk, | ||
58 | struct mptcp_sched_data *data) | ||
59 | { | ||
60 | return 0; | ||
61 | @@ -XXX,XX +XXX,XX @@ static void __bpf_mptcp_sched_release(struct mptcp_sock *msk) | ||
62 | } | ||
63 | |||
64 | static struct mptcp_sched_ops __bpf_mptcp_sched_ops = { | ||
65 | - .get_subflow = __bpf_mptcp_sched_get_subflow, | ||
66 | + .get_send = __bpf_mptcp_sched_get_send, | ||
67 | + .get_retrans = __bpf_mptcp_sched_get_retrans, | ||
68 | .init = __bpf_mptcp_sched_init, | ||
69 | .release = __bpf_mptcp_sched_release, | ||
70 | }; | ||
71 | diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c | 41 | diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c |
72 | index XXXXXXX..XXXXXXX 100644 | 42 | index XXXXXXX..XXXXXXX 100644 |
73 | --- a/net/mptcp/sched.c | 43 | --- a/net/mptcp/sched.c |
74 | +++ b/net/mptcp/sched.c | 44 | +++ b/net/mptcp/sched.c |
75 | @@ -XXX,XX +XXX,XX @@ | 45 | @@ -XXX,XX +XXX,XX @@ |
... | ... | ||
114 | @@ -XXX,XX +XXX,XX @@ void mptcp_get_available_schedulers(char *buf, size_t maxlen) | 84 | @@ -XXX,XX +XXX,XX @@ void mptcp_get_available_schedulers(char *buf, size_t maxlen) |
115 | 85 | ||
116 | int mptcp_register_scheduler(struct mptcp_sched_ops *sched) | 86 | int mptcp_register_scheduler(struct mptcp_sched_ops *sched) |
117 | { | 87 | { |
118 | - if (!sched->get_subflow) | 88 | - if (!sched->get_subflow) |
119 | + if (!sched->get_send || !sched->get_retrans) | 89 | + if (!sched->get_send) |
120 | return -EINVAL; | 90 | return -EINVAL; |
121 | 91 | ||
122 | spin_lock(&mptcp_sched_list_lock); | 92 | spin_lock(&mptcp_sched_list_lock); |
123 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_send(struct mptcp_sock *msk) | 93 | @@ -XXX,XX +XXX,XX @@ int mptcp_sched_get_send(struct mptcp_sock *msk) |
124 | return 0; | 94 | return 0; |
... | ... | ||
142 | if (msk->sched == &mptcp_sched_default || !msk->sched) | 112 | if (msk->sched == &mptcp_sched_default || !msk->sched) |
143 | - return mptcp_sched_default_get_subflow(msk, &data); | 113 | - return mptcp_sched_default_get_subflow(msk, &data); |
144 | + return mptcp_sched_default_get_retrans(msk, &data); | 114 | + return mptcp_sched_default_get_retrans(msk, &data); |
145 | mptcp_sched_data_set_contexts(msk, &data); | 115 | mptcp_sched_data_set_contexts(msk, &data); |
146 | - return msk->sched->get_subflow(msk, &data); | 116 | - return msk->sched->get_subflow(msk, &data); |
117 | + if (!msk->sched->get_retrans) | ||
118 | + return msk->sched->get_send(msk, &data); | ||
147 | + return msk->sched->get_retrans(msk, &data); | 119 | + return msk->sched->get_retrans(msk, &data); |
148 | } | 120 | } |
149 | -- | 121 | -- |
150 | 2.43.0 | 122 | 2.45.2 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
1 | 2 | ||
3 | Please update the subject to | ||
4 | |||
5 | bpf: Add mptcp packet scheduler struct_ops | ||
6 | |||
7 | Split get_subflow interface into two. | ||
8 | |||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
10 | --- | ||
11 | net/mptcp/bpf.c | 11 +++++++++-- | ||
12 | 1 file changed, 9 insertions(+), 2 deletions(-) | ||
13 | |||
14 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/net/mptcp/bpf.c | ||
17 | +++ b/net/mptcp/bpf.c | ||
18 | @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_init(struct btf *btf) | ||
19 | return 0; | ||
20 | } | ||
21 | |||
22 | -static int __bpf_mptcp_sched_get_subflow(struct mptcp_sock *msk, | ||
23 | +static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk, | ||
24 | + struct mptcp_sched_data *data) | ||
25 | +{ | ||
26 | + return 0; | ||
27 | +} | ||
28 | + | ||
29 | +static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk, | ||
30 | struct mptcp_sched_data *data) | ||
31 | { | ||
32 | return 0; | ||
33 | @@ -XXX,XX +XXX,XX @@ static void __bpf_mptcp_sched_release(struct mptcp_sock *msk) | ||
34 | } | ||
35 | |||
36 | static struct mptcp_sched_ops __bpf_mptcp_sched_ops = { | ||
37 | - .get_subflow = __bpf_mptcp_sched_get_subflow, | ||
38 | + .get_send = __bpf_mptcp_sched_get_send, | ||
39 | + .get_retrans = __bpf_mptcp_sched_get_retrans, | ||
40 | .init = __bpf_mptcp_sched_init, | ||
41 | .release = __bpf_mptcp_sched_release, | ||
42 | }; | ||
43 | -- | ||
44 | 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 | Split get_subflow() interface into two: get_send() and get_retrans(). | 3 | Use new interface get_send() instead of get_subflow(). |
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_first.c | 24 +++++++++++++++---- | 7 | tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 4 ++-- |
8 | 1 file changed, 19 insertions(+), 5 deletions(-) | 8 | 1 file changed, 2 insertions(+), 2 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c |
14 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_first_release, struct mptcp_sock *msk) | 14 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_first_release, struct mptcp_sock *msk) |
15 | { | ||
16 | } | 15 | } |
17 | 16 | ||
18 | -SEC("struct_ops") | 17 | SEC("struct_ops") |
19 | -int BPF_PROG(bpf_first_get_subflow, struct mptcp_sock *msk, | 18 | -int BPF_PROG(bpf_first_get_subflow, struct mptcp_sock *msk, |
20 | - struct mptcp_sched_data *data) | 19 | +int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk, |
21 | +static int bpf_first_get_subflow(struct mptcp_sock *msk, | 20 | struct mptcp_sched_data *data) |
22 | + struct mptcp_sched_data *data) | ||
23 | { | 21 | { |
24 | mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true); | 22 | mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true); |
25 | return 0; | 23 | @@ -XXX,XX +XXX,XX @@ SEC(".struct_ops") |
26 | } | ||
27 | |||
28 | -SEC(".struct_ops") | ||
29 | +SEC("struct_ops") | ||
30 | +int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk, | ||
31 | + struct mptcp_sched_data *data) | ||
32 | +{ | ||
33 | + return bpf_first_get_subflow(msk, data); | ||
34 | +} | ||
35 | + | ||
36 | +SEC("struct_ops") | ||
37 | +int BPF_PROG(bpf_first_get_retrans, struct mptcp_sock *msk, | ||
38 | + struct mptcp_sched_data *data) | ||
39 | +{ | ||
40 | + return bpf_first_get_subflow(msk, data); | ||
41 | +} | ||
42 | + | ||
43 | +SEC(".struct_ops.link") | ||
44 | struct mptcp_sched_ops first = { | 24 | struct mptcp_sched_ops first = { |
45 | .init = (void *)mptcp_sched_first_init, | 25 | .init = (void *)mptcp_sched_first_init, |
46 | .release = (void *)mptcp_sched_first_release, | 26 | .release = (void *)mptcp_sched_first_release, |
47 | - .get_subflow = (void *)bpf_first_get_subflow, | 27 | - .get_subflow = (void *)bpf_first_get_subflow, |
48 | + .get_send = (void *)bpf_first_get_send, | 28 | + .get_send = (void *)bpf_first_get_send, |
49 | + .get_retrans = (void *)bpf_first_get_retrans, | ||
50 | .name = "bpf_first", | 29 | .name = "bpf_first", |
51 | }; | 30 | }; |
52 | -- | 31 | -- |
53 | 2.43.0 | 32 | 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 | Split get_subflow() interface into two: get_send() and get_retrans(). | 3 | Use new interface get_send() instead of get_subflow(). |
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 | 24 +++++++++++++++---- | 7 | tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 4 ++-- |
8 | 1 file changed, 19 insertions(+), 5 deletions(-) | 8 | 1 file changed, 2 insertions(+), 2 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 @@ void BPF_PROG(mptcp_sched_bkup_release, struct mptcp_sock *msk) |
15 | { | ||
16 | } | 15 | } |
17 | 16 | ||
18 | -SEC("struct_ops") | 17 | SEC("struct_ops") |
19 | -int BPF_PROG(bpf_bkup_get_subflow, struct mptcp_sock *msk, | 18 | -int BPF_PROG(bpf_bkup_get_subflow, struct mptcp_sock *msk, |
20 | - struct mptcp_sched_data *data) | 19 | +int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk, |
21 | +static int bpf_bkup_get_subflow(struct mptcp_sock *msk, | 20 | struct mptcp_sched_data *data) |
22 | + struct mptcp_sched_data *data) | ||
23 | { | 21 | { |
24 | int nr = -1; | 22 | int nr = -1; |
25 | 23 | @@ -XXX,XX +XXX,XX @@ SEC(".struct_ops") | |
26 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_bkup_get_subflow, struct mptcp_sock *msk, | ||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | -SEC(".struct_ops") | ||
31 | +SEC("struct_ops") | ||
32 | +int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk, | ||
33 | + struct mptcp_sched_data *data) | ||
34 | +{ | ||
35 | + return bpf_bkup_get_subflow(msk, data); | ||
36 | +} | ||
37 | + | ||
38 | +SEC("struct_ops") | ||
39 | +int BPF_PROG(bpf_bkup_get_retrans, struct mptcp_sock *msk, | ||
40 | + struct mptcp_sched_data *data) | ||
41 | +{ | ||
42 | + return bpf_bkup_get_subflow(msk, data); | ||
43 | +} | ||
44 | + | ||
45 | +SEC(".struct_ops.link") | ||
46 | struct mptcp_sched_ops bkup = { | 24 | struct mptcp_sched_ops bkup = { |
47 | .init = (void *)mptcp_sched_bkup_init, | 25 | .init = (void *)mptcp_sched_bkup_init, |
48 | .release = (void *)mptcp_sched_bkup_release, | 26 | .release = (void *)mptcp_sched_bkup_release, |
49 | - .get_subflow = (void *)bpf_bkup_get_subflow, | 27 | - .get_subflow = (void *)bpf_bkup_get_subflow, |
50 | + .get_send = (void *)bpf_bkup_get_send, | 28 | + .get_send = (void *)bpf_bkup_get_send, |
51 | + .get_retrans = (void *)bpf_bkup_get_retrans, | ||
52 | .name = "bpf_bkup", | 29 | .name = "bpf_bkup", |
53 | }; | 30 | }; |
54 | -- | 31 | -- |
55 | 2.43.0 | 32 | 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 | Split get_subflow() interface into two: get_send() and get_retrans(). | 3 | Use new interface get_send() instead of get_subflow(). |
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 | tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 4 ++-- |
8 | 1 file changed, 19 insertions(+), 5 deletions(-) | 8 | 1 file changed, 2 insertions(+), 2 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 @@ void BPF_PROG(mptcp_sched_rr_release, struct mptcp_sock *msk) |
15 | bpf_sk_storage_delete(&mptcp_rr_map, msk); | ||
16 | } | 15 | } |
17 | 16 | ||
18 | -SEC("struct_ops") | 17 | SEC("struct_ops") |
19 | -int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, | 18 | -int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, |
20 | - struct mptcp_sched_data *data) | 19 | +int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk, |
21 | +static int bpf_rr_get_subflow(struct mptcp_sock *msk, | 20 | struct mptcp_sched_data *data) |
22 | + struct mptcp_sched_data *data) | ||
23 | { | 21 | { |
24 | struct mptcp_subflow_context *subflow; | 22 | struct mptcp_subflow_context *subflow; |
25 | struct mptcp_rr_storage *ptr; | 23 | @@ -XXX,XX +XXX,XX @@ SEC(".struct_ops") |
26 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk, | ||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | -SEC(".struct_ops") | ||
31 | +SEC("struct_ops") | ||
32 | +int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk, | ||
33 | + struct mptcp_sched_data *data) | ||
34 | +{ | ||
35 | + return bpf_rr_get_subflow(msk, data); | ||
36 | +} | ||
37 | + | ||
38 | +SEC("struct_ops") | ||
39 | +int BPF_PROG(bpf_rr_get_retrans, struct mptcp_sock *msk, | ||
40 | + struct mptcp_sched_data *data) | ||
41 | +{ | ||
42 | + return bpf_rr_get_subflow(msk, data); | ||
43 | +} | ||
44 | + | ||
45 | +SEC(".struct_ops.link") | ||
46 | struct mptcp_sched_ops rr = { | 24 | struct mptcp_sched_ops rr = { |
47 | .init = (void *)mptcp_sched_rr_init, | 25 | .init = (void *)mptcp_sched_rr_init, |
48 | .release = (void *)mptcp_sched_rr_release, | 26 | .release = (void *)mptcp_sched_rr_release, |
49 | - .get_subflow = (void *)bpf_rr_get_subflow, | 27 | - .get_subflow = (void *)bpf_rr_get_subflow, |
50 | + .get_send = (void *)bpf_rr_get_send, | 28 | + .get_send = (void *)bpf_rr_get_send, |
51 | + .get_retrans = (void *)bpf_rr_get_retrans, | ||
52 | .name = "bpf_rr", | 29 | .name = "bpf_rr", |
53 | }; | 30 | }; |
54 | -- | 31 | -- |
55 | 2.43.0 | 32 | 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 | Split get_subflow() interface into two: get_send() and get_retrans(). | 3 | Use new interface get_send() instead of get_subflow(). |
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_red.c | 24 +++++++++++++++---- | 7 | tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 4 ++-- |
8 | 1 file changed, 19 insertions(+), 5 deletions(-) | 8 | 1 file changed, 2 insertions(+), 2 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 @@ void BPF_PROG(mptcp_sched_red_release, struct mptcp_sock *msk) |
15 | { | ||
16 | } | 15 | } |
17 | 16 | ||
18 | -SEC("struct_ops") | 17 | SEC("struct_ops") |
19 | -int BPF_PROG(bpf_red_get_subflow, struct mptcp_sock *msk, | 18 | -int BPF_PROG(bpf_red_get_subflow, struct mptcp_sock *msk, |
20 | - struct mptcp_sched_data *data) | 19 | +int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk, |
21 | +static int bpf_red_get_subflow(struct mptcp_sock *msk, | 20 | struct mptcp_sched_data *data) |
22 | + struct mptcp_sched_data *data) | ||
23 | { | 21 | { |
24 | for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { | 22 | for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) { |
25 | if (!bpf_mptcp_subflow_ctx_by_pos(data, i)) | 23 | @@ -XXX,XX +XXX,XX @@ SEC(".struct_ops") |
26 | @@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_red_get_subflow, struct mptcp_sock *msk, | ||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | -SEC(".struct_ops") | ||
31 | +SEC("struct_ops") | ||
32 | +int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk, | ||
33 | + struct mptcp_sched_data *data) | ||
34 | +{ | ||
35 | + return bpf_red_get_subflow(msk, data); | ||
36 | +} | ||
37 | + | ||
38 | +SEC("struct_ops") | ||
39 | +int BPF_PROG(bpf_red_get_retrans, struct mptcp_sock *msk, | ||
40 | + struct mptcp_sched_data *data) | ||
41 | +{ | ||
42 | + return bpf_red_get_subflow(msk, data); | ||
43 | +} | ||
44 | + | ||
45 | +SEC(".struct_ops.link") | ||
46 | struct mptcp_sched_ops red = { | 24 | struct mptcp_sched_ops red = { |
47 | .init = (void *)mptcp_sched_red_init, | 25 | .init = (void *)mptcp_sched_red_init, |
48 | .release = (void *)mptcp_sched_red_release, | 26 | .release = (void *)mptcp_sched_red_release, |
49 | - .get_subflow = (void *)bpf_red_get_subflow, | 27 | - .get_subflow = (void *)bpf_red_get_subflow, |
50 | + .get_send = (void *)bpf_red_get_send, | 28 | + .get_send = (void *)bpf_red_get_send, |
51 | + .get_retrans = (void *)bpf_red_get_retrans, | ||
52 | .name = "bpf_red", | 29 | .name = "bpf_red", |
53 | }; | 30 | }; |
54 | -- | 31 | -- |
55 | 2.43.0 | 32 | 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 | Split get_subflow() interface into two: get_send() and get_retrans(). | 3 | Split get_subflow() interface into two: get_send() and get_retrans(). |
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_burst.c | 32 ++++++++----------- | 7 | .../selftests/bpf/progs/mptcp_bpf_burst.c | 22 +++++++------------ |
8 | 1 file changed, 13 insertions(+), 19 deletions(-) | 8 | 1 file changed, 8 insertions(+), 14 deletions(-) |
9 | 9 | ||
10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 10 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 12 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 13 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c |
14 | @@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL"; | ||
15 | |||
16 | #define MPTCP_SEND_BURST_SIZE 65428 | ||
17 | |||
18 | +#define SSK_MODE_ACTIVE 0 | ||
19 | +#define SSK_MODE_BACKUP 1 | ||
20 | +#define SSK_MODE_MAX 2 | ||
21 | + | ||
22 | #define min(a, b) ((a) < (b) ? (a) : (b)) | ||
23 | |||
24 | struct bpf_subflow_send_info { | ||
25 | @@ -XXX,XX +XXX,XX @@ extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym; | ||
26 | extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym; | ||
27 | extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym; | ||
28 | |||
29 | -#define SSK_MODE_ACTIVE 0 | ||
30 | -#define SSK_MODE_BACKUP 1 | ||
31 | -#define SSK_MODE_MAX 2 | ||
32 | - | ||
33 | static __always_inline __u64 div_u64(__u64 dividend, __u32 divisor) | ||
34 | { | ||
35 | return dividend / divisor; | ||
36 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk) | 14 | @@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk) |
37 | { | 15 | { |
38 | } | 16 | } |
39 | 17 | ||
40 | -static int bpf_burst_get_send(struct mptcp_sock *msk, | 18 | -static int bpf_burst_get_send(struct mptcp_sock *msk, |
... | ... | ||
68 | - if (data->reinject) | 46 | - if (data->reinject) |
69 | - return bpf_burst_get_retrans(msk, data); | 47 | - return bpf_burst_get_retrans(msk, data); |
70 | - return bpf_burst_get_send(msk, data); | 48 | - return bpf_burst_get_send(msk, data); |
71 | -} | 49 | -} |
72 | - | 50 | - |
73 | -SEC(".struct_ops") | 51 | SEC(".struct_ops") |
74 | +SEC(".struct_ops.link") | ||
75 | struct mptcp_sched_ops burst = { | 52 | struct mptcp_sched_ops burst = { |
76 | .init = (void *)mptcp_sched_burst_init, | 53 | .init = (void *)mptcp_sched_burst_init, |
77 | .release = (void *)mptcp_sched_burst_release, | 54 | .release = (void *)mptcp_sched_burst_release, |
78 | - .get_subflow = (void *)bpf_burst_get_subflow, | 55 | - .get_subflow = (void *)bpf_burst_get_subflow, |
79 | + .get_send = (void *)bpf_burst_get_send, | 56 | + .get_send = (void *)bpf_burst_get_send, |
80 | + .get_retrans = (void *)bpf_burst_get_retrans, | 57 | + .get_retrans = (void *)bpf_burst_get_retrans, |
81 | .name = "bpf_burst", | 58 | .name = "bpf_burst", |
82 | }; | 59 | }; |
83 | -- | 60 | -- |
84 | 2.43.0 | 61 | 2.45.2 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
19 | +BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) | 19 | +BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE) |
20 | BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) | 20 | BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids) |
21 | 21 | ||
22 | static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { | 22 | static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = { |
23 | -- | 23 | -- |
24 | 2.43.0 | 24 | 2.45.2 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
35 | +skel_destroy: | 35 | +skel_destroy: |
36 | mptcp_bpf_burst__destroy(skel); | 36 | mptcp_bpf_burst__destroy(skel); |
37 | } | 37 | } |
38 | 38 | ||
39 | -- | 39 | -- |
40 | 2.43.0 | 40 | 2.45.2 | diff view generated by jsdifflib |