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