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

selftests/bpf: Remove "&>" usage in the selftests

In s390, CI reported that the sock_iter_batch selftest
hits this error very often:

2024-01-26T16:56:49.3091804Z Bind /proc/self/ns/net -> /run/netns/sock_iter_batch_netns failed: No such file or directory
2024-01-26T16:56:49.3149524Z Cannot remove namespace file "/run/netns/sock_iter_batch_netns": No such file or directory
2024-01-26T16:56:49.3772213Z test_sock_iter_batch:FAIL:ip netns add sock_iter_batch_netns unexpected error: 256 (errno 0)

It happens very often in s390 but Manu also noticed it happens very
sparsely in other arch also.

It turns out the default dash shell does not recognize "&>"
as a redirection operator, so the command went to the background.
In the sock_iter_batch selftest, the "ip netns delete" went
into background and then race with the following "ip netns add"
command.

This patch replaces the "&> /dev/null" usage with ">/dev/null 2>&1"
and does this redirection in the SYS_NOFAIL macro instead of doing
it individually by its caller. The SYS_NOFAIL callers do not care
about failure, so it is no harm to do this redirection even if
some of the existing callers do not redirect to /dev/null now.

It touches different test files, so I skipped the Fixes tags
in this patch. Some of the changed tests do not use "&>"
but they use the SYS_NOFAIL, so these tests are also
changed to avoid doing its own redirection because
SYS_NOFAIL does it internally now.

Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20240127025017.950825-1-martin.lau@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Martin KaFai Lau and committed by
Alexei Starovoitov
fbaf59a9 add9c58c

