selftests/bpf: Fix wq test.
authorAlexei Starovoitov <ast@kernel.org>
Wed, 24 Apr 2024 20:57:18 +0000 (13:57 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 24 Apr 2024 21:05:05 +0000 (14:05 -0700)
The wq test was missing destroy(skel) part which was causing bpf progs to stay
loaded. That was causing test_progs to complain with
"Failed to unload bpf_testmod.ko from kernel: -11" message, but adding
destroy() wasn't enough, since wq callback may be delayed, so loop on unload of
bpf_testmod if errno is EAGAIN.

Acked-by: Andrii Nakryiko <andrii@kernel.org>
Fixes: 8290dba51910 ("selftests/bpf: wq: add bpf_wq_start() checks")
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/wq.c
tools/testing/selftests/bpf/testing_helpers.c

index 8a4a91d944ccc76c01639738daa4161287c68f46..c4bacd3160e192d32945219a0fb7119a99c007f1 100644 (file)
@@ -31,6 +31,7 @@ void serial_test_wq(void)
        usleep(50); /* 10 usecs should be enough, but give it extra */
 
        ASSERT_EQ(wq_skel->bss->ok_sleepable, (1 << 1), "ok_sleepable");
+       wq__destroy(wq_skel);
 }
 
 void serial_test_failures_wq(void)
index 28b6646662af657dc7a5856170ed49176d62f40f..d5379a0e6da8043878b6e40f33011071fe3445ea 100644 (file)
@@ -368,9 +368,23 @@ int delete_module(const char *name, int flags)
 
 int unload_bpf_testmod(bool verbose)
 {
+       int ret, cnt = 0;
+
        if (kern_sync_rcu())
                fprintf(stdout, "Failed to trigger kernel-side RCU sync!\n");
-       if (delete_module("bpf_testmod", 0)) {
+
+       for (;;) {
+               ret = delete_module("bpf_testmod", 0);
+               if (!ret || errno != EAGAIN)
+                       break;
+               if (++cnt > 10000) {
+                       fprintf(stdout, "Unload of bpf_testmod timed out\n");
+                       break;
+               }
+               usleep(100);
+       }
+
+       if (ret) {
                if (errno == ENOENT) {
                        if (verbose)
                                fprintf(stdout, "bpf_testmod.ko is already unloaded.\n");