1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
3
v13:
4
- use '__ign' suffix to ignore the argument type checks of
5
bpf_mptcp_subflow_ctx() and bpf_sk_stream_memory_free(),
6
instead of adding a new helper bpf_mptcp_send_info_to_ssk().
7
- use 'bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk)' instead
8
of using 'bpf_for_each(mptcp_subflow, subflow, msk)'.
9
- keep struct mptcp_sched_data for future use.
10
11
Depends on:
12
- Squash to "Add mptcp_subflow bpf_iter support", v2
13
14
Based-on: <cover.1738470660.git.tanggeliang@kylinos.cn>
15
16
v12:
17
- drop struct mptcp_sched_data.
18
- rebased on "split get_subflow interface into two" v2.
19
20
v11:
21
If another squash-to patchset (Squash to "Add mptcp_subflow bpf_iter
22
support") under review is merged before this set, v10 will fail to run.
23
v11 fixes this issue and can run regardless of whether it is merged
24
before or after the squash-to patchset.
25
26
Compared with v10, only patches 3, 5, and 8 have been modified:
27
- use mptcp_subflow_tcp_sock instead of bpf_mptcp_subflow_tcp_sock in
28
patch 3 and patch 5.
29
- drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead
30
in patch 8.
31
32
v10:
33
- drop mptcp_subflow_set_scheduled() helper and WRITE_ONCE() in BPF.
34
- add new bpf helper bpf_mptcp_send_info_to_ssk() for burst scheduler.
35
36
v9:
37
- merge 'Fixes for "use bpf_iter in bpf schedulers" v8' into this set.
38
- rebased on "add netns helpers" v4
39
40
v8:
41
- address Mat's comments in v7.
42
- move sk_stream_memory_free check inside bpf_for_each() loop.
43
- implement mptcp_subflow_set_scheduled helper in BPF.
44
- add cleanup patches into this set again.
45
46
v7:
47
- move cleanup patches out of this set.
48
- rebased.
49
50
v6:
51
- rebased to "add mptcp_subflow bpf_iter" v10
52
53
v5:
54
- patch 2, drop mptcp_sock_type and mptcp_subflow_type.
55
- patch 3, revert "bpf: Export more bpf_burst related functions"
56
- patch 4, merge "bpf: Export more bpf_burst related functions" into it.
57
58
v4:
59
- patch 2, a new cleanup for "bpf: Add bpf_mptcp_sched_ops".
60
- patch 3 should be reverted.
61
- patch 8, register kfunc_set.
62
63
v3:
64
- rebased.
65
- put the "drop has_bytes_sent" squash-to patch into this set.
2
66
3
v2:
67
v2:
4
- update bpf_rr and bpf_burst
68
- update bpf_rr and bpf_burst
5
69
6
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
7
subflows array "contexts" in struct mptcp_sched_data. This set
71
subflows array "contexts" in struct mptcp_sched_data. This set
8
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
9
schedules:
73
schedules:
10
74
11
    bpf_for_each(mptcp_subflow, subflow, msk) {
75
bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
12
        ... ...
76
... ...
13
        mptcp_subflow_set_scheduled(subflow, true);
77
mptcp_subflow_set_scheduled(subflow, true);
14
    }
78
}
15
16
Depends on:
17
- "add mptcp_subflow bpf_iter" v8
18
79
19
Geliang Tang (9):
80
Geliang Tang (9):
20
Squash to "bpf: Add bpf_mptcp_sched_kfunc_set"
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"
21
Squash to "selftests/bpf: Add bpf_first scheduler & test"
84
Squash to "selftests/bpf: Add bpf_first scheduler & test"
22
Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
85
Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
23
Squash to "selftests/bpf: Add bpf_rr scheduler & test"
86
Squash to "selftests/bpf: Add bpf_rr scheduler & test"
24
Squash to "selftests/bpf: Add bpf_red scheduler & test"
87
Squash to "selftests/bpf: Add bpf_red scheduler & test"
25
Squash to "bpf: Export more bpf_burst related functions"
26
Squash to "selftests/bpf: Add bpf_burst scheduler & test"
88
Squash to "selftests/bpf: Add bpf_burst scheduler & test"
27
Revert "mptcp: add sched_data helpers"
28
mptcp: drop subflow contexts in mptcp_sched_data
89
mptcp: drop subflow contexts in mptcp_sched_data
29
90
30
include/net/mptcp.h | 2 -
91
include/net/mptcp.h | 3 -
31
net/mptcp/bpf.c | 19 ++---
92
net/mptcp/bpf.c | 52 +++++++------
32
net/mptcp/protocol.h | 3 -
93
net/mptcp/protocol.h | 2 -
33
net/mptcp/sched.c | 22 ------
94
net/mptcp/sched.c | 22 ------
34
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 2 +-
95
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 -
35
.../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +---
96
.../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +---
36
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++++----------
97
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------
37
.../selftests/bpf/progs/mptcp_bpf_first.c | 8 +-
98
.../selftests/bpf/progs/mptcp_bpf_first.c | 8 +-
38
.../selftests/bpf/progs/mptcp_bpf_red.c | 8 +-
99
.../selftests/bpf/progs/mptcp_bpf_red.c | 8 +-
39
.../selftests/bpf/progs/mptcp_bpf_rr.c | 24 +++---
100
.../selftests/bpf/progs/mptcp_bpf_rr.c | 31 ++++----
40
10 files changed, 68 insertions(+), 114 deletions(-)
101
10 files changed, 80 insertions(+), 143 deletions(-)
41
102
42
--
103
--
43
2.43.0
104
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Drop bpf_mptcp_subflow_queues_empty declaration.
3
Instead of adding a new BPF function bpf_mptcp_send_info_to_ssk() in
4
v12, this patch uses a much more simpler approach, which using '__ign'
5
suffix for the argument of bpf_mptcp_subflow_ctx() to let BPF to
6
ignore the type check of this argument.
4
7
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
---
9
---
7
net/mptcp/protocol.h | 1 -
10
net/mptcp/bpf.c | 8 ++++----
8
1 file changed, 1 deletion(-)
11
1 file changed, 4 insertions(+), 4 deletions(-)
9
12
10
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
13
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
11
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
12
--- a/net/mptcp/protocol.h
15
--- a/net/mptcp/bpf.c
13
+++ b/net/mptcp/protocol.h
16
+++ b/net/mptcp/bpf.c
14
@@ -XXX,XX +XXX,XX @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
17
@@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern {
15
void mptcp_sock_graft(struct sock *sk, struct socket *parent);
18
__bpf_kfunc_start_defs();
16
u64 mptcp_wnd_end(const struct mptcp_sock *msk);
19
17
void mptcp_set_timeout(struct sock *sk);
20
__bpf_kfunc static struct mptcp_subflow_context *
18
-bool bpf_mptcp_subflow_queues_empty(struct sock *sk);
21
-bpf_mptcp_subflow_ctx(const struct sock *sk)
19
struct mptcp_subflow_context *
22
+bpf_mptcp_subflow_ctx(const struct sock *sk__ign)
20
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos);
23
{
21
struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
24
-    if (sk && sk_fullsock(sk) &&
25
-     sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
26
-        return mptcp_subflow_ctx(sk);
27
+    if (sk__ign && sk_fullsock(sk__ign) &&
28
+     sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign))
29
+        return mptcp_subflow_ctx(sk__ign);
30
31
    return NULL;
32
}
22
--
33
--
23
2.43.0
34
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
3
Drop this patch. bpf_mptcp_subflow_ctx_by_pos and
4
mptcp_sched_data_set_contexts are uesless now.
2
5
3
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
4
---
7
---
5
net/mptcp/bpf.c | 9 ---------
8
net/mptcp/bpf.c | 8 --------
6
net/mptcp/protocol.h | 2 --
9
net/mptcp/protocol.h | 2 --
7
net/mptcp/sched.c | 22 ----------------------
10
net/mptcp/sched.c | 22 ----------------------
8
3 files changed, 33 deletions(-)
11
3 files changed, 32 deletions(-)
9
12
10
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
11
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
12
--- a/net/mptcp/bpf.c
15
--- a/net/mptcp/bpf.c
13
+++ b/net/mptcp/bpf.c
16
+++ b/net/mptcp/bpf.c
14
@@ -XXX,XX +XXX,XX @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk)
17
@@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
15
    WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
