0001
0002
0003 #define _GNU_SOURCE
0004 #include <pthread.h>
0005 #include <sched.h>
0006 #include <test_progs.h>
0007 #include "test_perf_link.skel.h"
0008
0009 static void burn_cpu(void)
0010 {
0011 volatile int j = 0;
0012 cpu_set_t cpu_set;
0013 int i, err;
0014
0015
0016 CPU_ZERO(&cpu_set);
0017 CPU_SET(0, &cpu_set);
0018 err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set), &cpu_set);
0019 ASSERT_OK(err, "set_thread_affinity");
0020
0021
0022 for (i = 0; i < 1000000; ++i)
0023 ++j;
0024 }
0025
0026
0027 void serial_test_perf_link(void)
0028 {
0029 struct test_perf_link *skel = NULL;
0030 struct perf_event_attr attr;
0031 int pfd = -1, link_fd = -1, err;
0032 int run_cnt_before, run_cnt_after;
0033 struct bpf_link_info info;
0034 __u32 info_len = sizeof(info);
0035
0036
0037 memset(&attr, 0, sizeof(attr));
0038 attr.size = sizeof(attr);
0039 attr.type = PERF_TYPE_SOFTWARE;
0040 attr.config = PERF_COUNT_SW_CPU_CLOCK;
0041 attr.freq = 1;
0042 attr.sample_freq = 1000;
0043 pfd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, PERF_FLAG_FD_CLOEXEC);
0044 if (!ASSERT_GE(pfd, 0, "perf_fd"))
0045 goto cleanup;
0046
0047 skel = test_perf_link__open_and_load();
0048 if (!ASSERT_OK_PTR(skel, "skel_load"))
0049 goto cleanup;
0050
0051 link_fd = bpf_link_create(bpf_program__fd(skel->progs.handler), pfd,
0052 BPF_PERF_EVENT, NULL);
0053 if (!ASSERT_GE(link_fd, 0, "link_fd"))
0054 goto cleanup;
0055
0056 memset(&info, 0, sizeof(info));
0057 err = bpf_obj_get_info_by_fd(link_fd, &info, &info_len);
0058 if (!ASSERT_OK(err, "link_get_info"))
0059 goto cleanup;
0060
0061 ASSERT_EQ(info.type, BPF_LINK_TYPE_PERF_EVENT, "link_type");
0062 ASSERT_GT(info.id, 0, "link_id");
0063 ASSERT_GT(info.prog_id, 0, "link_prog_id");
0064
0065
0066 burn_cpu();
0067 ASSERT_GT(skel->bss->run_cnt, 0, "run_cnt");
0068
0069
0070
0071
0072 close(link_fd);
0073 link_fd = -1;
0074
0075
0076 kern_sync_rcu();
0077
0078 run_cnt_before = skel->bss->run_cnt;
0079 burn_cpu();
0080 run_cnt_after = skel->bss->run_cnt;
0081
0082 ASSERT_EQ(run_cnt_before, run_cnt_after, "run_cnt_before_after");
0083
0084 cleanup:
0085 if (link_fd >= 0)
0086 close(link_fd);
0087 if (pfd >= 0)
0088 close(pfd);
0089 test_perf_link__destroy(skel);
0090 }