1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | v4: | ||
4 | - CI reports the following BUILD_BUG_ON fails on i386: | ||
5 | |||
6 | BUILD_BUG_ON(sizeof(struct bpf_iter_mptcp_subflow_kern) != | ||
7 | sizeof(struct bpf_iter_mptcp_subflow)) | ||
8 | |||
9 | Just like in bpf_iter_task_new(), change this "!=" to ">". | ||
10 | |||
11 | v3: | ||
12 | - check sock_owned_by_user_nocheck(sk)/spin_is_locked(&sk->sk_lock.slock), | ||
13 | instead of lockdep_sock_is_held(sk). | ||
14 | - add "sizeof" and "alignof" checks. | ||
15 | - drop bpf_mptcp_sk() and bpf_mptcp_subflow_tcp_sock() definitions. Use | ||
16 | bpf_skc_to_mptcp_sock() and mptcp_subflow_tcp_sock() in mptcp_subflow | ||
17 | bpf_iter selftests instead. | ||
18 | |||
3 | v2: | 19 | v2: |
4 | - Drop bpf_skc_to_mptcp_sock | 20 | - add CONFIG_LOCKDEP check in patch 2 to fix the build error reported |
5 | - Check the owner before assigning the msk as Mat suggested. | 21 | by CI. |
6 | - Use bpf_core_cast() in mptcp_subflow bpf_iter subtest instead of | ||
7 | using bpf_skc_to_mptcp_sock(). | ||
8 | 22 | ||
9 | Address Martin's suggestions for v2. | 23 | Address Martin's comments in v1. |
10 | 24 | ||
11 | Geliang Tang (5): | 25 | Geliang Tang (5): |
12 | Revert "bpf: Extend bpf_skc_to_mptcp_sock to MPTCP sock" | 26 | mptcp: update bpf_mptcp_sock_from_subflow |
13 | Revert "bpf: Allow use of skc_to_mptcp_sock in cg_sockopt" | 27 | bpf: Allow use of skc_to_mptcp_sock in cg_sockopt |
28 | Squash to "bpf: Register mptcp common kfunc set" | ||
14 | Squash to "bpf: Add mptcp_subflow bpf_iter" | 29 | Squash to "bpf: Add mptcp_subflow bpf_iter" |
15 | Revert "bpf: Acquire and release mptcp socket" | ||
16 | Squash to "selftests/bpf: Add mptcp_subflow bpf_iter subtest" | 30 | Squash to "selftests/bpf: Add mptcp_subflow bpf_iter subtest" |
17 | 31 | ||
18 | include/net/mptcp.h | 4 +- | 32 | include/net/mptcp.h | 4 +-- |
19 | kernel/bpf/cgroup.c | 2 - | 33 | kernel/bpf/cgroup.c | 2 ++ |
20 | net/core/filter.c | 2 +- | 34 | net/core/filter.c | 2 +- |
21 | net/mptcp/bpf.c | 43 +++++-------------- | 35 | net/mptcp/bpf.c | 34 +++++++++---------- |
22 | .../testing/selftests/bpf/bpf_experimental.h | 2 +- | 36 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 1 - |
23 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 -- | 37 | .../selftests/bpf/progs/mptcp_bpf_iters.c | 11 +++--- |
24 | .../selftests/bpf/progs/mptcp_bpf_iters.c | 8 +--- | 38 | 6 files changed, 27 insertions(+), 27 deletions(-) |
25 | 7 files changed, 16 insertions(+), 48 deletions(-) | ||
26 | 39 | ||
27 | -- | 40 | -- |
28 | 2.43.0 | 41 | 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 | bpf_core_cast() can be used in mptcp_subflow bpf_iter selftests to get the | 3 | The input parameter of bpf_mptcp_sock_from_subflow() is an msk subsocket |
4 | msk, instead of using bpf_skc_to_mptcp_sock(). No need to add this patch | 4 | of type IPPROTO_TCP. This patch extends it to accept an IPPROTO_MPTCP |
5 | anymore, revert it. | 5 | socket. With this change, the function name bpf_mptcp_sock_from_subflow |
6 | is no longer appropriate, and it is renamed to bpf_mptcp_sock_from_sock. | ||
6 | 7 | ||
7 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
8 | --- | 9 | --- |
9 | include/net/mptcp.h | 4 ++-- | 10 | include/net/mptcp.h | 4 ++-- |
10 | net/core/filter.c | 2 +- | 11 | net/core/filter.c | 2 +- |
11 | net/mptcp/bpf.c | 10 ++-------- | 12 | net/mptcp/bpf.c | 4 +++- |
12 | 3 files changed, 5 insertions(+), 11 deletions(-) | 13 | 3 files changed, 6 insertions(+), 4 deletions(-) |
13 | 14 | ||
14 | 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 |
15 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/include/net/mptcp.h | 17 | --- a/include/net/mptcp.h |
17 | +++ b/include/net/mptcp.h | 18 | +++ b/include/net/mptcp.h |
18 | @@ -XXX,XX +XXX,XX @@ static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { } | 19 | @@ -XXX,XX +XXX,XX @@ static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { } |
19 | #endif | 20 | #endif |
20 | 21 | ||
21 | #if defined(CONFIG_MPTCP) && defined(CONFIG_BPF_SYSCALL) | 22 | #if defined(CONFIG_MPTCP) && defined(CONFIG_BPF_SYSCALL) |
22 | -struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk); | 23 | -struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk); |
23 | +struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk); | 24 | +struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk); |
24 | #else | 25 | #else |
25 | -static inline struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk) { return NULL; } | 26 | -static inline struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) { return NULL; } |
26 | +static inline struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) { return NULL; } | 27 | +static inline struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk) { return NULL; } |
27 | #endif | 28 | #endif |
28 | 29 | ||
29 | #if !IS_ENABLED(CONFIG_MPTCP) | 30 | #if !IS_ENABLED(CONFIG_MPTCP) |
30 | diff --git a/net/core/filter.c b/net/core/filter.c | 31 | diff --git a/net/core/filter.c b/net/core/filter.c |
31 | index XXXXXXX..XXXXXXX 100644 | 32 | index XXXXXXX..XXXXXXX 100644 |
32 | --- a/net/core/filter.c | 33 | --- a/net/core/filter.c |
33 | +++ b/net/core/filter.c | 34 | +++ b/net/core/filter.c |
34 | @@ -XXX,XX +XXX,XX @@ const struct bpf_func_proto bpf_skc_to_unix_sock_proto = { | 35 | @@ -XXX,XX +XXX,XX @@ const struct bpf_func_proto bpf_skc_to_unix_sock_proto = { |
35 | BPF_CALL_1(bpf_skc_to_mptcp_sock, struct sock *, sk) | 36 | BPF_CALL_1(bpf_skc_to_mptcp_sock, struct sock *, sk) |
36 | { | 37 | { |
37 | BTF_TYPE_EMIT(struct mptcp_sock); | 38 | BTF_TYPE_EMIT(struct mptcp_sock); |
38 | - return (unsigned long)bpf_mptcp_sock_from_sock(sk); | 39 | - return (unsigned long)bpf_mptcp_sock_from_subflow(sk); |
39 | + return (unsigned long)bpf_mptcp_sock_from_subflow(sk); | 40 | + return (unsigned long)bpf_mptcp_sock_from_sock(sk); |
40 | } | 41 | } |
41 | 42 | ||
42 | const struct bpf_func_proto bpf_skc_to_mptcp_sock_proto = { | 43 | const struct bpf_func_proto bpf_skc_to_mptcp_sock_proto = { |
43 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | 44 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c |
44 | index XXXXXXX..XXXXXXX 100644 | 45 | index XXXXXXX..XXXXXXX 100644 |
45 | --- a/net/mptcp/bpf.c | 46 | --- a/net/mptcp/bpf.c |
46 | +++ b/net/mptcp/bpf.c | 47 | +++ b/net/mptcp/bpf.c |
47 | @@ -XXX,XX +XXX,XX @@ static struct bpf_struct_ops bpf_mptcp_sched_ops = { | 48 | @@ -XXX,XX +XXX,XX @@ static struct bpf_struct_ops bpf_mptcp_sched_ops = { |
48 | }; | 49 | }; |
49 | #endif /* CONFIG_BPF_JIT */ | 50 | #endif /* CONFIG_BPF_JIT */ |
50 | 51 | ||
51 | -struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk) | 52 | -struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) |
52 | +struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) | 53 | +struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk) |
53 | { | 54 | { |
54 | - if (unlikely(!sk || !sk_fullsock(sk))) | 55 | + if (sk && sk_fullsock(sk) && sk->sk_protocol == IPPROTO_MPTCP) |
55 | - return NULL; | 56 | + return mptcp_sk(sk); |
56 | - | 57 | if (sk && sk_fullsock(sk) && sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) |
57 | - if (sk->sk_protocol == IPPROTO_MPTCP) | ||
58 | - return mptcp_sk(sk); | ||
59 | - | ||
60 | - if (sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) | ||
61 | + if (sk && sk_fullsock(sk) && sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk)) | ||
62 | return mptcp_sk(mptcp_subflow_ctx(sk)->conn); | 58 | return mptcp_sk(mptcp_subflow_ctx(sk)->conn); |
63 | 59 | ||
64 | return NULL; | ||
65 | -- | 60 | -- |
66 | 2.43.0 | 61 | 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 | bpf_core_cast() can be used in mptcp_subflow bpf_iter selftests to get the | 3 | Currently, bpf_skc_to_mptcp_sock() helper is not allowed to be used |
4 | msk, instead of using bpf_skc_to_mptcp_sock(). No need to add this patch | 4 | in cg_sockopt. This patch adds this permission. |
5 | anymore, revert it. | ||
6 | 5 | ||
7 | This reverts commit d8d42f5a4542c2dc31e4e00c58508a821c6ab789. | 6 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
8 | --- | 7 | --- |
9 | kernel/bpf/cgroup.c | 2 -- | 8 | kernel/bpf/cgroup.c | 2 ++ |
10 | 1 file changed, 2 deletions(-) | 9 | 1 file changed, 2 insertions(+) |
11 | 10 | ||
12 | diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c | 11 | diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c |
13 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/kernel/bpf/cgroup.c | 13 | --- a/kernel/bpf/cgroup.c |
15 | +++ b/kernel/bpf/cgroup.c | 14 | +++ b/kernel/bpf/cgroup.c |
16 | @@ -XXX,XX +XXX,XX @@ cg_sockopt_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | 15 | @@ -XXX,XX +XXX,XX @@ cg_sockopt_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) |
17 | #ifdef CONFIG_INET | 16 | #ifdef CONFIG_INET |
18 | case BPF_FUNC_tcp_sock: | 17 | case BPF_FUNC_tcp_sock: |
19 | return &bpf_tcp_sock_proto; | 18 | return &bpf_tcp_sock_proto; |
20 | - case BPF_FUNC_skc_to_mptcp_sock: | 19 | + case BPF_FUNC_skc_to_mptcp_sock: |
21 | - return &bpf_skc_to_mptcp_sock_proto; | 20 | + return &bpf_skc_to_mptcp_sock_proto; |
22 | #endif | 21 | #endif |
23 | case BPF_FUNC_perf_event_output: | 22 | case BPF_FUNC_perf_event_output: |
24 | return &bpf_event_output_data_proto; | 23 | return &bpf_event_output_data_proto; |
25 | -- | 24 | -- |
26 | 2.43.0 | 25 | 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 | Drop this patch as Martin suggested. | 3 | Drop bpf_mptcp_sk() and bpf_mptcp_subflow_tcp_sock() definitions. Use |
4 | bpf_skc_to_mptcp_sock() and mptcp_subflow_tcp_sock() in mptcp_subflow | ||
5 | bpf_iter selftests instead. | ||
6 | |||
7 | Address Martin's comments in v1: | ||
8 | |||
9 | - add null-check for bpf_mptcp_subflow_ctx. | ||
10 | - add KF_RET_NULL flags for bpf_mptcp_subflow_ctx. | ||
11 | - register this kfunc set to BPF_PROG_TYPE_CGROUP_SOCKOPT only, | ||
12 | not BPF_PROG_TYPE_UNSPEC. | ||
4 | 13 | ||
5 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 14 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
6 | --- | 15 | --- |
7 | net/mptcp/bpf.c | 19 ------------------- | 16 | net/mptcp/bpf.c | 20 +++++--------------- |
8 | 1 file changed, 19 deletions(-) | 17 | 1 file changed, 5 insertions(+), 15 deletions(-) |
9 | 18 | ||
10 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | 19 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c |
11 | index XXXXXXX..XXXXXXX 100644 | 20 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/net/mptcp/bpf.c | 21 | --- a/net/mptcp/bpf.c |
13 | +++ b/net/mptcp/bpf.c | 22 | +++ b/net/mptcp/bpf.c |
14 | @@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it) | 23 | @@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern { |
15 | { | 24 | |
16 | } | 25 | __bpf_kfunc_start_defs(); |
17 | 26 | ||
18 | -__bpf_kfunc static struct | 27 | -__bpf_kfunc static struct mptcp_sock *bpf_mptcp_sk(struct sock *sk) |
19 | -mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) | ||
20 | -{ | 28 | -{ |
21 | - struct sock *sk = (struct sock *)msk; | 29 | - return mptcp_sk(sk); |
22 | - | ||
23 | - if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) | ||
24 | - return msk; | ||
25 | - return NULL; | ||
26 | -} | 30 | -} |
27 | - | 31 | - |
28 | -__bpf_kfunc static void bpf_mptcp_sock_release(struct mptcp_sock *msk) | 32 | __bpf_kfunc static struct mptcp_subflow_context * |
33 | bpf_mptcp_subflow_ctx(const struct sock *sk) | ||
34 | { | ||
35 | - return mptcp_subflow_ctx(sk); | ||
36 | -} | ||
37 | + if (!sk) | ||
38 | + return NULL; | ||
39 | |||
40 | -__bpf_kfunc static struct sock * | ||
41 | -bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | ||
29 | -{ | 42 | -{ |
30 | - struct sock *sk = (struct sock *)msk; | 43 | - return mptcp_subflow_tcp_sock(subflow); |
31 | - | 44 | + return mptcp_subflow_ctx(sk); |
32 | - WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); | 45 | } |
33 | -} | 46 | |
34 | - | 47 | __bpf_kfunc static int |
35 | __bpf_kfunc struct mptcp_subflow_context * | 48 | @@ -XXX,XX +XXX,XX @@ __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) |
36 | bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) | 49 | __bpf_kfunc_end_defs(); |
37 | { | 50 | |
38 | @@ -XXX,XX +XXX,XX @@ BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL) | 51 | BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) |
52 | -BTF_ID_FLAGS(func, bpf_mptcp_sk) | ||
53 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx) | ||
54 | -BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock) | ||
55 | +BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL) | ||
39 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS) | 56 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS) |
40 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) | 57 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) |
41 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) | 58 | BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) |
42 | -BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL) | 59 | @@ -XXX,XX +XXX,XX @@ static int __init bpf_mptcp_kfunc_init(void) |
43 | -BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE) | 60 | int ret; |
44 | BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) | 61 | |
45 | 62 | ret = register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set); | |
46 | static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = { | 63 | - ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, |
64 | + ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT, | ||
65 | &bpf_mptcp_common_kfunc_set); | ||
66 | ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, | ||
67 | &bpf_mptcp_sched_kfunc_set); | ||
47 | -- | 68 | -- |
48 | 2.43.0 | 69 | 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 | Drop the NULL check as Martin suggested. | 3 | Add "sizeof" and "alignof" checks. |
4 | 4 | ||
5 | Use the "struct sock *sk" instead of "struct mptcp-sock *msk" as the | 5 | Address Martin's comments in v1: |
6 | argument in the bpf_iter_mptcp_subflow_new as Martin suggested. | ||
7 | 6 | ||
8 | Use msk_owned_by_me(). | 7 | - bpf_iter_mptcp_subflow_new returns -EINVAL when msk socket lock isn't |
9 | 8 | held. | |
10 | v2: | ||
11 | - check the owner before assigning the msk as Mat suggested. | ||
12 | 9 | ||
13 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
14 | --- | 11 | --- |
15 | net/mptcp/bpf.c | 14 ++++++++------ | 12 | net/mptcp/bpf.c | 10 +++++++++- |
16 | 1 file changed, 8 insertions(+), 6 deletions(-) | 13 | 1 file changed, 9 insertions(+), 1 deletion(-) |
17 | 14 | ||
18 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c | 15 | diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c |
19 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
20 | --- a/net/mptcp/bpf.c | 17 | --- a/net/mptcp/bpf.c |
21 | +++ b/net/mptcp/bpf.c | 18 | +++ b/net/mptcp/bpf.c |
22 | @@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk) | 19 | @@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it, |
23 | 20 | struct mptcp_sock *msk) | |
24 | __bpf_kfunc static int | ||
25 | bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it, | ||
26 | - struct mptcp_sock *msk) | ||
27 | + struct sock *sk) | ||
28 | { | 21 | { |
29 | struct bpf_iter_mptcp_subflow_kern *kit = (void *)it; | 22 | struct bpf_iter_mptcp_subflow_kern *kit = (void *)it; |
30 | - struct sock *sk = (struct sock *)msk; | 23 | + struct sock *sk = (struct sock *)msk; |
31 | + struct mptcp_sock *msk; | 24 | + |
32 | 25 | + BUILD_BUG_ON(sizeof(struct bpf_iter_mptcp_subflow_kern) > | |
33 | BUILD_BUG_ON(sizeof(struct bpf_iter_mptcp_subflow_kern) > | 26 | + sizeof(struct bpf_iter_mptcp_subflow)); |
34 | sizeof(struct bpf_iter_mptcp_subflow)); | 27 | + BUILD_BUG_ON(__alignof__(struct bpf_iter_mptcp_subflow_kern) != |
35 | BUILD_BUG_ON(__alignof__(struct bpf_iter_mptcp_subflow_kern) != | 28 | + __alignof__(struct bpf_iter_mptcp_subflow)); |
36 | __alignof__(struct bpf_iter_mptcp_subflow)); | 29 | |
37 | 30 | kit->msk = msk; | |
38 | - kit->msk = msk; | 31 | if (!msk) |
39 | - if (!msk) | ||
40 | + if (unlikely(!sk || !sk_fullsock(sk))) | ||
41 | return -EINVAL; | 32 | return -EINVAL; |
42 | 33 | ||
43 | - if (!sock_owned_by_user_nocheck(sk) && | 34 | - msk_owned_by_me(msk); |
44 | - !spin_is_locked(&sk->sk_lock.slock)) | 35 | + if (!sock_owned_by_user_nocheck(sk) && |
45 | + if (sk->sk_protocol != IPPROTO_MPTCP) | 36 | + !spin_is_locked(&sk->sk_lock.slock)) |
46 | return -EINVAL; | 37 | + return -EINVAL; |
47 | 38 | ||
48 | + msk = mptcp_sk(sk); | ||
49 | + msk_owned_by_me(msk); | ||
50 | + | ||
51 | + kit->msk = msk; | ||
52 | kit->pos = &msk->conn_list; | 39 | kit->pos = &msk->conn_list; |
53 | return 0; | 40 | return 0; |
54 | } | ||
55 | -- | 41 | -- |
56 | 2.43.0 | 42 | 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 | Use bpf_core_cast() instead of bpf_skc_to_mptcp_sock(). | 3 | Use bpf_skc_to_mptcp_sock() and mptcp_subflow_tcp_sock() instead of |
4 | Change the 2nd parameter type of bpf_for_each() as 'struct sock'. | 4 | bpf_mptcp_sk() and bpf_mptcp_subflow_tcp_sock(). |
5 | Drop bpf_mptcp_sock_acquire/release. | 5 | |
6 | IPPROTO_MPTCP is checked in bpf_skc_to_mptcp_sock(), no need to check | ||
7 | it in BPF program. | ||
8 | |||
9 | bpf_skc_to_mptcp_sock() and bpf_mptcp_subflow_ctx() may return NULL, | ||
10 | need to check the return values. | ||
6 | 11 | ||
7 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 12 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
8 | --- | 13 | --- |
9 | tools/testing/selftests/bpf/bpf_experimental.h | 2 +- | 14 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 1 - |
10 | tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --- | 15 | tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 11 +++++------ |
11 | tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 8 ++------ | 16 | 2 files changed, 5 insertions(+), 7 deletions(-) |
12 | 3 files changed, 3 insertions(+), 10 deletions(-) | ||
13 | 17 | ||
14 | diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/tools/testing/selftests/bpf/bpf_experimental.h | ||
17 | +++ b/tools/testing/selftests/bpf/bpf_experimental.h | ||
18 | @@ -XXX,XX +XXX,XX @@ extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; | ||
19 | |||
20 | struct bpf_iter_mptcp_subflow; | ||
21 | extern int bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it, | ||
22 | - struct mptcp_sock *msk) __weak __ksym; | ||
23 | + struct sock *sk) __weak __ksym; | ||
24 | extern struct mptcp_subflow_context * | ||
25 | bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it) __weak __ksym; | ||
26 | extern void | ||
27 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 18 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
28 | index XXXXXXX..XXXXXXX 100644 | 19 | index XXXXXXX..XXXXXXX 100644 |
29 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 20 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
30 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h | 21 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h |
31 | @@ -XXX,XX +XXX,XX @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | 22 | @@ -XXX,XX +XXX,XX @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) |
32 | } | 23 | extern struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) __ksym; |
33 | 24 | extern void bpf_mptcp_sock_release(struct mptcp_sock *msk) __ksym; | |
34 | /* ksym */ | 25 | |
35 | -extern struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) __ksym; | 26 | -extern struct mptcp_sock *bpf_mptcp_sk(struct sock *sk) __ksym; |
36 | -extern void bpf_mptcp_sock_release(struct mptcp_sock *msk) __ksym; | ||
37 | - | ||
38 | extern struct mptcp_subflow_context * | 27 | extern struct mptcp_subflow_context * |
39 | bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym; | 28 | bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym; |
40 | extern struct sock * | 29 | extern struct sock * |
41 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 30 | diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c |
42 | index XXXXXXX..XXXXXXX 100644 | 31 | index XXXXXXX..XXXXXXX 100644 |
43 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 32 | --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c |
44 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 33 | +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c |
45 | @@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx) | 34 | @@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx) |
46 | if (ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP) | 35 | struct mptcp_sock *msk; |
36 | int local_ids = 0; | ||
37 | |||
38 | - if (!sk || sk->protocol != IPPROTO_MPTCP || | ||
39 | - ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP) | ||
40 | + if (ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP) | ||
47 | return 1; | 41 | return 1; |
48 | 42 | ||
49 | - msk = bpf_skc_to_mptcp_sock(sk); | 43 | - msk = bpf_mptcp_sk((struct sock *)sk); |
50 | + msk = bpf_core_cast(sk, struct mptcp_sock); | 44 | - if (msk->pm.server_side || !msk->pm.subflows) |
51 | if (!msk || msk->pm.server_side || !msk->pm.subflows) | 45 | + msk = bpf_skc_to_mptcp_sock(sk); |
46 | + if (!msk || msk->pm.server_side || !msk->pm.subflows) | ||
52 | return 1; | 47 | return 1; |
53 | 48 | ||
54 | - msk = bpf_mptcp_sock_acquire(msk); | 49 | msk = bpf_mptcp_sock_acquire(msk); |
55 | - if (!msk) | ||
56 | - return 1; | ||
57 | - bpf_for_each(mptcp_subflow, subflow, msk) { | ||
58 | + bpf_for_each(mptcp_subflow, subflow, (struct sock *)sk) { | ||
59 | /* Here MPTCP-specific packet scheduler kfunc can be called: | ||
60 | * this test is not doing anything really useful, only to | ||
61 | * verify the iteration works. | ||
62 | @@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx) | 50 | @@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx) |
51 | local_ids += subflow->subflow_id; | ||
52 | |||
53 | /* only to check the following kfunc works */ | ||
54 | - ssk = bpf_mptcp_subflow_tcp_sock(subflow); | ||
55 | + ssk = mptcp_subflow_tcp_sock(subflow); | ||
56 | } | ||
57 | |||
58 | if (!ssk) | ||
59 | @@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx) | ||
60 | |||
61 | /* only to check the following kfunc works */ | ||
62 | subflow = bpf_mptcp_subflow_ctx(ssk); | ||
63 | - if (subflow->token != msk->token) | ||
64 | + if (!subflow || subflow->token != msk->token) | ||
65 | goto out; | ||
66 | |||
63 | ids = local_ids; | 67 | ids = local_ids; |
64 | |||
65 | out: | ||
66 | - bpf_mptcp_sock_release(msk); | ||
67 | return 1; | ||
68 | } | ||
69 | -- | 68 | -- |
70 | 2.43.0 | 69 | 2.45.2 | diff view generated by jsdifflib |