18
{
16
}
19
}
17
20
18
-__bpf_kfunc struct mptcp_subflow_context *
21
-__bpf_kfunc struct mptcp_subflow_context *
19
-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)
20
-{
23
-{
21
-    if (pos >= MPTCP_SUBFLOWS_MAX)
24
-    if (pos >= MPTCP_SUBFLOWS_MAX)
22
-        return NULL;
25
-        return NULL;
23
-    return data->contexts[pos];
26
-    return data->contexts[pos];
24
-}
27
-}
25
-
28
-
26
__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
29
__bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
27
{
30
{
28
    return tcp_rtx_queue_empty(sk);
31
    return tcp_rtx_queue_empty(sk);
29
@@ -XXX,XX +XXX,XX @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
30
};
31
32
BTF_KFUNCS_START(bpf_mptcp_struct_ops_kfunc_ids)
33
-BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
34
BTF_ID_FLAGS(func, mptcp_set_timeout)
35
BTF_ID_FLAGS(func, mptcp_wnd_end)
36
BTF_ID_FLAGS(func, tcp_stream_memory_free)
37
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
32
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
38
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
39
--- a/net/mptcp/protocol.h
34
--- a/net/mptcp/protocol.h
40
+++ b/net/mptcp/protocol.h
35
+++ b/net/mptcp/protocol.h
41
@@ -XXX,XX +XXX,XX @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
36
@@ -XXX,XX +XXX,XX @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
...
...
77
-
72
-
78
int mptcp_sched_get_send(struct mptcp_sock *msk)
73
int mptcp_sched_get_send(struct mptcp_sock *msk)
79
{
74
{
80
    struct mptcp_subflow_context *subflow;
75
    struct mptcp_subflow_context *subflow;
81
@@ -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)
82
    data.reinject = false;
77
83
    if (msk->sched == &mptcp_sched_default || !msk->sched)
78
    if (msk->sched == &mptcp_sched_default || !msk->sched)
84
        return mptcp_sched_default_get_subflow(msk, &data);
79
        return mptcp_sched_default_get_send(msk, &data);
85
-    mptcp_sched_data_set_contexts(msk, &data);
80
-    mptcp_sched_data_set_contexts(msk, &data);
86
    return msk->sched->get_subflow(msk, &data);
81
    return msk->sched->get_send(msk, &data);
87
}
82
}
88
83
89
@@ -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)
90
    data.reinject = true;
