:p
atchew
Login
From: Geliang Tang <tanggeliang@kylinos.cn> Two cleanups for bpf schedulers. Geliang Tang (2): Squash to "bpf: Add bpf_mptcp_sched_ops" Squash to "selftests/bpf: Add bpf_burst scheduler & test" net/mptcp/bpf.c | 3 --- tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 5 +++-- 2 files changed, 3 insertions(+), 5 deletions(-) -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> The helper mptcp_subflow_set_scheduled() is used to update the scheduled flags of a subflow. BPF schedulers are not allowed to directly modify this flags. So the write access permission for this flag shouldn't be allow. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/bpf.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/bpf.c +++ b/net/mptcp/bpf.c @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log, } } else if (t == mptcp_subflow_type) { switch (off) { - case offsetof(struct mptcp_subflow_context, scheduled): - end = offsetofend(struct mptcp_subflow_context, scheduled); - break; case offsetof(struct mptcp_subflow_context, avg_pacing_rate): end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate); break; -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Use nr_active variable just like in mptcp_subflow_get_send(). Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow; struct sock *sk = (struct sock *)msk; __u32 pace, burst, wmem; + int i, nr_active = 0; __u64 linger_time; struct sock *ssk; - int i; /* pick the subflow with the lower wmem/wspace ratio */ for (i = 0; i < SSK_MODE_MAX; ++i) { @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, if (!mptcp_subflow_active(subflow)) continue; + nr_active += !backup; pace = subflow->avg_pacing_rate; if (!pace) { /* init pacing rate from socket */ @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, mptcp_set_timeout(sk); /* pick the best backup if no other subflow is active */ - if (send_info[SSK_MODE_ACTIVE].subflow_id == MPTCP_SUBFLOWS_MAX) + if (!nr_active) send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id; subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id); -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> v2: - include two more squash-to patches into this set. Two cleanups for bpf schedulers. Geliang Tang (4): Squash to "bpf: Add bpf_mptcp_sched_ops" Squash to "selftests/bpf: Add mptcp subflow subtest" Squash to "selftests/bpf: Add bpf scheduler test" Squash to "selftests/bpf: Add bpf_burst scheduler & test" net/mptcp/bpf.c | 3 --- tools/testing/selftests/bpf/prog_tests/mptcp.c | 10 +++++----- tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 5 +++-- 3 files changed, 8 insertions(+), 10 deletions(-) -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> The helper mptcp_subflow_set_scheduled() is used to update the scheduled flags of a subflow. BPF schedulers are not allowed to directly modify this flags. So the write access permission for this flag shouldn't be allow. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/bpf.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/bpf.c +++ b/net/mptcp/bpf.c @@ -XXX,XX +XXX,XX @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log, } } else if (t == mptcp_subflow_type) { switch (off) { - case offsetof(struct mptcp_subflow_context, scheduled): - end = offsetofend(struct mptcp_subflow_context, scheduled); - break; case offsetof(struct mptcp_subflow_context, avg_pacing_rate): end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate); break; -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Should use dedicated ASSERT_OK_FD() to check the fds. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- tools/testing/selftests/bpf/prog_tests/mptcp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ static void run_subflow(void) socklen_t len; server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0); - if (!ASSERT_GE(server_fd, 0, "start_mptcp_server")) + if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) return; client_fd = connect_to_fd(server_fd, 0); - if (!ASSERT_GE(client_fd, 0, "connect to fd")) + if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) goto close_server; send_byte(client_fd); @@ -XXX,XX +XXX,XX @@ static void test_subflow(void) struct bpf_link *link; cgroup_fd = test__join_cgroup("/mptcp_subflow"); - if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup: mptcp_subflow")) + if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup: mptcp_subflow")) return; skel = mptcp_subflow__open_and_load(); -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- tools/testing/selftests/bpf/prog_tests/mptcp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ static void send_data_and_verify(char *sched, bool addr1, bool addr2) unsigned int delta_ms; server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0); - if (CHECK(server_fd < 0, sched, "start_mptcp_server: %d\n", errno)) + if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) return; client_fd = connect_to_fd(server_fd, 0); - if (CHECK(client_fd < 0, sched, "connect_to_fd: %d\n", errno)) + if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) goto fail; if (clock_gettime(CLOCK_MONOTONIC, &start) < 0) -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Use nr_active variable just like in mptcp_subflow_get_send(). Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow; struct sock *sk = (struct sock *)msk; __u32 pace, burst, wmem; + int i, nr_active = 0; __u64 linger_time; struct sock *ssk; - int i; /* pick the subflow with the lower wmem/wspace ratio */ for (i = 0; i < SSK_MODE_MAX; ++i) { @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, if (!mptcp_subflow_active(subflow)) continue; + nr_active += !backup; pace = subflow->avg_pacing_rate; if (!pace) { /* init pacing rate from socket */ @@ -XXX,XX +XXX,XX @@ static int bpf_burst_get_send(struct mptcp_sock *msk, mptcp_set_timeout(sk); /* pick the best backup if no other subflow is active */ - if (send_info[SSK_MODE_ACTIVE].subflow_id == MPTCP_SUBFLOWS_MAX) + if (!nr_active) send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id; subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id); -- 2.43.0