1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2026 Isovalent */
3
4 #include <unistd.h>
5
6 #include "test_progs.h"
7 #include "ksock_wq.skel.h"
8
9 #define CALLBACK_WAIT_RETRIES 1000
10 #define CALLBACK_WAIT_US 1000
11
test_ksock_wq(void)12 void test_ksock_wq(void)
13 {
14 LIBBPF_OPTS(bpf_test_run_opts, opts);
15 struct ksock_wq *skel;
16 u32 callback_done;
17 int err, i;
18
19 skel = ksock_wq__open_and_load();
20 if (!ASSERT_OK_PTR(skel, "ksock_wq open and load"))
21 return;
22
23 err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.ksock_wq_start),
24 &opts);
25 if (!ASSERT_OK(err, "run ksock_wq_start"))
26 goto out;
27 if (!ASSERT_OK(opts.retval, "ksock_wq_start retval"))
28 goto out;
29
30 for (i = 0; i < CALLBACK_WAIT_RETRIES; i++) {
31 if (__atomic_load_n(&skel->bss->callback_done, __ATOMIC_ACQUIRE))
32 break;
33 usleep(CALLBACK_WAIT_US);
34 }
35 callback_done = __atomic_load_n(&skel->bss->callback_done,
36 __ATOMIC_ACQUIRE);
37 if (!ASSERT_EQ(callback_done, 1, "workqueue callback completed"))
38 goto out;
39
40 ASSERT_EQ(skel->bss->create_err, -EOPNOTSUPP,
41 "workqueue create rejected");
42
43 out:
44 ksock_wq__destroy(skel);
45 }
46