91
    if (msk->sched == &mptcp_sched_default || !msk->sched)
85
    if (msk->sched == &mptcp_sched_default || !msk->sched)
92
        return mptcp_sched_default_get_subflow(msk, &data);
86
        return mptcp_sched_default_get_retrans(msk, &data);
87
93
-    mptcp_sched_data_set_contexts(msk, &data);
88
-    mptcp_sched_data_set_contexts(msk, &data);
94
    return msk->sched->get_subflow(msk, &data);
89
    if (msk->sched->get_retrans)
95
}
90
        return msk->sched->get_retrans(msk, &data);
91
    return msk->sched->get_send(msk, &data);
96
--
92
--
97
2.43.0
93
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Please update the subject to
3
Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set.
4
4
Drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead.
5
"bpf: Register mptcp struct_ops kfunc set"
5
Add new helpers bpf_mptcp_subflow_tcp_sock() and
6
6
bpf_sk_stream_memory_free().
7
Rename bpf_mptcp_sched_kfunc_set to bpf_mptcp_struct_ops_kfunc_set, since
8
this kfunc set will not only use in bpf packet schedulers, but also in
9
other struct_ops like bpf path managers.
10
11
Rename bpf_mptcp_subflow_ctx_by_pos to bpf_mptcp_lookup_subflow_by_id.
12
7
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
---
9
---
15
net/mptcp/bpf.c | 10 +++++-----
10
net/mptcp/bpf.c | 38 ++++++++++++++++++++++++--------------
16
1 file changed, 5 insertions(+), 5 deletions(-)
11
1 file changed, 24 insertions(+), 14 deletions(-)
17
12
18
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
13
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/bpf.c
15
--- a/net/mptcp/bpf.c
21
+++ b/net/mptcp/bpf.c
16
+++ b/net/mptcp/bpf.c
22
@@ -XXX,XX +XXX,XX @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
17
@@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign)
23
    .set    = &bpf_mptcp_common_kfunc_ids,
18
    return NULL;
24
};
19
}
25
20
21
+__bpf_kfunc static struct sock *
22
+bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
23
+{
24
+    if (!subflow)
25
+        return NULL;
26
+
27
+    return mptcp_subflow_tcp_sock(subflow);
28
+}
29
+
30
__bpf_kfunc static int
31
bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
32
             struct sock *sk)
33
@@ -XXX,XX +XXX,XX @@ __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
34
    return tcp_rtx_queue_empty(sk);
