Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'optimize-bpf-selftest-to-increase-ci-success-rate'

Jiayuan Chen says:

====================
Optimize bpf selftest to increase CI success rate

1. Optimized some static bound port selftests to avoid port occupation
when running test_progs -j.
2. Optimized the retry logic for test_maps.

Some Failed CI:
https://github.com/kernel-patches/bpf/actions/runs/13275542359/job/37064974076
https://github.com/kernel-patches/bpf/actions/runs/13549227497/job/37868926343
https://github.com/kernel-patches/bpf/actions/runs/13548089029/job/37865812030
https://github.com/kernel-patches/bpf/actions/runs/13553536268/job/37883329296
(Perhaps it's due to the large number of pull requests requiring CI runs?)
====================

Link: https://patch.msgid.link/20250227142646.59711-1-jiayuan.chen@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

+23 -12
+6 -3
tools/testing/selftests/bpf/prog_tests/bpf_nf.c
··· 72 72 if (!ASSERT_OK(system(cmd), cmd)) 73 73 goto end; 74 74 75 - srv_port = (mode == TEST_XDP) ? 5005 : 5006; 76 - srv_fd = start_server(AF_INET, SOCK_STREAM, "127.0.0.1", srv_port, TIMEOUT_MS); 75 + srv_fd = start_server(AF_INET, SOCK_STREAM, "127.0.0.1", 0, TIMEOUT_MS); 77 76 if (!ASSERT_GE(srv_fd, 0, "start_server")) 77 + goto end; 78 + 79 + srv_port = get_socket_local_port(srv_fd); 80 + if (!ASSERT_GE(srv_port, 0, "get_sock_local_port")) 78 81 goto end; 79 82 80 83 client_fd = connect_to_server(srv_fd); ··· 94 91 skel->bss->saddr = peer_addr.sin_addr.s_addr; 95 92 skel->bss->sport = peer_addr.sin_port; 96 93 skel->bss->daddr = peer_addr.sin_addr.s_addr; 97 - skel->bss->dport = htons(srv_port); 94 + skel->bss->dport = srv_port; 98 95 99 96 if (mode == TEST_XDP) 100 97 prog_fd = bpf_program__fd(skel->progs.nf_xdp_ct_test);
+9 -4
tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c
··· 10 10 static int run_test(int cgroup_fd, int server_fd, bool classid) 11 11 { 12 12 struct connect4_dropper *skel; 13 - int fd, err = 0; 13 + int fd, err = 0, port; 14 14 15 15 skel = connect4_dropper__open_and_load(); 16 16 if (!ASSERT_OK_PTR(skel, "skel_open")) 17 17 return -1; 18 + 19 + port = get_socket_local_port(server_fd); 20 + if (!ASSERT_GE(port, 0, "get_socket_local_port")) 21 + return -1; 22 + 23 + skel->bss->port = ntohs(port); 18 24 19 25 skel->links.connect_v4_dropper = 20 26 bpf_program__attach_cgroup(skel->progs.connect_v4_dropper, ··· 54 48 { 55 49 struct network_helper_opts opts = {}; 56 50 int server_fd, client_fd, cgroup_fd; 57 - static const int port = 60120; 58 51 59 52 /* Step 1: Check base connectivity works without any BPF. */ 60 - server_fd = start_server(AF_INET, SOCK_STREAM, NULL, port, 0); 53 + server_fd = start_server(AF_INET, SOCK_STREAM, NULL, 0, 0); 61 54 if (!ASSERT_GE(server_fd, 0, "server_fd")) 62 55 return; 63 56 client_fd = connect_to_fd_opts(server_fd, &opts); ··· 71 66 cgroup_fd = test__join_cgroup("/connect_dropper"); 72 67 if (!ASSERT_GE(cgroup_fd, 0, "cgroup_fd")) 73 68 return; 74 - server_fd = start_server(AF_INET, SOCK_STREAM, NULL, port, 0); 69 + server_fd = start_server(AF_INET, SOCK_STREAM, NULL, 0, 0); 75 70 if (!ASSERT_GE(server_fd, 0, "server_fd")) { 76 71 close(cgroup_fd); 77 72 return;
+3 -1
tools/testing/selftests/bpf/progs/connect4_dropper.c
··· 13 13 #define VERDICT_REJECT 0 14 14 #define VERDICT_PROCEED 1 15 15 16 + int port; 17 + 16 18 SEC("cgroup/connect4") 17 19 int connect_v4_dropper(struct bpf_sock_addr *ctx) 18 20 { 19 21 if (ctx->type != SOCK_STREAM) 20 22 return VERDICT_PROCEED; 21 - if (ctx->user_port == bpf_htons(60120)) 23 + if (ctx->user_port == bpf_htons(port)) 22 24 return VERDICT_REJECT; 23 25 return VERDICT_PROCEED; 24 26 }
+5 -4
tools/testing/selftests/bpf/test_maps.c
··· 1396 1396 #define MAX_DELAY_US 50000 1397 1397 #define MIN_DELAY_RANGE_US 5000 1398 1398 1399 - static bool retry_for_again_or_busy(int err) 1399 + static bool can_retry(int err) 1400 1400 { 1401 - return (err == EAGAIN || err == EBUSY); 1401 + return (err == EAGAIN || err == EBUSY || 1402 + (err == ENOMEM && map_opts.map_flags == BPF_F_NO_PREALLOC)); 1402 1403 } 1403 1404 1404 1405 int map_update_retriable(int map_fd, const void *key, const void *value, int flags, int attempts, ··· 1452 1451 1453 1452 if (do_update) { 1454 1453 err = map_update_retriable(fd, &key, &value, BPF_NOEXIST, MAP_RETRIES, 1455 - retry_for_again_or_busy); 1454 + can_retry); 1456 1455 if (err) 1457 1456 printf("error %d %d\n", err, errno); 1458 1457 assert(err == 0); 1459 1458 err = map_update_retriable(fd, &key, &value, BPF_EXIST, MAP_RETRIES, 1460 - retry_for_again_or_busy); 1459 + can_retry); 1461 1460 if (err) 1462 1461 printf("error %d %d\n", err, errno); 1463 1462 assert(err == 0);