+25 -20
+1 -1
tools/testing/selftests/bpf/prog_tests/decap_sanity.c
··· 72 72 bpf_tc_hook_destroy(&qdisc_hook); 73 73 close_netns(nstoken); 74 74 } 75 - SYS_NOFAIL("ip netns del " NS_TEST " &> /dev/null"); 75 + SYS_NOFAIL("ip netns del " NS_TEST); 76 76 decap_sanity__destroy(skel); 77 77 }
+1 -1
tools/testing/selftests/bpf/prog_tests/fib_lookup.c
··· 298 298 fail: 299 299 if (nstoken) 300 300 close_netns(nstoken); 301 - SYS_NOFAIL("ip netns del " NS_TEST " &> /dev/null"); 301 + SYS_NOFAIL("ip netns del " NS_TEST); 302 302 fib_lookup__destroy(skel); 303 303 }
+2 -2
tools/testing/selftests/bpf/prog_tests/ip_check_defrag.c
··· 59 59 /* Wait for up to 5s for links to come up */ 60 60 for (i = 0; i < 5; ++i) { 61 61 if (ipv6) 62 - up = !system("ip netns exec " NS0 " ping -6 -c 1 -W 1 " VETH1_ADDR6 " &>/dev/null"); 62 + up = !SYS_NOFAIL("ip netns exec " NS0 " ping -6 -c 1 -W 1 " VETH1_ADDR6); 63 63 else 64 - up = !system("ip netns exec " NS0 " ping -c 1 -W 1 " VETH1_ADDR " &>/dev/null"); 64 + up = !SYS_NOFAIL("ip netns exec " NS0 " ping -c 1 -W 1 " VETH1_ADDR); 65 65 66 66 if (up) 67 67 break;
+1 -1
tools/testing/selftests/bpf/prog_tests/lwt_redirect.c
··· 85 85 snprintf(ip, sizeof(ip), "20.0.0.%d", link_index); 86 86 87 87 /* We won't get a reply. Don't fail here */ 88 - SYS_NOFAIL("ping %s -c1 -W1 -s %d >/dev/null 2>&1", 88 + SYS_NOFAIL("ping %s -c1 -W1 -s %d", 89 89 ip, ICMP_PAYLOAD_SIZE); 90 90 } 91 91
+1 -1
tools/testing/selftests/bpf/prog_tests/lwt_reroute.c
··· 63 63 static void ping_once(const char *ip) 64 64 { 65 65 /* We won't get a reply. Don't fail here */ 66 - SYS_NOFAIL("ping %s -c1 -W1 -s %d >/dev/null 2>&1", 66 + SYS_NOFAIL("ping %s -c1 -W1 -s %d", 67 67 ip, ICMP_PAYLOAD_SIZE); 68 68 } 69 69
+1 -1
tools/testing/selftests/bpf/prog_tests/mptcp.c
··· 79 79 if (nstoken) 80 80 close_netns(nstoken); 81 81 82 - SYS_NOFAIL("ip netns del %s &> /dev/null", NS_TEST); 82 + SYS_NOFAIL("ip netns del %s", NS_TEST); 83 83 } 84 84 85 85 static int verify_tsk(int map_fd, int client_fd)
+1 -1
tools/testing/selftests/bpf/prog_tests/sock_destroy.c
··· 214 214 cleanup: 215 215 if (nstoken) 216 216 close_netns(nstoken); 217 - SYS_NOFAIL("ip netns del " TEST_NS " &> /dev/null"); 217 + SYS_NOFAIL("ip netns del " TEST_NS); 218 218 if (cgroup_fd >= 0) 219 219 close(cgroup_fd); 220 220 sock_destroy_prog__destroy(skel);
+2 -2
tools/testing/selftests/bpf/prog_tests/sock_iter_batch.c
··· 112 112 { 113 113 struct nstoken *nstoken = NULL; 114 114 115 - SYS_NOFAIL("ip netns del " TEST_NS " &> /dev/null"); 115 + SYS_NOFAIL("ip netns del " TEST_NS); 116 116 SYS(done, "ip netns add %s", TEST_NS); 117 117 SYS(done, "ip -net %s link set dev lo up", TEST_NS); 118 118 ··· 131 131 close_netns(nstoken); 132 132 133 133 done: 134 - SYS_NOFAIL("ip netns del " TEST_NS " &> /dev/null"); 134 + SYS_NOFAIL("ip netns del " TEST_NS); 135 135 }
+9 -9
tools/testing/selftests/bpf/prog_tests/test_tunnel.c
··· 118 118 static void cleanup(void) 119 119 { 120 120 SYS_NOFAIL("test -f /var/run/netns/at_ns0 && ip netns delete at_ns0"); 121 - SYS_NOFAIL("ip link del veth1 2> /dev/null"); 122 - SYS_NOFAIL("ip link del %s 2> /dev/null", VXLAN_TUNL_DEV1); 123 - SYS_NOFAIL("ip link del %s 2> /dev/null", IP6VXLAN_TUNL_DEV1); 121 + SYS_NOFAIL("ip link del veth1"); 122 + SYS_NOFAIL("ip link del %s", VXLAN_TUNL_DEV1); 123 + SYS_NOFAIL("ip link del %s", IP6VXLAN_TUNL_DEV1); 124 124 } 125 125 126 126 static int add_vxlan_tunnel(void) ··· 265 265 static void delete_ipip_tunnel(void) 266 266 { 267 267 SYS_NOFAIL("ip -n at_ns0 link delete dev %s", IPIP_TUNL_DEV0); 268 - SYS_NOFAIL("ip -n at_ns0 fou del port 5555 2> /dev/null"); 268 + SYS_NOFAIL("ip -n at_ns0 fou del port 5555"); 269 269 SYS_NOFAIL("ip link delete dev %s", IPIP_TUNL_DEV1); 270 - SYS_NOFAIL("ip fou del port 5555 2> /dev/null"); 270 + SYS_NOFAIL("ip fou del port 5555"); 271 271 } 272 272 273 273 static int add_xfrm_tunnel(void) ··· 346 346 347 347 static void delete_xfrm_tunnel(void) 348 348 { 349 - SYS_NOFAIL("ip xfrm policy delete dir out src %s/32 dst %s/32 2> /dev/null", 349 + SYS_NOFAIL("ip xfrm policy delete dir out src %s/32 dst %s/32", 350 350 IP4_ADDR_TUNL_DEV1, IP4_ADDR_TUNL_DEV0); 351 - SYS_NOFAIL("ip xfrm policy delete dir in src %s/32 dst %s/32 2> /dev/null", 351 + SYS_NOFAIL("ip xfrm policy delete dir in src %s/32 dst %s/32", 352 352 IP4_ADDR_TUNL_DEV0, IP4_ADDR_TUNL_DEV1); 353 - SYS_NOFAIL("ip xfrm state delete src %s dst %s proto esp spi %d 2> /dev/null", 353 + SYS_NOFAIL("ip xfrm state delete src %s dst %s proto esp spi %d", 354 354 IP4_ADDR_VETH0, IP4_ADDR1_VETH1, XFRM_SPI_IN_TO_OUT); 355 - SYS_NOFAIL("ip xfrm state delete src %s dst %s proto esp spi %d 2> /dev/null", 355 + SYS_NOFAIL("ip xfrm state delete src %s dst %s proto esp spi %d", 356 356 IP4_ADDR1_VETH1, IP4_ADDR_VETH0, XFRM_SPI_OUT_TO_IN); 357 357 } 358 358
+6 -1
tools/testing/selftests/bpf/test_progs.h
··· 385 385 goto goto_label; \ 386 386 }) 387 387 388 + #define ALL_TO_DEV_NULL " >/dev/null 2>&1" 389 + 388 390 #define SYS_NOFAIL(fmt, ...) \ 389 391 ({ \ 390 392 char cmd[1024]; \ 391 - snprintf(cmd, sizeof(cmd), fmt, ##__VA_ARGS__); \ 393 + int n; \ 394 + n = snprintf(cmd, sizeof(cmd), fmt, ##__VA_ARGS__); \ 395 + if (n < sizeof(cmd) && sizeof(cmd) - n >= sizeof(ALL_TO_DEV_NULL)) \ 396 + strcat(cmd, ALL_TO_DEV_NULL); \ 392 397 system(cmd); \ 393 398 }) 394 399