35
}
36
37
+__bpf_kfunc static bool bpf_sk_stream_memory_free(const struct sock *sk__ign)
38
+{
39
+    if (sk__ign && sk_fullsock(sk__ign) &&
40
+     sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign))
41
+        return sk_stream_memory_free(sk__ign);
42
+
43
+    return NULL;
44
+}
45
+
46
__bpf_kfunc_end_defs();
47
48
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
49
BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL)
50
+BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock, KF_RET_NULL)
51
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
52
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL)
53
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY)
54
-BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
55
-
56
-static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
57
-    .owner    = THIS_MODULE,
58
-    .set    = &bpf_mptcp_common_kfunc_ids,
59
-};
60
-
26
-BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
61
-BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
27
+BTF_KFUNCS_START(bpf_mptcp_struct_ops_kfunc_ids)
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)
64
BTF_ID_FLAGS(func, mptcp_subflow_active)
29
BTF_ID_FLAGS(func, mptcp_set_timeout)
65
BTF_ID_FLAGS(func, mptcp_set_timeout)
30
BTF_ID_FLAGS(func, mptcp_wnd_end)
66
BTF_ID_FLAGS(func, mptcp_wnd_end)
31
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)
32
BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
69
BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
33
BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
70
BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE)
34
-BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids)
71
-BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids)
35
+BTF_KFUNCS_END(bpf_mptcp_struct_ops_kfunc_ids)
72
+BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
36
73
37
-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 = {
38
+static const struct btf_kfunc_id_set bpf_mptcp_struct_ops_kfunc_set = {
75
+static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
39
    .owner    = THIS_MODULE,
76
    .owner    = THIS_MODULE,
40
-    .set    = &bpf_mptcp_sched_kfunc_ids,
77
-    .set    = &bpf_mptcp_sched_kfunc_ids,
41
+    .set    = &bpf_mptcp_struct_ops_kfunc_ids,
78
+    .set    = &bpf_mptcp_common_kfunc_ids,
42
};
79
};
43
80
44
static int __init bpf_mptcp_kfunc_init(void)
81
static int __init bpf_mptcp_kfunc_init(void)
45
@@ -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)
46
    ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC,
83
    ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT,
47
                     &bpf_mptcp_common_kfunc_set);
84
                     &bpf_mptcp_common_kfunc_set);
48
    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,
49
-                     &bpf_mptcp_sched_kfunc_set);
86
-                     &bpf_mptcp_sched_kfunc_set);
50
+                     &bpf_mptcp_struct_ops_kfunc_set);
87
+                     &bpf_mptcp_common_kfunc_set);
51
#ifdef CONFIG_BPF_JIT
88
#ifdef CONFIG_BPF_JIT
52
    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);
53
#endif
90
#endif
54
--
91
--
55
2.43.0
92
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Use the newly added bpf_for_each() helper to walk the conn_list.
3
Use the newly added bpf_for_each() helper to walk the conn_list.
4
Drop bpf_mptcp_subflow_ctx_by_pos declaration.
4
5
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
---
7
---
7
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 2 +-
8
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 ---
8
tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++-
9
tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++-
9
2 files changed, 8 insertions(+), 2 deletions(-)
10
2 files changed, 7 insertions(+), 4 deletions(-)
10
11
11
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
12
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
14
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
14
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
15
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
15
@@ -XXX,XX +XXX,XX @@ extern struct sock *
16
@@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym;
16
bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym;
17
extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
17
18
                    bool scheduled) __ksym;
18
extern struct mptcp_subflow_context *
19
20
-extern struct mptcp_subflow_context *
19
-bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym;
21
-bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym;
20
+bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym;
22
-
21
22
#endif
23
#endif
23
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
24
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
24
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
25
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
26
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
26
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
27
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
27
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
28
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
28
int BPF_PROG(bpf_first_get_subflow, struct mptcp_sock *msk,
29
int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk,
29
     struct mptcp_sched_data *data)
30
     struct mptcp_sched_data *data)
30
{
31
{
31
-    mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true);
32
-    mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true);
32
+    struct mptcp_subflow_context *subflow;
33
+    struct mptcp_subflow_context *subflow;
33
+
34
+
34
+    bpf_for_each(mptcp_subflow, subflow, msk) {
35
+    subflow = bpf_mptcp_subflow_ctx(msk->first);
35
+        mptcp_subflow_set_scheduled(subflow, true);
36
+    if (!subflow)
36
+        break;
37
+        return -1;
37
+    }
38
+
38
+
39
+    mptcp_subflow_set_scheduled(subflow, true);
39
    return 0;
40
    return 0;
40
}
41
}
41
42
42
--
43
--
43
2.43.0
44
2.43.0
diff view generated by jsdifflib
...
...
10
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
10
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
12
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
13
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
13
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
14
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
14
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
15
int BPF_PROG(bpf_bkup_get_subflow, struct mptcp_sock *msk,
15
int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk,
16
     struct mptcp_sched_data *data)
16
     struct mptcp_sched_data *data)
