// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2026 Isovalent */ #include #include "test_progs.h" #include "ksock_wq.skel.h" #define CALLBACK_WAIT_RETRIES 1000 #define CALLBACK_WAIT_US 1000 void test_ksock_wq(void) { LIBBPF_OPTS(bpf_test_run_opts, opts); struct ksock_wq *skel; u32 callback_done; int err, i; skel = ksock_wq__open_and_load(); if (!ASSERT_OK_PTR(skel, "ksock_wq open and load")) return; err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.ksock_wq_start), &opts); if (!ASSERT_OK(err, "run ksock_wq_start")) goto out; if (!ASSERT_OK(opts.retval, "ksock_wq_start retval")) goto out; for (i = 0; i < CALLBACK_WAIT_RETRIES; i++) { if (__atomic_load_n(&skel->bss->callback_done, __ATOMIC_ACQUIRE)) break; usleep(CALLBACK_WAIT_US); } callback_done = __atomic_load_n(&skel->bss->callback_done, __ATOMIC_ACQUIRE); if (!ASSERT_EQ(callback_done, 1, "workqueue callback completed")) goto out; ASSERT_EQ(skel->bss->create_err, -EOPNOTSUPP, "workqueue create rejected"); out: ksock_wq__destroy(skel); }