0001
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 }