Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <test_progs.h>
0003 #include <network_helpers.h>
0004 
0005 static void *spin_lock_thread(void *arg)
0006 {
0007     int err, prog_fd = *(u32 *) arg;
0008     LIBBPF_OPTS(bpf_test_run_opts, topts,
0009         .data_in = &pkt_v4,
0010         .data_size_in = sizeof(pkt_v4),
0011         .repeat = 10000,
0012     );
0013 
0014     err = bpf_prog_test_run_opts(prog_fd, &topts);
0015     ASSERT_OK(err, "test_run");
0016     ASSERT_OK(topts.retval, "test_run retval");
0017     pthread_exit(arg);
0018 }
0019 
0020 void test_spinlock(void)
0021 {
0022     const char *file = "./test_spin_lock.o";
0023     pthread_t thread_id[4];
0024     struct bpf_object *obj = NULL;
0025     int prog_fd;
0026     int err = 0, i;
0027     void *ret;
0028 
0029     err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
0030     if (CHECK_FAIL(err)) {
0031         printf("test_spin_lock:bpf_prog_test_load errno %d\n", errno);
0032         goto close_prog;
0033     }
0034     for (i = 0; i < 4; i++)
0035         if (CHECK_FAIL(pthread_create(&thread_id[i], NULL,
0036                           &spin_lock_thread, &prog_fd)))
0037             goto close_prog;
0038 
0039     for (i = 0; i < 4; i++)
0040         if (CHECK_FAIL(pthread_join(thread_id[i], &ret) ||
0041                    ret != (void *)&prog_fd))
0042             goto close_prog;
0043 close_prog:
0044     bpf_object__close(obj);
0045 }