17
{
17
{
18
-    int nr = -1;
18
-    int nr = -1;
19
-
19
-
20
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
20
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
...
...
23
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
23
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
24
-        if (!subflow)
24
-        if (!subflow)
25
-            break;
25
-            break;
26
+    struct mptcp_subflow_context *subflow;
26
+    struct mptcp_subflow_context *subflow;
27
27
28
+    bpf_for_each(mptcp_subflow, subflow, msk) {
28
+    bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
29
        if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) ||
29
        if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) ||
30
         !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) {
30
         !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) {
31
-            nr = i;
31
-            nr = i;
32
+            mptcp_subflow_set_scheduled(subflow, true);
32
+            mptcp_subflow_set_scheduled(subflow, true);
33
            break;
33
            break;
...
...
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Use the newly added bpf_for_each() helper to walk the conn_list.
3
Use the newly added bpf_for_each() helper to walk the conn_list.
4
4
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
---
6
---
7
.../selftests/bpf/progs/mptcp_bpf_rr.c | 24 ++++++++-----------
7
.../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++++++----------
8
1 file changed, 10 insertions(+), 14 deletions(-)
8
1 file changed, 14 insertions(+), 17 deletions(-)
9
9
10
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
10
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
12
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
13
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
13
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
14
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
14
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
15
int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk,
15
int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk,
16
     struct mptcp_sched_data *data)
16
     struct mptcp_sched_data *data)
17
{
17
{
18
-    struct mptcp_subflow_context *subflow;
18
-    struct mptcp_subflow_context *subflow;
19
+    struct mptcp_subflow_context *subflow, *next;
19
+    struct mptcp_subflow_context *subflow, *next;
20
    struct mptcp_rr_storage *ptr;
20
    struct mptcp_rr_storage *ptr;
21
    struct sock *last_snd = NULL;
21
-    struct sock *last_snd = NULL;
22
-    int nr = 0;
22
-    int nr = 0;
23
23
24
    ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0,
24
    ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0,
25
                 BPF_LOCAL_STORAGE_GET_F_CREATE);
25
                 BPF_LOCAL_STORAGE_GET_F_CREATE);
26
@@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk,
26
    if (!ptr)
27
        return -1;
27
        return -1;
28
28
29
    last_snd = ptr->last_snd;
29
-    last_snd = ptr->last_snd;
30
+    next = bpf_mptcp_subflow_ctx(msk->first);
30
+    next = bpf_mptcp_subflow_ctx(msk->first);
31
+    if (!next)
32
+        return -1;
31
33
32
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
34
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
33
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
35
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
34
-        if (!last_snd || !subflow)
36
-        if (!last_snd || !subflow)
35
+    bpf_for_each(mptcp_subflow, subflow, msk) {
37
-            break;
36
+        if (!last_snd)
38
+    if (!ptr->last_snd)
37
            break;
39
+        goto out;
38
40
39
-        if (mptcp_subflow_tcp_sock(subflow) == last_snd) {
41
-        if (mptcp_subflow_tcp_sock(subflow) == last_snd) {
40
-            if (i + 1 == MPTCP_SUBFLOWS_MAX ||
42
-            if (i + 1 == MPTCP_SUBFLOWS_MAX ||
41
-             !bpf_mptcp_subflow_ctx_by_pos(data, i + 1))
43
-             !bpf_mptcp_subflow_ctx_by_pos(data, i + 1))
42
+        if (bpf_mptcp_subflow_tcp_sock(subflow) == last_snd) {
44
+    bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
45
+        if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) {
43
+            subflow = bpf_iter_mptcp_subflow_next(&___it);
46
+            subflow = bpf_iter_mptcp_subflow_next(&___it);
44
+            if (!subflow)
47
+            if (!subflow)
45
                break;
48
                break;
46
49
47
-            nr = i + 1;
50
-            nr = i + 1;
...
...
53
-    subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr);
56
-    subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr);
54
-    if (!subflow)
57
-    if (!subflow)
55
-        return -1;
58
-        return -1;
56
-    mptcp_subflow_set_scheduled(subflow, true);
59
-    mptcp_subflow_set_scheduled(subflow, true);
57
-    ptr->last_snd = mptcp_subflow_tcp_sock(subflow);
60
-    ptr->last_snd = mptcp_subflow_tcp_sock(subflow);
61
+out:
58
+    mptcp_subflow_set_scheduled(next, true);
62
+    mptcp_subflow_set_scheduled(next, true);
59
+    ptr->last_snd = bpf_mptcp_subflow_tcp_sock(next);
63
+    ptr->last_snd = mptcp_subflow_tcp_sock(next);
60
    return 0;
64
    return 0;
61
}
65
}
62
66
63
--
67
--
64
2.43.0
68
2.43.0
diff view generated by jsdifflib
...
...
10
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
10
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
12
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
13
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
13
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
14
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
14
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
15
int BPF_PROG(bpf_red_get_subflow, struct mptcp_sock *msk,
15
int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk,
16
     struct mptcp_sched_data *data)
16
     struct mptcp_sched_data *data)
