1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
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().
2
8
3
Address Martin's suggestions for v2.
9
Address Martin's suggestions for v2.
4
10
5
Geliang Tang (3):
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"
6
Squash to "bpf: Add mptcp_subflow bpf_iter"
14
Squash to "bpf: Add mptcp_subflow bpf_iter"
7
Revert "bpf: Acquire and release mptcp socket"
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 | 34 +++++--------------
18
include/net/mptcp.h | 4 +-
19
kernel/bpf/cgroup.c | 2 -
20
net/core/filter.c | 2 +-
21
net/mptcp/bpf.c | 43 +++++--------------
11
.../testing/selftests/bpf/bpf_experimental.h | 2 +-
22
.../testing/selftests/bpf/bpf_experimental.h | 2 +-
12
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --
23
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --
13
.../selftests/bpf/progs/mptcp_bpf_iters.c | 6 +---
24
.../selftests/bpf/progs/mptcp_bpf_iters.c | 8 +---
14
4 files changed, 11 insertions(+), 34 deletions(-)
25
7 files changed, 16 insertions(+), 48 deletions(-)
15
26
16
--
27
--
17
2.43.0
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
...
...
5
Use the "struct sock *sk" instead of "struct mptcp-sock *msk" as the
5
Use the "struct sock *sk" instead of "struct mptcp-sock *msk" as the
6
argument in the bpf_iter_mptcp_subflow_new as Martin suggested.
6
argument in the bpf_iter_mptcp_subflow_new as Martin suggested.
7
7
8
Use msk_owned_by_me().
8
Use msk_owned_by_me().
9
9
10
v2:
11
- check the owner before assigning the msk as Mat suggested.
12
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
14
---
12
net/mptcp/bpf.c | 15 +++++++++------
15
net/mptcp/bpf.c | 14 ++++++++------
13
1 file changed, 9 insertions(+), 6 deletions(-)
16
1 file changed, 8 insertions(+), 6 deletions(-)
14
17
15
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
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/bpf.c
20
--- a/net/mptcp/bpf.c
18
+++ b/net/mptcp/bpf.c
21
+++ b/net/mptcp/bpf.c
...
...
41
-     !spin_is_locked(&sk->sk_lock.slock))
44
-     !spin_is_locked(&sk->sk_lock.slock))
42
+    if (sk->sk_protocol != IPPROTO_MPTCP)
45
+    if (sk->sk_protocol != IPPROTO_MPTCP)
43
        return -EINVAL;
46
        return -EINVAL;
44
47
45
+    msk = mptcp_sk(sk);
48
+    msk = mptcp_sk(sk);
46
+    kit->msk = msk;
47
+
48
+    msk_owned_by_me(msk);
49
+    msk_owned_by_me(msk);
49
+
50
+
51
+    kit->msk = msk;
50
    kit->pos = &msk->conn_list;
52
    kit->pos = &msk->conn_list;
51
    return 0;
53
    return 0;
52
}
54
}
53
--
55
--
54
2.43.0
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
Drop this patch as Martin suggested.
3
Drop this patch as Martin suggested.
4
4
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
---
6
---
7
net/mptcp/bpf.c | 19 -------------------
7
net/mptcp/bpf.c | 19 -------------------
8
1 file changed, 19 deletions(-)
8
1 file changed, 19 deletions(-)
9
9
10
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
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/net/mptcp/bpf.c
12
--- a/net/mptcp/bpf.c
13
+++ b/net/mptcp/bpf.c
13
+++ b/net/mptcp/bpf.c
14
@@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
14
@@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
15
{
15
{
16
}
16
}
17
17
18
-__bpf_kfunc static struct
18
-__bpf_kfunc static struct
19
-mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk)
19
-mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk)
20
-{
20
-{
21
-    struct sock *sk = (struct sock *)msk;
21
-    struct sock *sk = (struct sock *)msk;
22
-
22
-
23
-    if (sk && refcount_inc_not_zero(&sk->sk_refcnt))
23
-    if (sk && refcount_inc_not_zero(&sk->sk_refcnt))
24
-        return msk;
24
-        return msk;
25
-    return NULL;
25
-    return NULL;
26
-}
26
-}
27
-
27
-
28
-__bpf_kfunc static void bpf_mptcp_sock_release(struct mptcp_sock *msk)
28
-__bpf_kfunc static void bpf_mptcp_sock_release(struct mptcp_sock *msk)
29
-{
29
-{
30
-    struct sock *sk = (struct sock *)msk;
30
-    struct sock *sk = (struct sock *)msk;
31
-
31
-
32
-    WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
32
-    WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
33
-}
33
-}
34
-
34
-
35
__bpf_kfunc struct mptcp_subflow_context *
35
__bpf_kfunc struct mptcp_subflow_context *
36
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
36
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
37
{
37
{
38
@@ -XXX,XX +XXX,XX @@ BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL)
38
@@ -XXX,XX +XXX,XX @@ 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)
39
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)
40
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)
41
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)
42
-BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL)
43
-BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE)
43
-BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE)
44
BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
44
BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
45
45
46
static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
46
static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
47
--
47
--
48
2.43.0
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
Use bpf_core_cast() instead of bpf_skc_to_mptcp_sock().
4
Change the 2nd parameter type of bpf_for_each() as 'struct sock'.
3
Drop bpf_mptcp_sock_acquire/release.
5
Drop bpf_mptcp_sock_acquire/release.
4
6
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
---
8
---
7
tools/testing/selftests/bpf/bpf_experimental.h | 2 +-
9
tools/testing/selftests/bpf/bpf_experimental.h | 2 +-
8
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 ---
10
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 ---
9
tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 6 +-----
11
tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 8 ++------
10
3 files changed, 2 insertions(+), 9 deletions(-)
12
3 files changed, 3 insertions(+), 10 deletions(-)
11
13
12
diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
14
diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/tools/testing/selftests/bpf/bpf_experimental.h
16
--- a/tools/testing/selftests/bpf/bpf_experimental.h
15
+++ b/tools/testing/selftests/bpf/bpf_experimental.h
17
+++ b/tools/testing/selftests/bpf/bpf_experimental.h
...
...
39
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
40
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
41
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
43
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
42
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
44
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
43
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
45
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
46
    if (ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP)
47
        return 1;
48
49
-    msk = bpf_skc_to_mptcp_sock(sk);
50
+    msk = bpf_core_cast(sk, struct mptcp_sock);
44
    if (!msk || msk->pm.server_side || !msk->pm.subflows)
51
    if (!msk || msk->pm.server_side || !msk->pm.subflows)
45
        return 1;
52
        return 1;
46
53
47
-    msk = bpf_mptcp_sock_acquire(msk);
54
-    msk = bpf_mptcp_sock_acquire(msk);
48
-    if (!msk)
55
-    if (!msk)
...
...
diff view generated by jsdifflib