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