17
{
17
{
18
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
18
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
19
-        if (!bpf_mptcp_subflow_ctx_by_pos(data, i))
19
-        if (!bpf_mptcp_subflow_ctx_by_pos(data, i))
20
-            break;
20
-            break;
21
+    struct mptcp_subflow_context *subflow;
21
+    struct mptcp_subflow_context *subflow;
22
22
23
-        mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, i), true);
23
-        mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, i), true);
24
-    }
24
-    }
25
+    bpf_for_each(mptcp_subflow, subflow, msk)
25
+    bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk)
26
+        mptcp_subflow_set_scheduled(subflow, true);
26
+        mptcp_subflow_set_scheduled(subflow, true);
27
27
28
    return 0;
28
    return 0;
29
}
29
}
30
--
30
--
31
2.43.0
31
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Use the newly added bpf_for_each() helper to walk the conn_list.
3
Use the newly added bpf_for_each() helper to walk the conn_list.
4
4
Drop bpf_subflow_send_info, use subflow_send_info instead.
5
Drop mptcp_subflow_active declaration.
6
5
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
7
---
9
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++++----------
8
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------
10
1 file changed, 39 insertions(+), 39 deletions(-)
9
1 file changed, 26 insertions(+), 52 deletions(-)
11
10
12
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
11
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
13
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
15
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
14
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
16
@@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL";
15
@@ -XXX,XX +XXX,XX @@ char _license[] SEC("license") = "GPL";
17
16
18
#define min(a, b) ((a) < (b) ? (a) : (b))
17
#define min(a, b) ((a) < (b) ? (a) : (b))
19
18
20
+#define SSK_MODE_ACTIVE    0
19
-struct bpf_subflow_send_info {
21
+#define SSK_MODE_BACKUP    1
20
-    __u8 subflow_id;
22
+#define SSK_MODE_MAX    2
21
-    __u64 linger_time;
23
+
22
-};
24
struct bpf_subflow_send_info {
23
-
25
    __u8 subflow_id;
24
extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym;
26
    __u64 linger_time;
27
};
28
29
-extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym;
30
extern void mptcp_set_timeout(struct sock *sk) __ksym;
25
extern void mptcp_set_timeout(struct sock *sk) __ksym;
31
extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym;
26
extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym;
32
extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym;
27
-extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym;
28
+extern bool bpf_sk_stream_memory_free(const struct sock *sk) __ksym;
33
extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym;
29
extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym;
34
extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym;
30
extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym;
35
31
36
-#define SSK_MODE_ACTIVE    0
32
@@ -XXX,XX +XXX,XX @@ static __always_inline bool tcp_rtx_and_write_queues_empty(struct sock *sk)
37
-#define SSK_MODE_BACKUP    1
33
    return bpf_mptcp_subflow_queues_empty(sk) && tcp_write_queue_empty(sk);
38
-#define SSK_MODE_MAX    2
34
}
35
36
-static __always_inline bool __sk_stream_memory_free(const struct sock *sk, int wake)
37
-{
38
-    if (sk->sk_wmem_queued >= sk->sk_sndbuf)
39
-        return false;
39
-
40
-
40
static __always_inline __u64 div_u64(__u64 dividend, __u32 divisor)
41
-    return tcp_stream_memory_free(sk, wake);
41
{
42
-}
42
    return dividend / divisor;
43
-
43
@@ -XXX,XX +XXX,XX @@ static __always_inline bool sk_stream_memory_free(const struct sock *sk)
44
-static __always_inline bool sk_stream_memory_free(const struct sock *sk)
44
    return __sk_stream_memory_free(sk, 0);
45
-{
45
}
46
-    return __sk_stream_memory_free(sk, 0);
46
47
-}
47
+static struct mptcp_subflow_context *
48
-
48
+mptcp_lookup_subflow_by_id(struct mptcp_sock *msk, unsigned int id)
49
+{
50
+    struct mptcp_subflow_context *subflow;
51
+
52
+    bpf_for_each(mptcp_subflow, subflow, msk) {
53
+        if (subflow->subflow_id == id)
54
+            return subflow;
55
+    }
56
+
57
+    return NULL;
58
+}
59
+
60
SEC("struct_ops")
49
SEC("struct_ops")
61
void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk)
50
void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk)
62
{
51
{
63
@@ -XXX,XX +XXX,XX @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
52
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
53
int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
54
     struct mptcp_sched_data *data)
64
{
55
{
65
}
56
-    struct bpf_subflow_send_info send_info[SSK_MODE_MAX];
66
57
+    struct subflow_send_info send_info[SSK_MODE_MAX];
67
-static int bpf_burst_get_send(struct mptcp_sock *msk,
68
-             struct mptcp_sched_data *data)
69
+static int bpf_burst_get_send(struct mptcp_sock *msk)
70
{
71
    struct bpf_subflow_send_info send_info[SSK_MODE_MAX];
72
    struct mptcp_subflow_context *subflow;
58
    struct mptcp_subflow_context *subflow;
73
@@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
59
    struct sock *sk = (struct sock *)msk;
60
    __u32 pace, burst, wmem;
61
@@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
62
63
    /* pick the subflow with the lower wmem/wspace ratio */
64
    for (i = 0; i < SSK_MODE_MAX; ++i) {
65
-        send_info[i].subflow_id = MPTCP_SUBFLOWS_MAX;
66
+        send_info[i].ssk = NULL;
74
        send_info[i].linger_time = -1;
67
        send_info[i].linger_time = -1;
75
    }
68
    }
76
69
77
-    for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
70
-    for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
78
-        bool backup;
71
-        bool backup;
79
+    bpf_for_each(mptcp_subflow, subflow, msk) {
72
-
80
+        bool backup = subflow->backup || subflow->request_bkup;
81
82
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
73
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
83
-        if (!subflow)
74
-        if (!subflow)
84
-            break;
75
-            break;
85
-
76
-
86
-        backup = subflow->backup || subflow->request_bkup;
77
-        backup = subflow->backup || subflow->request_bkup;
87
-
78
+    bpf_for_each(mptcp_subflow, subflow, sk) {
88
-        ssk = mptcp_subflow_tcp_sock(subflow);
79
+        bool backup = subflow->backup || subflow->request_bkup;
89
+        ssk = bpf_mptcp_subflow_tcp_sock(subflow);
80
81
        ssk = mptcp_subflow_tcp_sock(subflow);
90
        if (!mptcp_subflow_active(subflow))
82
        if (!mptcp_subflow_active(subflow))
91
            continue;
83
@@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
92
93
@@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
94
84
95
        linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace);
85
        linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace);
96
        if (linger_time < send_info[backup].linger_time) {
86
        if (linger_time < send_info[backup].linger_time) {
97
-            send_info[backup].subflow_id = i;
87
-            send_info[backup].subflow_id = i;
98
+            send_info[backup].subflow_id = subflow->subflow_id;
88
+            send_info[backup].ssk = ssk;
99
            send_info[backup].linger_time = linger_time;
89
            send_info[backup].linger_time = linger_time;
100
        }
90
        }
101
    }
91
    }
102
@@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
92
@@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
93
94
    /* pick the best backup if no other subflow is active */
103
    if (!nr_active)
95
    if (!nr_active)
104
        send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id;
96
-        send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id;
97
+        send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk;
105
98
106
-    subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
99
-    subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
107
+    subflow = mptcp_lookup_subflow_by_id(msk, send_info[SSK_MODE_ACTIVE].subflow_id);
100
-    if (!subflow)
108
    if (!subflow)
101
+    ssk = send_info[SSK_MODE_ACTIVE].ssk;
102
+    if (!ssk || !bpf_sk_stream_memory_free(ssk))
109
        return -1;
103
        return -1;
110
-    ssk = mptcp_subflow_tcp_sock(subflow);
104
-    ssk = mptcp_subflow_tcp_sock(subflow);
111
+    ssk = bpf_mptcp_subflow_tcp_sock(subflow);
105
-    if (!ssk || !sk_stream_memory_free(ssk))
112
    if (!ssk || !sk_stream_memory_free(ssk))
106
+
107
+    subflow = bpf_mptcp_subflow_ctx(ssk);
108
+    if (!subflow)
113
        return -1;
109
        return -1;
114
110
115
@@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
111
    burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
116
    return 0;
112
+    ssk = bpf_core_cast(ssk, struct sock);
117
}
113
    wmem = ssk->sk_wmem_queued;
118
114
    if (!burst)
119
-static int bpf_burst_get_retrans(struct mptcp_sock *msk,
115
        goto out;
120
-                 struct mptcp_sched_data *data)
116
@@ -XXX,XX +XXX,XX @@ SEC("struct_ops")
121
+static int bpf_burst_get_retrans(struct mptcp_sock *msk)
117
int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk,
118
     struct mptcp_sched_data *data)
122
{
119
{
123
-    int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id;
120
-    int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id;
124
+    struct sock *backup = NULL, *pick = NULL;
121
+    struct sock *backup = NULL, *pick = NULL;
125
    struct mptcp_subflow_context *subflow;
122
    struct mptcp_subflow_context *subflow;
126
    int min_stale_count = INT_MAX;
123
    int min_stale_count = INT_MAX;
127
-    struct sock *ssk;
124
-    struct sock *ssk;
128
125
129
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
126
-    for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
130
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
127
-        subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
131
-        if (!subflow)
128
-        if (!subflow)
132
-            break;
129
-            break;
133
+    bpf_for_each(mptcp_subflow, subflow, msk) {
130
+    bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
134
+        struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow);
131
+        struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow);
135
132
136
        if (!mptcp_subflow_active(subflow))
133
-        if (!mptcp_subflow_active(subflow))
134
+        if (!ssk || !mptcp_subflow_active(subflow))
137
            continue;
135
            continue;
138
136
139
-        ssk = mptcp_subflow_tcp_sock(subflow);
137
-        ssk = mptcp_subflow_tcp_sock(subflow);
140
        /* still data outstanding at TCP level? skip this */
138
        /* still data outstanding at TCP level? skip this */
141
        if (!tcp_rtx_and_write_queues_empty(ssk)) {
139
        if (!tcp_rtx_and_write_queues_empty(ssk)) {
142
            mptcp_pm_subflow_chk_stale(msk, ssk);
140
            mptcp_pm_subflow_chk_stale(msk, ssk);
143
@@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
141
@@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk,
144
        }
142
        }
145
143
146
        if (subflow->backup || subflow->request_bkup) {
144
        if (subflow->backup || subflow->request_bkup) {
147
-            if (backup == MPTCP_SUBFLOWS_MAX)
145
-            if (backup == MPTCP_SUBFLOWS_MAX)
148
-                backup = i;
146
-                backup = i;
...
...
171
+        return -1;
169
+        return -1;
172
+    subflow = bpf_mptcp_subflow_ctx(pick);
170
+    subflow = bpf_mptcp_subflow_ctx(pick);
173
    if (!subflow)
171
    if (!subflow)
174
        return -1;
172
        return -1;
175
    mptcp_subflow_set_scheduled(subflow, true);
173
    mptcp_subflow_set_scheduled(subflow, true);
176
@@ -XXX,XX +XXX,XX @@ int BPF_PROG(bpf_burst_get_subflow, struct mptcp_sock *msk,
177
     struct mptcp_sched_data *data)
178
{
179
    if (data->reinject)
180
-        return bpf_burst_get_retrans(msk, data);
181
-    return bpf_burst_get_send(msk, data);
182
+        return bpf_burst_get_retrans(msk);
183
+    return bpf_burst_get_send(msk);
184
}
185
186
SEC(".struct_ops")
187
--
174
--
188
2.43.0
175
2.43.0
diff view generated by jsdifflib
...
...
3
The mptcp_subflow bpf_iter is added now, it's better to use the helper
3
The mptcp_subflow bpf_iter is added now, it's better to use the helper
4
bpf_for_each(mptcp_subflow) to traverse all subflows on the conn_list of
4
bpf_for_each(mptcp_subflow) to traverse all subflows on the conn_list of
5
an MPTCP socket and then call kfunc to modify the fields of each subflow
5
an MPTCP socket and then call kfunc to modify the fields of each subflow
6
in the WIP MPTCP BPF packet scheduler examples, instead of converting them
6
in the WIP MPTCP BPF packet scheduler examples, instead of converting them
7
to a fixed array. With this helper, we can get rid of this subflow array
7
to a fixed array. With this helper, we can get rid of this subflow array
8
"contexts" and the size of it "subflows" in struct mptcp_sched_data.
8
"contexts" in struct mptcp_sched_data.
9
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
11
---
12
include/net/mptcp.h | 2 --
12
include/net/mptcp.h | 3 ---
13
1 file changed, 2 deletions(-)
13
1 file changed, 3 deletions(-)
14
14
15
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
15
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/net/mptcp.h
17
--- a/include/net/mptcp.h
18
+++ b/include/net/mptcp.h
18
+++ b/include/net/mptcp.h
19
@@ -XXX,XX +XXX,XX @@ struct mptcp_out_options {
19
@@ -XXX,XX +XXX,XX @@ struct mptcp_out_options {
20
20
#define MPTCP_SCHED_MAX        128
21
#define MPTCP_SCHED_BUF_MAX    (MPTCP_SCHED_NAME_MAX * MPTCP_SCHED_MAX)
22
23
-#define MPTCP_SUBFLOWS_MAX    8
24
-
21
struct mptcp_sched_data {
25
struct mptcp_sched_data {
22
    bool    reinject;
26
    u8    subflows;
23
-    u8    subflows;
24
-    struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
27
-    struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
25
};
28
};
26
29
27
struct mptcp_sched_ops {
30
struct mptcp_sched_ops {
28
--
31
--
29
2.43.0
32
2.43.0
diff view generated by jsdifflib